1、jvm,jre,jdk的区别:
    jvm是Java虚拟机,java跨平台的核心
    jre是java运行环境,包括了jvm和一些基本类库
    jdk是java核心,继承了jre和一些工具
    jdk>jre>jvm
    2、java数据类型
    整数:byte、short、int、long
    浮点数:float、double
    字符:char
    布尔:boolean
    3、权限修饰符
    public:任何包的任何类
    protected:包内的任何类,以及包外继承了该类的子类
    default:包内的任何类
    private:该类
    4、重写和重载的区别:
    重写:发生在父子类中,方法名和参数列表相同,返回值类型一致,权限修饰符大于等于父类,如果父类被 private修饰则不能重写
    重载:发生在一个类中,方法名相同,但是参数列表不同
    5、string stringbuffer stringbuider区别:
    string:string被finall修饰,对象不可变,每次都是new一个新的对象
    stringbuffer:对象可变,加了同步锁,线程安全,速度比stringbuider慢
    stringbuider:对象可变,线程不安全,但是速度比stringbuffer快
    6、 == 和equals的区别:
    ==:如果比较的是常量,那么比较的就是值
    如果比较的是引用数据类型,那么比较的就是地址值
    equals:通过查看源码发现,object中的equals方法未重写时,调用的就是==方法
    重写之后就是比较的值
    7、集合
    单列集合:
    list:ArrayList:增删慢,查询快,底层是数组
    LinkListL:增删快,查询慢,底层是链表
    Set:hashSet:底层是哈希表,无序、唯一,通过hashcode和equals来保证唯一性
    linkHashSet:底层是链表和哈希表,有序且唯一,通过哈希表保证唯一,通过链表保证有序
    treeset:底层是红黑树,有序且唯一,通过自然排序和比较器排序保证有序
    通过比较的值是否为0来保证唯一
    双列集合:
    Map:hashMap hashTable treeMap的区别
    hashtable加了同步锁,线程安全
    treemap是有序的
    hashmap可以存null值,hashtable不行
    hashmap:
    扩容机制:默认长度16,当达到阈值0.75时进行扩容,扩容两倍
    底层数据结构:jdk1.7之前是数组加链表,jdk1.8之后是数组加链表/红黑树,当数组长度超过64,链表长度超过8,则把链表转换成红黑树
    如何添加数据,通过key用hashcode计算出hash值,在通过(数组长度-1)& hash计算出在数组上存放的位置,如果存放的位置上有元素,那就用equals比较,如果一样则覆盖,不一样则拉链法,jdk1.7之前采用的头插法,1.8采用的尾插法;
    concurrentHashMap和hashtabe的区别:
    为什么要讨论他们的区别,因为他们都是线程安全的,但是在实现线程安全的方式上不同
    数据结构区别:concurrent在jdk1.7之前采用的是分段数组加链表,jdk1.8之后采用的是分段数组加链表/红黑树,hashtable则采用的是数组加链表
    实现方式区别:concurrent采用的分段锁,把数据分段,每把锁,锁不同的数据,这样多线程场景下,就不会发生锁竞争,相当于线程安全且优化过后的hashmap;hashtable,虽然是线程安全的,但是他锁是锁整个hashtable,导致锁竞争激烈,效率低下。