《面试笔记》——Java基础终结篇(吃透系列)

今天给大家带来我去年实习与秋招期间历经几十场面试总结下来的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修饰,线程安全。<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值