Java基础/面试题

(针对某一部分常见的面试题或重点提问)

1.谈谈Java面向对象的理解(面向对象的三大特性),与面向过程的对比?

(1)对面向对象的理解:面向对象是将现实世界某一具体的事物抽象成一类事物,每一个具体的事物是这一类事物的一个实例对象。
(2)面向对象的三大特性:封装、继承、多态。
①封装:是指将对象的属性和实现细节隐藏起来,通过对象的共有方法暴露对象的功能、访问对象的属性。
②继承:子类通过继承父类,来拥有父类的所有属性和方法,实现软件复用。(对于私有属性、私有方法只能拥有,无法访问。)
③多态:指一个对象在调用同一个方法时可能会有不同的行为特征,分为运行时多态(如重写)和编译时多态(如重载)。
(3)面向过程:关注实现的函数的调用,指的是对调用的函数的过程。耦合性高、复用性差、拓展难。

2.关键字:static、final、super、transient

(1)static:可以用来修饰变量(静态变量/类变量)、方法(静态方法/类方法)、类;可以直接通过类调用访问类变量、类方法,类变量和类方法属于类,不属于任何类的实例对象。
(2)final:可以用来修饰变量(常量)、方法、类。修饰的变量即为常量(值不可以修改,如果是引用类型,引用的对象地址不可以改变,但是对象可以改变),修饰的方法不可以被重写,修饰的类不可以被继承。
(3)super:一般用于调用父类对应的方法。
(4)transient:修饰用于阻止序列化。

3.重载和重写

(1)重载:发生在一个类中,指的是该类中对于两个同名不同参的方法,在进行方法调用的时候根据参数列表进行调用,发生在编译时。
(2)重写/覆盖:发生在两个类(父类和子类)中,指子类中有一个与父类中同名同参的方法,在进行方法调用的时候会调用子类中的方法,发生在运行期。

4.String(为什么设计成不可变的)、StringBuilder、StringBuffer

(1)String设计为不可变的原因主要从三个方面考虑:
①运行时常量池:如果一个字符串对象在创建时,若在运行时常量池中存在该字符串字面量,则直接将对象指向运行时常量池中的字符串字面量,如果不存在,则在堆中创建一个新的字符串对象。
②安全性:一般而言,字符串作为多个类和类库的参数,如url、文件路径、反射的参数等,为了避免字符串被引用后修改,影响原先的引用。另外,在进行参数传递时,在另一个方法内部修改了该字符串,如果可变,则会直接改变了原方法的字符串,这可能是我们所不希望的。
③考虑到hashCode散列码的计算:作为如hashmap等的主要键值,不可变性保证了该字符串的hashcode的唯一性,不用在进行修改后需要重新进行散列计算对应的hashcode值。
(2)StringBuider是一个可变的字符串类,内部是一个char类型的数组,默认长度为16,满后创建新的数组,长度+16。
(3)StringBuffer是线程安全的,与StringBuilder相似,但添加了synchronized加锁保证。

5.基本数据类型和包装类、什么是自动装箱、拆箱,为什么要有包装类,自动装箱和拆箱的意义是什么?

基本数据类型:
图片说明
(1)自动装箱、拆箱:基本数据类型在与对应的包装类进行运算或赋值操作时自动将基本数据类型装箱成包装类或将包装类拆箱成基本数据类型。
(2)Integer内部有一个数组缓存了-127~128范围的Integer对象,如果某个Integer的值在该范围,则指向该对象。
(3)为什么需要包装类:Java身为面向对象的语言,一切皆对象,所有的类都继承自Object,但是对于基本数据类型来说,既不是引用类型,也不是Object的子类,那么需要包装类去保证面向对象的完整性。对于一个包装类而言,它的值可以为null,另外,java集合能接收的类型只有Object类型,想要去存放基本数据类型是无法做到的,所以只能通过包装类做到。

6.接口与抽象类、接口interface与继承extends

(1)接口可以实现理论上的多继承、而抽象类不能。
(2)接口里的方法都必须是抽象方法、抽象类里可以有具体的实现方法。
(3)接口不能有构造函数、抽象类可以定义构造函数。

7.==与equals()、equals()与hashCode()

