List,Set,Map三者的区别?
- List 和set都继承自Collection接口,Map来自map接口
- List储存数据是有序可重复的,Set是无序不可重复的
- Map是一个键值对的集合,储存的键与值相互映射 键值是不可重复的,其结构为hashSet数据结构
ArrayList与LinkedList
- 数据结构不同 ArrayList是一个可扩容的数组 Linked是一个双向链表
- 增加的时候都是在尾部增加
- 查找ArrayList优于LinkeList
- 但是在插入和删除中间部分数据的时候,这个要比较ArrayList迁移速度,与LinkeList查找数据的效率相比较
为什么数组不能迭代
- ArrayList重写实现迭代器
- Collection实现itrable
- 数组没有实现迭代器接口
ArrayList扩容机制
ArrayList是一个动态数组当数组容量到达一定程度时,会进行扩容
第一次元素进来时 由于数组进行add操作原来数据是0,此时添加的元素时,会有三种不同构造进行扩容
- 无参构造方法,第一次扩容容量为10,后面需要扩容,则正常扩容
- 传入的容量扩容,比如最开始容量是0,传入一个数1.此时容量为1,后为正常的二次扩容
- 传列表构造:
第二次扩容:当arrayList满的时候,会将原来的数组长度扩容到原来的1.5倍
hashSet底层原理
- hashSet每次进行添加的时候 都会进行一定的哈希算法 把得到的哈希值取余得到16个不同的结果
- 当第一次元素进来时,把元素放到15个位置去,第一次先判断数组的位置有没有元素,如果没有元素,则直接存储元素,如果存在元素,判断其哈希值是否相等,如果哈希值不相等,则直接存储在该位置的下方,用双向链表连接起来
- 要判断该位置元素的哈希值是否与新计算的数的哈希值相等,如果相等,不能判断;两个数的值是同一个,应当再比较两个数在内存中eques的值,如果eques相同,则判断两个数相当则不存储
hashSet扩容
- 每次添加操作时,到达阈值因子(原来长度的0.75)就要进行扩容,扩容长度为原来的两倍,比如第一次为16,当到达12时,就会进行扩容到32个长度的数组
- 树化的条件,链表中长度为8,数组长度超过64时,就会进行树化
comparator 与 comparable 比较
- comparable 在实现类中继承comparaTo方法,直接重写排序规则
- comparator 是单独写一个实现类,里面实现排序规则
- 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码
hashMap添加
- 底层就是hashSet的添加