基础知识
重载与重写的区别
面试官: 能说下重载与重写的区别么?
小白:
重载(overload)是发生在一个类中,方法名相同,参数类型不同,与返回值和访问修饰符无关;
重写(override)是发生在子父类中,参数列表必须相同,如果父类访问修饰符使用private则子类不能重写父类该方法,一般我们在子类调用父类需要重写的方法时,使用super关键字; 比如最常见的String中的equals()方法是重写了object类下的equals()
String与StringBuilder与StringBuffer的区别
面试官: 能说下String与StringBuffer与StringBuilder的区别么?
小白:
① 可变性
String类中使用了final关键字字符数组保存字符串,所以是不可变的;
StringBuffer与StringBuilder都继承自AbstractStringBuilder并没有使用final,所以是可变的;
②线程安全性
String因为是不可变的所以线程是安全的;
在源码中可以看到StringBuffer对方法加了同步锁(synchronized),所以是线程安全的;而StringBuilder没有加锁,所以是线程非安全的;
③性能
每次对String类型进行修改时,都是创建新的String对象,指针指向;
StringBuffer每次操作都是操作对象本身,没有生成新对象,而StringBuilder要比StringBuffer性能好些,但是线程不安全;
总结
1.操作少量数据使用String
2.单线程,字符串缓冲区操作大量数据使用StringBuilder
3.多线程,字符串缓冲区操作大量数据使用StringBuffer
==与equals()
面试官: 能说下==与equals()区别么?
小白:
==:作用是对两个对象的地址值做比较;基本数据类型比较的是值,引用数据类型比较的是内存地址;
equals() : 没有重写父类equals() 比较两个对象时,等价与 “等于”比较两个对象;(比较两个对象地址)
重写过equals(),是比较两个对象的内容是否相等;
面试官追问: 那你能说下为什么重写equals() 的时候需要重写hashcode()?
hashCode()的作用是获取哈希码,它实际上是返回一个int整数,这样就能确定该对象在哈希表中的索引位置。
1.如果两个对象相等,则hashcode一定也是相同的
2.两个对象相等,对两个对象分别调用equals方法都返回true
3.两个对象有相同的hashcode值,他们也不一定相等的
4.因此,equals方法被覆盖过,则hashcode方法也必须被覆盖
5.hashcode的默认行为是对堆上的对象产生独特值,如果没有重写hashcode,则该class的两个对象无论如何都不会相等
final
面试官: 能说下你是怎么理解final的么?
小白:
一句话总结(变量,方法,类):
(白话):被final修饰过的变量不可变,方法不能重写,类不能被继承
(官话):1.对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后不能修改;如果是引用类型的变量。则在对其初始化之后便不能再让其指向另一个对象
2.当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。
3.使用final方法的原因有两个;
第一个是方法锁定,以防止任何继承类修改它的含义;
第二个是效率;在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。类中所有的private方法都隐式的指定为final;
接口和抽象类
面试官: 能说下接口和抽象类的区别么?
小白:
1.关键字不同:
接口:interface
抽象类:abstract
2.接口的方法默认式public,所有方法在接口中不能有实现,抽象类可以有非抽象方法
3.接口中的实例变量默认式final类型的,而抽象类不一定
4.一个类实现接口的话要实现接口所有方法,抽象类不一定
5.接口不能用new实例化,但可以声明,必须引用一个实现该接口的对象。从设计层面来说,抽象式对类抽象,是一种模板设计,而接口是一种规范;