摘要:

1.创建对象的四种方式:
使用new关键字创建对象;通过反射的方式;通过clone的方式;通过反序列化的方式。
2.接口与抽象类的区别:
一个类只能继承一个抽象类,但可以实现多个接口
抽象类可以有构造器,但接口不能有构造器
抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的
抽象类中的抽象方法的访问类型可以是public,protected和默认类型,但接口中的抽象方法只能是public类型的
抽象类中的变量的访问类型可以任意,但接口中定义的变量只能是public static final类型
3.==和equals的区别:
==比较的是引用是否指向同一块内存;euqals被重写了,比较的是引用指向内存中的值是否相等
4.String、StringBuffer和StringBuilder的区别:
String 大小固定,不可变
StringBuffer 大小可变,线程安全(有锁),同步,效率低,适用于多线程,低并发
StringBuilder 大小可变,线程不安全(无锁),不同步,效率高,适用于单线程,高并发
5.介绍泛型:
泛型:数据类型参数化
泛型类:类名{}
泛型接口:接口名{}
泛型方法:访问修饰符 返回值类型 方法名称(){}
<?>不确定的数据类型,是实参
受限泛型<? extends E>,只能填写E或者E的子类,确定上限
<? super E>,只能填写E或者E的父类,确定下限
泛型擦拭:.java–>.class,泛型会被消除掉,这个过程叫做泛型擦拭。(JVM不认识泛型)
泛型的作用:1.提高java程序的类型安全 2.消除强制类型转换 3.提高了代码的复用性
6.sleep和wait的区别:
sleep()方法是Thread类的静态方法,而wait()方法是object类的方法
调用sleep()方法并不会释放锁。而wait()方法会
wait()方法必须放在同步方法和同步块中使用,sleep()方法则可以放在任何地方使用。
sleep()方法必须捕获异常,而wait()不需要捕获异常
7.synchronized 底层实现原理:
方法和代码块被synchronized修饰后,同一时刻只有一个方法可以进入到临界区
synchronized会阻止其它线程获取当前对象的监控锁,这样synchronized修饰的代码块就无法被其它线程访问,也就无法并发执行
synchronized还会保证所有操作结果都会直接刷到主存中,从而保证了内存可见性