源码之Java集合

No1:

ArrayList的扩容策略是,新容量扩大为原来的1.5倍

ArrayList不是线性安全的,因为没有使用synchronized关键字,但是优点是效率提高了。与之相比,Vector是线性安全的。

ArrayList解决线程不安全的办法就是使用synchronized关键字,哈哈哈

No2:

ArrayList的内部类SubList是父类的一个视图,其上的操作都会反射到父类ArrayList上。

比如:删除ArrayList从100到200的数据,使用方法

list.subList(100,200).clear();

即可

No3:

HashMap允许使用null值和null键

HashMap也是线程不安全的。

No4:

jdk1.8之前HashMap是基于数组+链表来实现,具有相同hash值的节点连在一个链表或树中。

jdk1.8中HashMap采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,大大减少了hash冲突时查找时间(从原来的O(n)->O(logn)),由于红黑树的节点空间是链表空间的2倍,为了节省空间,当链表长度减少到阈值(6)时,又会转换为链表形式。

No5:

HashMap链表中的结点对应HashMap中的Entry类(jdk1.8之前)或Node类(jdk1.8之后)。

HashMap其实就是一个Entry(或Node)数组,Entry(或Node)对象中包含了键和值,其中next也是一个Entry(或Node)对象,它就是用来处理hash冲突的,形成一个链表。

No6:

HashMap初始容量为16加载因子是0.75,当HashMap中的元素个数超过数组大小*加载因子时,就会进行扩容,一般是扩容为2倍

No7:

fail-fast机制:即快速失败机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。因为HashMap不是线程安全的。

No8:

HashMap中哈希函数构造方法是先通过hashCode()方法获取h值,再通过h&(length-1)来得到所在数组的位置。

length为2的整数幂保证了length-1最后一位为1,从而保证了h&(length-1)的最后一位同时有为0和为1的可能性,保证了散列的均匀性。

No9:

HashSet内部就是使用HashMap来存储元素的。

No10:

HashSet添加元素e,确保元素不重复

map中put方法说明:

  如果map中键e存在,则返回旧的键e对应的value值

  如果map中键e不存在,则返回null

返回值:有重复返回false,无重复返回true

public boolean add(E e){
    return map.put(e,PRESENT)==null;
}

No11:

HashTable是线程同步的。

ConcurrentHashMap是线程安全高并发的。

No12:

HashTable是用数组+链表实现。

No13:

HashTable与HashMap主要区别是,hash函数的算法

HashTable用的是典型的除留取余法

int index = (hash&0x7FFFFFFF)%tab.length

No14:

LinkedHashMap是数组+双链表结构。继承自HashMap。

No15:

集合中的类都有一个共同的迭代方法,就是先把这个集合转化成Set视图,然后再对这个Set视图进行迭代。

原文地址:https://www.cnblogs.com/anni-qianqian/p/8081860.html