HashMap 和 HashTable 的区别:
Hashmap 的源码部分:是没有加锁的所以它是线程不安全的
HashTable的底层是加了synchronized 同步锁的所以是线程安全的
hashMap 是允许key 和value为null 的,但是hashTable不允许
hashMap的底层是:数组+链表
先通过hash算法计算出key的值作为存储数组的下标,如果不同的key计算出同一个值的时候再通过equals方法判断是不是一个值,如果是的代替旧的value值存在数组中。如果不是同一个值的话则使用链表的存储方式外接在数组上。
key为null的时候,存在下标0的位置
hashTable虽然线程安全但是效率低现在多使用CurrentHashMap
谈谈ConcurrentHashMap的扩容机制
在jdk1.8之前
基于Segment分段实现的每个Segment相当于一个小型的HashMap,每个Segment内部会进行扩容,和hashMap的扩容类似
Jdk1.8以后
通过多线程一起扩容,每个线程负责一块区域,扩容前会通过这些线程进行元素转移
Jdk1.7和jdk1.8之间虚拟机发生了怎么样的变化
1.7中存在永久代,1.8中没有永久代替换成了元空间。不管是永久代还是元空间他们都是方法区的具体实现。之所以将元空间所占的内存移到虚拟机外面是因为:方法区中所存储的类信息是很难确定的,空间给小了容易造成内存溢出,太大了又会占用太多的虚拟机空间。转移到本地内存以后就不会影响倒虚拟机了。
浅拷贝和深拷贝
浅拷贝和深拷贝就是指的是对象的拷贝,一个对象中存在两种属性,一种是基本数据类型,一种是实例对象的引用
浅拷贝:对于基本数据类型的值进行复制,对于引用数据类型的值拷贝其地址,指向的还是同一个内存
深拷贝:对于基本数据类型的值进行复制,对于引用数据类型的值重新开辟出内存进行完全复制
泛型中Extends和super的区别
- <? extends T> 表示包括T在内的任何子类
- <? super T> 表示包括T在内的任何父类