1.== 和equal的区别
对于基本类型来说比的是值,对于引用类型来说,比的是引用,equal的本质是,只是String和Integer对其进行了重写,改成了比值
2. String StringBuffer和StringBuilder
- String声明的是不可变的对象,有final来修饰的,每次操作都会生成一个新的对象,在将指针指向新的String对象
- StringBuffer和StringBuilder则不会生成新的对象,是在原来的对象上修改,
- StringBuffer是线程安全的StringBuilder是非线程安全的,但性能高于StringBuffer,所以在单线程中使用StringBuilder,多线程使用StringBuffer.
3. 普通类和抽象类的区别
- 不同类不能有抽象方法,抽象类可以包含抽象方法
- 抽象类不能实例化,普通类可以实例化,
4. 接口和抽象类的区别
- 实现:接口用implement实现接口,抽象类用extend来继承抽象类
- 构造函数:接口不能有构造函数,抽象类可以有构造函数
- 实现数量:一个类只能继承一个抽象类但能实现多个接口
- 接口只能做方法声明,抽象类可以做方法声明也可以做方法实现
5.ArrayList和LinkedList的异同
- 都是不保证线程安全的
- ArrayList底层是用的是Object数组,LinkedList使用的双向循环链表
- 插入位置,ArrayList因为是数组,所以插入和删除元素时受到元素位置的影响,插入到末尾的时间复杂度是o(1),在指定位置i插入和删除的时间复杂度是O(n-i),LinkedList插入和删除不受元素位置影响,时间复杂度都是O(1)
- 是否支持快速随机访问:LinkedList不支持,而ArrayList实现了RandmoAccess接口
- 内存空间占用:ArrayList的空间浪费体现在list的末尾需要预留一定的空间,而LinkedList体现在每个元素都需要存前驱和后继鸡数据
6.HashMap和ConCurrentHashMap
- HashMap的扩容:当要插入新值的时候,如果现在的size达到了阈值,并且插入的位置上已经有了元素,就会触发扩容,扩容的大小为原来的两倍.扩容就是用一个大的新的数组替换原来小的数组,并将原来的数据迁移到新的数组中.
- JAVA8的HashMap用了数组+链表+红黑树的结构.在JAVA8中,当HashMap中的链表长度大于8时,就会将链表转换成红黑树,时间复杂度由原来的O(n)转换成O(LogN)
- JAVA7的ConcurrentHashMap的数据结构是Segment数组.Segment继承了ReentrantLock来加锁,所以每次需要加锁的操作是锁住了Segment,保证每个Segment是线程安全的
- JAVA8的ConcurrentHashMap也引入了红黑树,数据结构是数组+链表/红黑树,采用CAS和synchronize来保证线程安全
7.单例模式
- 静态内部类:
public class Singleton{
private static class SingletonHandler{
private static final Singleton INSTANCE = new Singleton();
}
private Singleton(){};
public static final Singleton getInstance(){
return SingletonHandler.INSTANCE;
}
}
public class Singleton{
private volatile static Singleton singleton;
private Singleton(){};
public static Singleton getInstance(){
if(singleton == null){
synchronized(Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
8. 异常
- Throwable是异常的根,分为Error和Exception
- Exception又分为Runtime异常和Checked异常,Checked异常是程序必须要处理的异常,通常使用try/catch和在定义方法时声明抛出异常,
一般的异常有
- Java.lang.ClassNotFoundException
- Java.lang.NoSuchMetodException
- java.io.IOException
- Runtime如除数是0和数组下标越界等,其产生频繁,处理麻烦,若显示申明或者捕获将会对程序的可读性和运行效率影响很大。所以由系统自动检测并将它们交给缺省的异常处理程序。当然如果你有处理要求也可以显示捕获它们。
一般的异常有:
- Java.lang.ArithmeticException
- Java.lang.ArrayStoreExcetpion
- Java.lang.ClassCastException
- Java.lang.IndexOutOfBoundsException
- Java.lang.NullPointerException
- Error:
- 当程序发生不可控的错误时,通常做法是通知用户并中止程序的执行。与异常不同的是Error及其子类的对象不应被抛出。
- Error是throwable的子类,代表编译时间和系统错误,用于指示合理的应用程序不应该试图捕获的严重问题。
- Error由Java虚拟机生成并抛出,包括动态链接失败,虚拟机错误等。程序对其不做处理。