源码之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视图进行迭代。