Collection:
|--List:有序,可重复,有索引。
|--ArrayList:底层是数组结构。是线程不同步的。 查询速度快。
|--LinkedList:底层是链表结构。是线程不同的。增删速度快。
|--Vector:底层是数组结构。是线程同步的。无论查询和增删,慢就一个字。
|--Set:无序,不可以重复。
|--HashSet:底层是哈希表数据结构,它是如何保证元素唯一性的呢?
是通过元素对象的hashCode方法和equals方法来保证元素唯一性。
先判断元素对象的hash值是否相同。
如果不同:直接存储,不判断equals。
如果相同:在判断一次equals。
如果equals返回false:视为两个对象不同,存储。在一个hash位置进行桶结构的存储。
如果返回true:视为两个元素相同。不存储。
|--TreeSet:可以给Set集合中的元素进行排序。
怎么排的序呢?就是比较嘛。
底层是二叉树数据结构。大于返回正数,小于返回负数,等于返回0;
是如何保证元素唯一性的呢?
只要是比较完的结果是0,就视为同一个元素,不存。
排序有两种方式:
1,让元素自身具备比较性。让元素去实现Comparable接口,覆盖compareTo方法。
这种排序成为该对象的自然顺序。
2,但是元素自身如果没有具备比较性,或者元素自身的具备比较性都是所需要的,这时怎么排序呢?
既然元素无法进行自然排序。
我们可以让集合自身具备比较性,那就是在创建集合时,就要有比较的动作。
既然是创建对象时就要具备,那么一定在构造函数中完成。
Map:
|--Hashtable:底层是哈希表。线程是同步的,不允许null键,null值的存在。被HashMap取代。
|--HashMap:底层是哈希表。线程是不同步的。允许null键,null值的存在。
|--LinkedHashMap:融入了链表结构的哈希表,增删效率很快,可以保证有序(存储和取出的顺序一致)。
|--TreeMap:底层是二叉树,用于给map中的键进行排序。
自己总结的 你可以参考一下 可能会让思路清晰一点 |