学习笔记20230319

目录

一、final

二、List和Set

三、HashMap扩容机制原理

四、ArrayList和LinkedList 有哪些区别

五、HashMap和HashTable区别

六、ConcurrentHashMap扩容机制原理

七、CopyOnWriteList的底层原理是怎样

八、StringBuffer、StringBuilder、String有哪些区别

九、1.7  HashMap 1.8 HashMap 发生什么变化

十、java 1.7到1.8 虚拟机有什么变化

总结


一、final

1、修饰类:类不可被继承。

2、修饰方法:方法不可以被重写,但可以被重载。

3、修饰变量:

    a、全局变量:

          普通变量:初始化赋值或代码块;

          静态变量:初始化或静态代码块赋值;

          引用类型变量: 指定引用是不可变的,但内容是可变的。

    b、局部变量:

          一开始可以不用赋值。

4、匿名内部类和内部类的变量传递要用final 修饰:

      编译完后是两个class, 父class 被回收,子class就不可以使用,因此需要把复制数据,又要保证数据不会变化就需要final修饰。

二、List和Set

1、List:  有序可重复,可保存多个null, 可以使用迭代器和get()随机访问;

2、Set:  无序不可重复,只保存一个null, 只可以用迭代器进行访问;

三、HashMap扩容机制原理

1、底层数据结构:

     链表+数组, 链表+数组+红黑树(数组长度大于64,链表长度大于8)

2、复制两倍数组长度,通过hash运算把原数组的数据转移到新数组,如果有红黑树可能变退化成链表。

四、ArrayList和LinkedList 有哪些区别

1、数据结构 : ArrayList是一个动态数组,LinkedList 是一个链表;

2、性能: 查询效率ArrayList > LinkedList; 新增效率:若ArrayList不涉及到扩容和移动元素,ArrayList> LinkedList、 相反LinkedList>ArrayList;删除效率:LinkedList > ArrayList;

3、应用场景:LinkedList 实现Duque ,可以当队列使用,在确定容量和只使用尾插的情况下使用ArrayList。

4、遍历: ArrayList 迭代器和for, 而LinkedList 只能是迭代器,for遍历不可使用。

五、HashMap和HashTable区别

1、数据结构:数组 + 链表 + 红黑树(1.8),数组 + 链表 + synchronized ;

2、线程安全:HashTable 有个全局的synchronized去保证线程安全;

3、应用场景:HashMap 的key和value是可以保证null ,但Hashtable 是不能保证null。

六、ConcurrentHashMap扩容机制原理

1、数据结构:ReenTrantLock + Segment + HashEntry , Synchronized + CAS + node + 链表。

2、扩容机制:分段锁里HashEntry 是独立扩容不互相影响,支持多线程扩容;

3、查询过程:不加锁,volatile修饰。

4、并发粒度:16分段锁,hash冲突是使用在链表head+synchronized。

5、锁:查找、替换、删除使用CAS 来提高性能。

七、CopyOnWriteList的底层原理是怎样

1、新增 :使用ReenTrantLock加锁,原有数据容量上加1,进行写操作,重新指向新的数组。

2、查询 :不加锁,可以正常读,会读到历史数据。

3、应用场景:读多写少,实时性不高。

八、StringBuffer、StringBuilder、String有哪些区别

1、可变性:String 是final修饰的,不可变,会重新创建对象,StringBuffer、StringBuilder是可变的对原有对象进行操作。

2、线程安全:StringBuffer操作时是有Synchronized修饰,是线程安全。
3、性能:StringBuilder > StringBuffer > String。

九、1.7  HashMap 1.8 HashMap 发生什么变化

1、数据结构:链表+数组 ,链表+ 数组 + 红黑树。

2、链表插入:头插法,尾插法。

3、hash运算:或与运算等复杂运算,hash值与数组长度取模,减少CPU消耗。

十、java 1.7到1.8 虚拟机有什么变化

变化:元空间,内存是在堆外。

原因:类信息是很难确定,不会消耗堆内存。


总结

你可能感兴趣的:(Java面试篇,java,jvm)