目录
Set
Set是Collection的一个子类,Collection是集合的父类,为什么要有集合?
为了提供一个容器用于存储数据,增加相对应的增删改查的方法,进行整体的封装->类
故集合的目的就是为了管理元素(增删改查)。
Set包含我们的TreeSet、HashSet、LinkedHashSet。共同特点:不支持角标操作,不包含重复元素。
TreeSet
TreeSet,首先我们的TreeSet不允许存在重复值,不同步,不安全,适用于我们的单线程,其底层原理是二分搜索树(左孩子<节点<右孩子),进行中序遍历,利用元素的自然顺序对元素进行自然排序。
public class CollectionSet { public static void main(String[] args) { TreeSet<Integer> set = new TreeSet<>(); set.add(7); set.add(4); set.add(8); set.add(3); set.add(5); set.add(6); System.out.println(set); } }
HashSet
HashSet的底层原理则是,我们的数组加链表+红黑树实现的,平均每个链表的长度大于8则转化为红黑树进行实现,平均每个红黑树的长度<6,每个红黑树转化为链表。我们HashSet是存储的我们的哈希值,当我们的哈希值相同的时候,我们比较其内容是否相同,若是内容不同,则放入我们同一链表当中。相同则不进入。
上面的小格是我们的角标,比如我们计算完哈希值之后,觉得它应该进入哪个角标,则就进入相对应的链表之中,故我们的HashMap是无序的。而且我们的HashMap是允许空值进入的。
LinkedHashSet
LinkedHashSet是在我们的HashSet上额外添加了一个额外的双向链表,在程序运行的时候,我们的值进入HashSet的同时,也进入我们的额外链表当中,秉承着先进先出的原则。故它是有序的。其他则和我们的HashSet一致。
Map
Map映射—— 将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值
TreeMap
其底层大致原理与我们的TreeSet大概一致,只不过将存放的值改成跟了键值对,其次比较的时候只比较我们的键的大小。
HashMap
底层 数组+链表/红黑树
允许null 键禁止null 无序 不安全解决哈希冲突的办法 链地址法 把哈希冲突的元素放到同一个桶里面!!!
LinedHashMap
LinkedHashMap 多了一个链表来管理元素的进入顺序 其他和HashMap一样的
HashTable
底层 数组
禁止null 键禁止null 无序 不安全
如果两个元素计算出来的哈希值和要去的哈希角标一致 称之为哈希冲突
Hashtable中 解决哈希冲突的办法 开放地址法+二次哈希 将冲突的元素后置存放将哈希冲突的元素进行后置存放,为了关联哈希值一样的元素,Entry结点中有一个next来进行关联元素
函数功能来自Map
ConcurrentHashMap
具体参考我们的HahsMap,是它的线程安全版,是同步的