面试宝典
-
- 构造器 Constructor 是否可被 override?
- 重载和重写的区别
- Java 面向对象编程三大特性
- String 为什么是不可变的?
- String、StringBuffer 和 StringBuilder 的区别是什么?
- 自动装箱与拆箱
- 接口和抽象类的区别是什么?
- 构造方法有哪些特性?
- 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?
- == 与 equals区别
- 你重写过 hashcode 和 equals 么,为什么重写 equals 时必须重写 hashCode 方法?
- 线程有哪些基本状态,并描述每种状态?
- final 关键字修饰这三个地方:变量、方法、类,会有什么作用
- Java 序列化中如果有些字段不想进行序列化,怎么办?
- 获取用键盘输入常用的两种方法
- 既然有了字节流,为什么还要有字符流?
- 描述深拷贝和浅拷贝
- **说说&和&&的区别。**
- final, finally, finalize的区别。
- ArrayList和Vector的区别
- Arraylist 与 LinkedList 区别?
- ArrayList的拓容机制
- HashMap和Hashtable的区别
- 说说List,Set,Map三者的区别?
- 什么是线程死锁
- 如何避免线程死锁?
- 说说 sleep() 方法和 wait() 方法区别和共同点?
- HashMap和ConcurrentHashMap的区别
- 现在有线程 T1、T2 和 T3。你如何确保 T2 线程在 T1 之后执行,并且 T3 线程在 T2 之后执行?
构造器 Constructor 是否可被 override?
Constructor 不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多个构造函数的情况。
重载和重写的区别
重载
发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同
重写
重写是子类对父类的允许访问的方法的实现过程进行重新编写,发生在子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。另外,如果父类方法访问修饰符为 private 则子类就不能重写该方法。也就是说方法提供的行为改变,而方法的外貌并没有改变。
Java 面向对象编程三大特性
封装,继承,多态
String 为什么是不可变的?
String 类中使用 final 关键字修饰字符数组来保存字符串,private final char[] value
,所以 String 对象是不可变的。
String、StringBuffer 和 StringBuilder 的区别是什么?
可变性
String 类中使用 final 关键字修饰字符数组来保存字符串,private final char value[]
,所以 String 对象是不可变的。而 StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串char[]value
但是没有用 final 关键字修饰,所以这两种对象都是可变的。
线程安全性
StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
性能
每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
对于三者使用的总结:
- 操作少量的数据: 适用 String
- 单线程操作字符串缓冲区下操作大量数据: 适用 StringBuilder
- 多线程操作字符串缓冲区下操作大量数据: 适用 StringBuffer
自动装箱与拆箱
- 装箱:将基本类型用它们对应的引用类型包装起来;
- 拆箱:将包装类型转换为基本数据类型;
接口和抽象类的区别是什么?
-
接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),而抽象类可以有非抽象的方法。
-
接口中除了 static、final 变量,不能有其他变量,而抽象类中则不一定。
-
一个类可以实现多个接口,但只能实现一个抽象类。接口自己本身可以通过 extends 关键字扩展多个接口。
-
接口方法默认修饰符是 public,抽象方法可以有 public、protected 和 default 这些修饰符(抽象方法就是为了被重写所以不能使用 private 关键字修饰!)。
构造方法有哪些特性?
- 名字与类名相同。
- 没有返回值,但不能用 void 声明构造函数。
- 生成类的对象时自动执行&