(1)==对于基本数据类型而言,比较的是值是否相等;对于引用数据类型而言,比较的是引用地址是否相等。
(2)equals()未重写时在Object类中内部实现就是直接==,在String中进行了重写,先进行==判断,如果引用地址相等则直接返回true,否则判断两个字符串的长度是否相等,相等则比较具体的字符串值。
(3)hashCode()多用于在hashmap、hashset中进行散列快速确定键值的位置,以减少equals()的次数。
(4)为什么重写equals()必须重写hashCode():因为规定如果两个元素equals()返回true,则他们的hashCode必须相等,如果不重写,则在进行散列后得到的值可能就不相等,但equals()返回true了,也就是说重写hashCode()是为了让对象与对象地址产生关联。

8.值传递与引用传递

(1)值传递:对于基本数据类型传递的是值的拷贝,对引用类型传递的是引用地址的拷贝。(形参只是得到了实参的拷贝值)
(2)引用传递:传递的是引用。(形参是实参的引用)

9.什么是反射?反射的优缺点?反射的应用?

(1)反射:在类加载时,在堆中生成了一个可以访问方法区中运行时数据结构的class对象,反射是指在运行期间,通过该class对象来获取所有属性和方法,进而调用对应的方法。
(2)缺点:反射破坏了原有的封装性,导致原本不想暴露的属性方法被获取到了,另外反射加载带来了额外的性能开销。

10.浅拷贝与深拷贝

(1)浅拷贝:创建新对象,复制原对象的非静态属性(基本数据类型拷贝值,引用数据类型拷贝对象地址)。
(2)深拷贝:不仅复制对象本身,还复制对象属性中包含的引用 所指向的那些对象。

11.泛型

12.注解

13.异常处理

(1)Throwable分为两类:Exception异常和Error错误,Exception又分为RuntimeException运行时异常、CheckedException检查时异常,前者会在运行时抛出异常,常见的有NullPointException空指针异常、ArrayIndexOutOfBounds数组越界异常等,后者在编译前就需要显示try-catch捕获处理或throw/throws抛出,如IOException等。Error是由于虚拟机内部引起的错误,常见的有OutOfMemoryError内存溢出错误、StackOverFlowError栈溢出错误等。
(2)throw和throws的区别:throw在方法体内部抛出具体的异常对象,throws在方法头中抛出异常类。

14.jdk1.8新特性:lambda表达式

全部评论
优秀优秀
点赞 回复 分享
发布于 2021-07-14 21:42

相关推荐

会飞的猿:我看你想进大厂,我给你总结一下学习路线吧,java语言方面常规八股要熟,那些java的集合,重点背hashmap八股吧,jvm类加载机制,运行时分区,垃圾回收算法,垃圾回收器CMS、G1这些,各种乐观锁悲观锁,线程安全,threadlocal这些。在进阶一些的比如jvm参数,内存溢出泄漏排查,jvm调优。我这里说的只是冰山一角,详细八股可以去网上找,这不用去买,都免费资源。mysql、redis可以去看小林coding,我看你简历上写了,你一定要熟,什么底层b+树、索引结构、innodb、mvcc、undo log、redo log、行级锁表级锁,这些东西高频出现,如果面试官问我这些我都能笑出来。消息队列rabbitmq也好kafka也好,学一种就行,什么分区啊副本啊确认机制啊怎么保证不重复消费、怎么保证消息不丢失这些基本的一定要会,进阶一点的比如LEO、高水位线、kafka和rocketmq底层零拷贝的区别等等。计算机网络和操作系统既然你是科班应该理解起来问题不大,去看小林coding这两块吧,深度够了。spring boot的八股好好看看吧,一般字节腾讯不这么问,其他的java大厂挺爱问的,什么循环依赖啥的去网上看看。数据结构的话科班应该问题不大,多去力扣集中突击刷题吧。项目的话其实说白了还是结合八股来,想一想你写的这些技术会给你挖什么坑。除此之外,还有场景题、rpc、设计模式、linux命令、ddd等。不会的就别往简历上写了,虽然技术栈很多的话好看些,但背起来确实累。总结一下,多去实习吧,多跳槽,直到跳到一个不错的中厂做跳板,这是一条可行的进大厂的路线。另外,只想找个小厂的工作的话,没必要全都照这些准备,太累了,重点放在框架的使用和一些基础八股吧。大致路线就这样,没啥太多难度,就是量大,你能达到什么高度取决于你对自己多狠,祝好。
点赞 评论 收藏
分享
秋国🐮🐴:拿到你简历编号然后让你知道世间险恶
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务