Collection
List
有序的colletion(也称为序列)
此接口的用户可以对列表中的每个元素的插入位置进行精确的控制,
用户可以根据元素的整数索引(在列表中的位置)来访问元素,
并搜索列表中的元素.
元素都有下标
数据是有序的
允许存放重复的元素
ArrayList
存在java.util包中
内部是用数组结构存放数据,封装数组的操作,每个对象都有下标
内部数组默认的初始容量是10,如果不够会以1.5倍的容量增长
查询快,增删数据效率会低 适合查询较多的场景
LinkedList
链表,两端效率高,底层就是链表实现的
查询慢 增删快 适合增删操作较多的场景
LinkedList 查询慢是指数据量大时 查询中间要慢 首位操作还是比较快的
Set
Set是一个不包含重复数据的Collection
Set集合中的数据是无序的(因为Set集合没有下标)
Set集合中的元素不可以重复 – 常用来给数据去重
数据无序且数据不允许重复
HashSet
底层是哈希表,包装了HashMap,相当于向HashSet中存入数据时,会把数据作为K存入内部的HashMap中,其中K不允许重复,允许使用null.
如果set中存放的是我们自定义的类型
需要给自定义类中添加重写的equals()与hashCode(),才会去重
不然会认为s2和s3的地址值不同,是两个不同的对象,不会去重
TreeSet
底层是TreeMap,也是红黑树的形式,便于查找数据
Map
Java.util接口Map<K,V>
类型参数 : K - 表示此映射所维护的键 V – 表示此映射所维护的对应的值
也叫做哈希表、散列表. 常用于键值对结构的数据.其中键不能重复,值可以重复
Map可以根据键来提取对应的值
Map的键不允许重复,如果重复,对应的值会被覆盖
Map存放的都是无序的数据
Map的初始容量是16,默认的加载因子是0.75
value可以重复
key不允许重复,如果重复,后面的value会把前面的value覆盖掉
HashMap
HashMap的键要同时重写hashCode()和equlas()
hashCode()用来判定二者的hash值是否相同,重写后根据属性生成
equlas()用来判断属性的值是否相同,重写后,根据属性判断
–equlas()判断数据如果相等,hashCode()必须相同
–equlas()判断数据如果不等,hashCode()尽量不同
HashMap的结构是数组+链表 或者 数组+红黑树 的形式
HashMap底层的Entry[ ]数组,初始容量为16,加载因子是0.75f,扩容按约为2倍扩容
当存放数据时,会根据hash(key)%n算法来计算数据的存放位置,n就是数组的长度,其实也就是集合的容量
当计算到的位置之前没有存过数据的时候,会直接存放数据
当计算的位置,有数据时,会发生hash冲突/hash碰撞
解决的办法就是采用链表的结构,在数组中指定位置处以后元素之后插入新的元素
也就是说数组中的元素都是最早加入的节点
如果链表的长度>8且数组长度>64时,链表会转为红黑树,当链表的长度<6时,红黑树会重新恢复成链表
默认的加载因子是0.75,也就是说存到75%开始扩容,按照2的次幂进行
扩容到容量的加载因子后,就会重新开辟空间,重新计算所有对象的存储位置,也叫做rehash
设置初始容量与加载因子要讲求相对平衡,如果加载因子过低,则rehash过于频繁,影响性能
如果初始容量设置太高或者加载因子设置太高,影响查询效率