1、HashMap和Hashtable的区别
不同点:容量上看hashmap初试大小为16,hashtable为11,hashmap的key和Value值可以为null而hashtable不可以,从并发的角度看,hashtable是线程安全的,低层方法采用sychronized作了同步,而hashmap是非线程安全的,hashtable实现Dictionary类而hashmap实现的是AbstractMap抽象类。
相同点:底层数据结构都是散列表,都是通过分离链表法解决hash冲突,都实现了Map接口。
附:解决hash冲突的方式:
1)分离链表:将散列到同一个桶位中的的所有元素,保存到同一个链表中;
2)开放地址法:a、线性探测法:相继查找下一个单元知道给单元为空(可以回绕,即类似循环链表);容易出现一次聚焦,即
每次插入一个元素,可能会需要多次尝试才能解决冲突;
b、平方探测法:插入第i元素,当发生冲突时,查找i与当前位置冲突距离为i的平方的位置是否为空单元;容易出
现二次聚焦,即当桶位大小不为素数时,一旦桶位填充超过一半就不能保证一次找到空的单元,出现插入失败;
c、再散列:当出现插入失败时,将桶的大小变为原来的2倍,然后重新计算所有的元素散列值,
2、Hashcode的作用
java中每个对象都有一个hashcode,它为 散列表提供了快捷性,同一个对象它的hashcode一般是相同的,如果调用equals方法判断的对象相等,那么两个对象的hashcode一定是一样的,因此当对equals方法重写时一般都会对hashcode方法重写,从而保证一致性,两个对象的hashcode相同,并不代表他们是同一个对象,但是能够表示在散列表数据结构中,它们在同一个桶位中。
3、Java引用类型https://www.cnblogs.com/huajiezh/p/5835618.html
4大引用类型:强引用、软引用、弱引用、虚引用
作用:1、通过代码的方式决定对象的生命周期;
2、便于JVM进行垃圾回收
强引用:创建一个对象,并把这个对象赋值给一个引用变量。当一个对象,有引用变量指向时,该对象永远不会被JVM回收,即使出现
OutOfMermery(OOM)异常;
软引用(SoftReference):如果一个对象具有软引用,当内存足够时,JVM就不会对它进行垃圾回收;当内存不足时,JVM就会适时回收软引用对
象,软引用常应用于对内存敏感的场合,如高速缓存图片缓存等;
eg:MyObject obj = new MyObject();
SoftReference<MyObject> sf = new SoftReference<>(obj);//创建MyObject的软引用
软引用不影响JVM对对象的垃圾回收;上例中MyObject为强可及对象,不能被垃圾回收,若令obj=null,则此时MyObject为软可及对象;
软可及对象不会影响JVM对该对象的垃圾回收,JVM对软可及对象的回收根据其特定算法按照内存需求决定;
弱引用(WeakReference):无论内存是否足够,JVM都能回收被弱引用关联的对象;
eg:MyObject obj = new MyObject();
WeakReference wr= new WeakReference(obj);
此时,JVM不能回收弱引用关联的对象,因为obj强引用存在,若使obj=null,则此时JVM能回收被弱引用关联的对象;
虚引用(PhantomReference):如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收;
eg:new MyObject 等价于 PhantomReference pr = new PhantomReference(new MyObject());
虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列
中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。
软引用和弱引用
对于强引用,我们平时在编写代码时经常会用到。而对于其他三种类型的引用,使用得最多的就是软引用和弱引用,这2种既有相似之处又有区别。它们都是用来描述非必需对象的,但是被软引用关联的对象只有在内存不足时才会被回收,而被弱引用关联的对象在JVM进行垃圾回收时总会被回收。