前言
学习面试题进步很快,但也是个日积月累的过程,一起坚持吧。
一、面向对象的特性?
- 封装:利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的个体,隐藏内部的细节,暴露出一些对外接口来与外部发生联系。用户无需知道内部的细节,但可以通过对象暴露出的接口来访问对象。
- 继承:IS-A关系,子类继承父类的非private的属性和方法,子类可以完全替代父类。父类引用指向子类对象称为 向上转型 。
- 多态:多态分为编译时多态和运行时多态。编译时指方法的重载;运行时指程序中定义的对象引用所指向的具体类型在运行期间才确定。多态的三个条件:继承,重写,向上转型
二、a=a+b 和 a+=b 的区别?
+=会强制将加操作的结果类型转为持有结果的类型。如果两个整型相加,如byte,int,short,会首先将他们转为int再相加
byte a = 127;
byte b = 127;
b = a + b; // error : cannot convert from int to byte
b += a; // ok
三、3*0.1 == 0.3 将会返回什么? true 还是 false?
false。因为有些浮点数不能精确的表示出来。
四、能在 Switch 中使用 String 吗?
Java7之后可以,但这其实是一个语法糖,内部实现在 switch 中使用字符串的 hash code
五、对equals()和hashCode()的理解?
- 为什么在重写 equals 方法的时候需要重写 hashCode 方法?
因为有强制的规范指定需要同时重写 hashcode 与 equals 是方法,许多容器类,如 HashMap、 HashSet 都依赖于 hashcode 与 equals 的规定。 - 有没有可能两个不相等的对象有相同的 hashcode?
有可能的,这就是为什么HashMap中会有冲突,相等 hashcode 值的规定只是说如果两个对象相等,必须有相同的hashcode 值,但是没有关于不相等对象的任何规定。 - 两个相同的对象会有不同的 hash code 吗?
不会,相同的对象的hash code 一定相同
六、final、finalize 和 finally 的不同之处?
- final是修饰符,修饰方法,类,变量。意味着该变量的值不可以被改变
- Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的,但是什么时候调用 finalize 没有保证。
- finally是配合try catch来使用去处理一些异常问题的,finally内部的代码一定会执行,无论在try中有没有异常~
七、String、StringBuffer与StringBuilder的区别?
- String是final修饰的,是不可变得对象
- StringBuffer是线程安全的,可以操作对象而不会生成新的对象。是对对象本身的操作。所以对于频繁改变内容的字符串避免使用String,因为频繁的生成对象将会对系统性能产生影响。
- StringBuilder是非线程安全的。单线程中效率相对较高,可以使用
八、接口与抽象类的区别?
- 一个类只能继承一个抽象类,但可以实现多个接口
- 抽象类可以有构造方法,接口没有构造方法
- 抽象类可以有普通成员变量,接口没有成员变量
- 抽象类和接口都可有静态成员变量, 抽象类中静态成员变量访问类型任意,接口只能public static final(默认)
- 抽象类可以没有抽象方法,抽象类可以有普通方法;接口在JDK8之前都是抽象方法,在JDK8可以有default方法,在JDK9中允许有私有普通方法
- 抽象类可以有静态方法;接口在JDK8之前不能有静态方法,在JDK8中可以有静态方法,且只能被接口类直接调用(不能被实现类的对象调用)
- 抽象类中的方法可以是public、protected; 接口方法在JDK8之前只有public abstract,在JDK8可以有default方法,在JDK9中允许有private方法
九、 this() & super()在构造方法中的区别?
- 调用super()必须在子类构造的第一行,否则编译不通过
- super从子类调用父类构造,this在同一类中调用其他构造需放在第一行
- 尽管可以用this调用一个构造器, 却不能调用2个
- this和super不能出现在同一个构造器中, 否则编译不通过
- this()、super()都指的对象,不可以在static环境中使用
- 本质this指向本对象的指针。super是一个关键字
十、Java移位运算符?
- << :左移运算符,x << 1,相当于x乘以2(不溢出的情况下),低位补0
:带符号右移,x >> 1,相当于x除以2,正数高位补0,负数高位补1
:无符号右移,忽略符号位,空位都以0补齐