java集合源代码分析(一)

来源:互联网 发布:直播摄像头美颜软件 编辑:程序博客网 时间:2024/06/06 23:49

(一)ArrayList
1.底层结构:是数组,初始大小是10;

2.扩容:int newCapacity = (oldCapacity * 3)/2 + 1;  可通过ensureCapacity操作初始化大小;
      数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中;
3.存储:将指定的元素添加到此列表的尾部。也可指定添加顺序;
4.是否允许重复:允许重复,判断标准equals相等;
5.是否允许存放null:允许;
6.多线程:非线程安全
  Fail-Fast机制:?
7.补充:
实现线程安全的方法
1、继承Arraylist,然后重写或按需求编写自己的方法,这些方法要写成synchronized,在这些synchronized的方法中调用ArrayList的方法。
2、List list = Collections.synchronizedList(new ArrayList());

(二)HashMap
1.底层结构:数组和链表的结合体;
   Entry就是数组中的元素,每个 Map.Entry 其实就是一个key-value对,它持有一个指向下一个元素的引用,这就构成了链表;
从上面的源代码中可以看出:当我们往HashMap中put元素的时候,先根据key的hashCode重新计算hash值,根据hash值得到这个
元素在数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,
新加入的放在链头,最先加入的放在链尾。如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上
2.扩容:证初始化时HashMap的容量总是2的n次方,即底层数组的长度总是为2的n次方
      那么HashMap什么时候进行扩容呢?当HashMap中的元素个数超过数组大小*loadFactor时,就会进行数组扩容,
      loadFactor的默认值为0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为16,那么当HashMap中
      元素个数超过16*0.75=12的时候,就把数组的大小扩展为 2*16=32,即扩大一倍
3.是否允许重复:key不允许重复,判断标准equals相等;
4.是否允许存放null:允许使用null值和null键;
5.多线程:非线程安全
  Fail-Fast机制:?

(三)hashset
1.底层结构:是hashmap(封装了hashmap),使用默认初始容量为16和加载因子0.75
2.扩容:int newCapacity = (oldCapacity * 3)/2 + 1;  可通过ensureCapacity操作初始化大小;
      数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中;
3.存储:同HashMap ,对此set中元素进行迭代的迭代器。返回元素的顺序并不是特定的
  value值是static final Object PRESENT = new Object()
  而且:新添加的Entry的value会将覆盖原来Entry的value,但key不会有任何改变,  因此如果向HashSet中添加一个已经存在的元素时,新添加的集合元素将不会被放入HashMap中,   原来的元素也不会有任何改变,这也就满足了Set中元素不重复的特性。 
4.是否允许重复:不允许重复
5.是否允许存放null:允许;
6.多线程:非线程安全

原创粉丝点击