今天给大家带来我去年实习与秋招期间历经几十场面试总结下来的Java基础常考面试题,看看你能答对多少。
这是本期的JVM面试题目录,不会的快快查漏补缺~
1、谈谈面向对象的理解
面向过程:一件事该怎么做,注重实现过程,以过程为中心
面向对象:实现对象是谁,只关心怎样使用,不关心具体实现(只关心实现对象是谁,有封装、继承、多态三大特性)
封装:可以不用关心内部实现,具体构造,只需知道怎么操作它就是,比如电视,手机,将内部封装起来,直接使用
多态:
同一个方法调用,由于对象不同可能会有不同的行为。比如都是休息,张三是睡觉,李四是爬山等;或则具体场景中,我不知道现在具体传进来的对象是student,还是teacher,那么可以用pepole去接收它。
多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象。父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了
继承:使代码更容易扩展,比如有学生教师,他们都有一些公用方法与属性,可以将其抽取出来定义为父类,再去继承它,复用代码,减少冗余,易于扩展
2、面向对象与面向过程区别
面向过程 :面向过程性能比面向对象高。 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix 等一般采用面向过程开发。但是,面向过程没有面向对象易维护、易复用、易扩展。
面向对象 :面向对象易维护、易复用、易扩展。 因为面向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是,面向对象性能比面向过程低。
3、JDK与JRE区别
JDK(java developer's kit):
JDK=JRE+开发工具集(java javac javadoc jar....)
JRE(java runtime environment)---java运行环境:
JRE=JVM+核心类库
只运行,JRE即可,要编译就要JDK
4、值传递与引用传递
值传递是基本数据类型和引用数据类型都传递的是值,引用传递在传递引用数据类型时传递的是引用类型指向变量的地址,Java引用类型有两块地址空间,一个是线程的栈中,存储的是引用变量的值,一个是堆中的对象,Java传递参数都是传递栈中变量的值,而不是堆中地址,所以只有值传递。
5、==与equals()区别
=比较的是地址。对于基本数据类型比较的值,对于引用数据类型比较的是内存地址
equals() 属于object类方法,没有重写之前使用效果和==一样。可以重写例如String类,使其比较内容值是否相等
6、为什么重写 equals 时必须重写 hashCode ⽅法
hashcode可以获取哈希码,确定该对象在哈希表中的索引位置
提高效率:使用hashcode提前检验,定位,不用每一次都使用equlas方法比较,提高效率
保证没有重复对象出现,确保hashmap去重性:假如只重写equas方法,不重写hashcode,相同的对象hashCode不同,从而映射到不同下标下,HashMap无法保证去重
equals相同,hashcode相同;hashcode不同,equals一定不同;hashcode相同,equals不一定相同(哈希冲突)
7、深拷贝与浅拷贝
clone() 是 Object 的 protected 方法,它不是 public,一个类不显式去重写 clone(),其它类就不能直接去调用该类实例的 clone() 方法。
如果一个类没有实现 Cloneable 接口又调用了 clone() 方法,就会抛出 CloneNotSupportedException。
浅拷贝:
拷贝对象和原始对象的引用类型引用同一个对象。
深拷贝:
拷贝对象和原始对象的引用类型引用不同对象。
8、Java与C++区别?
- Java 是纯粹的面向对象语言,所有的对象都继承自 java.lang.Object,C++ 为了兼容 C 即支持面向对象也支持面向过程。
- Java 通过虚拟机从而实现跨平台特性,但是 C++ 依赖于特定的平台。
- Java 没有指针,它的引用可以理解为安全指针,而 C++ 具有和 C 一样的指针。
- Java 支持自动垃圾回收,而 C++ 需要手动回收。
- Java 不支持多重继承,只能通过实现多个接口来达到相同目的,而 C++ 支持多重继承。
- Java 不支持操作符重载,虽然可以对两个 String 对象执行加法运算,但是这是语言内置支持的操作,不属于操作符重载,而 C++ 可以。
- Java 的 goto 是保留字,但是不可用,C++ 可以使用 goto。
9、重载和重写(Override)的区别
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分
重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为private则子类中就不是重写。
10、多态理解
父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,然后你编译的时候不知道这个指针指向哪里,等到运行时才知道,从而去指向对应的子类或者接口具体实现的类所指向的方法
11、String为何不可变不可变好处
String 类中使⽤ final 关键字修饰字符数组来保存字符串,jdk9后,使用byte数组。StringBuilder 与 StringBuffer 都继承⾃ AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使⽤字符数组保存字符串char[]value 但是没有⽤ final 关键字修饰,所以这两种对象都是可变的。
不可变好处:缓存hash值(使得hash值不变,只进行一次计算)、String pool需要、线程安全、参数安全性(网络连接,参数变了,以为连接主机变了)
12、String有几种编码格式?
13、String,StringBuffer和StringBuilder之间的区别是什么?
可变性:String是不可变对象,任何对String修改都会创建新的String对象,StringBuffer和StringBuilder可变类。
效率:频繁对字符进行操作时,使用String会生成一些临时对象,多一些附加操作,效率低些。
安全性:Stringbuffer方法由synchronized修饰,线程安全。<