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虚拟机生成并抛出,包括动态链接失败,虚拟机错误等。程序对其不做处理。