java学习(3)concurrenthashmap hashtable hashmap copyonwritearraylist weakHashMap待续

来源:互联网 发布:甜甜圈拷机软件 编辑:程序博客网 时间:2024/05/10 17:55
HashTable是线程安全的。
HashMap不是线程安全的,且多线程下会出现死循环情况。
ConcurrentHashmap是线程安全的,其中效率高于hashtable
CopyonwriteArraylist是线程安全的,适用于读多写少的情况。

初始认知:

1.针对hashtable和hashmap的区别和各自实现的方式。
hashtable和hashmap的一个最大的区别就是hashtable是线程安全的而hashmap不是线程安全的。所以如果在单线程模式下,优先选择hashmap因为这个性能更好。
为什么是这样的呢。通过hashtable的源代码可以看出来,hashtable中的get,put等操作都是通过锁进行的。
2.HashTable的键和值不允许为空,HashMap允许一个空键和空值。且一个空键可以对应多个空值。
3.HashTable的迭代器不是fail-fast的,是enumerator的。HashMap的是fail-fast的。ConcurrentHashmap是fail-fast的。CopyOnWriteArrayList是线程安全且不是fail-fast的。
产生Fail-fast异常 是因为ModCount的值变化,ModCount值变化表明检测到了结构的变化。也就是集合在程序运行过程中进行了变化,然后进行迭代器遍历时会检查ModCount和ModExcepted的值时会抛出异常。

具体实现:

1.HasTable:

HashTable和HashMap一样都是用来存储键值对的,HashTable的实现来看,他不是一个保续的,HashTable有两个关键的参数影响这个性能,一个是负载因子,一个是初始容量,初始容量指的是Hash表创建的容量,负载因子是指超过这个界限就进行reHash。
###(1)、构造函数:
构造函数有四种:
1.默认的初始化函数public Hashtable()
2.设置指定容量大小的构造函数public Hashtable(int initialCapacity)
3.设置的容量大小和加载因子的构造函数public Hashtable(int initialCapacity, float loadFactor)
4.包含了子MAP的构造函数public Hashtable(Map

2.HashMap:

同样的对于这个HashMap,也是用拉链式来实现,具体的说就是链表和数组的合体,这样的化先用index找到具体的桶然后通过链表遍历找到具体的值,是一个链表数组。
既然是Hash那么就有Hash冲突这种问题。

3.ConcurrentHashMap:线程安全的。

4.CopyOnWriteArrayList:线程安全的。写的时候先复制,再拷贝引用到原地址。读的时候不需要。

5.WeakHashMap

首先谈一下自己对WeakHashMap的理解

WeakHashMap首先和HashMap一样,都是存储键值对的,同样不是线程安全的,同样不是有序的,同样也是使用拉链方法来解决冲突,同样也是会产生fail-fast的,很多地方都一样。唯一不同的是他的键值是弱引用(WeakReference)的。

看一下WeakHashMap 的源码

摘自别人的博客,后面会有引用地址
可以看到Key是用WeakReference的类型。

WeakReference

这个是个什么东西呢?首先要知道JAVA中的GC机制,Gc的对象一定要满足没有人再引用他.
有三个继承自Reference的类:SoftReference,WeakReference,PlhantomReference.这三种类为Gc提供了不同级别的间接性指示
java编程思想中:
如果想继续持有对某个对象的引用,希望以后还能够访问到改对象,但是也希望能够允许垃圾回收器释放它,这时就应该使用Reference对象。这样你可以继续使用该对象,并且在内存消耗殆尽的时候又允许释放该对象。使用Reference的对象作为你和普通引用之间的媒介,另外一定不能有普通的引用指向那个对象,这样就能达到这个目的。(普通的引用时值没有经Reference对象包装过的引用),如果垃圾回收期发现某个对象通过普通引用是可以获得的,那么这个对象是不会被释放的。
一个简单的实例

WeakHashMap如何把被Gc的key从Table中删除呢

阅读全文
0 0
原创粉丝点击