1、List,Set都是继承自Collection接口
2、List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
3、List接口有三个实现类:LinkedList,ArrayList,Vector ,Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet
List:
1、Vector、ArrayList都是以类似数组的形式存储在内存中,LinkedList则以链表的形式进行存储。
2、Vector线程同步,ArrayList、LinkedList线程不同步。
3、LinkedList适合指定位置插入、删除操作,不适合查找;ArrayList、Vector适合查找,不适合指定位置的插入、删除操作。
4、ArrayList在元素填满容器时会自动扩充容器大小的50%,而Vector则是100%,因此ArrayList更节省空间。
对List的选择
1)对于随机查询与迭代遍历操作,数组比所有的容器都要快。所以在随机访问中一般使用ArrayList。
2)LinkedList使用双向链表对元素的增加和删除提供了非常好的支持,而ArrayList执行增加和删除元素需要进行元素位移。
3)对于Vector而已,我们一般都是避免使用。(ArrayList可用通过Collections中的方法转换为线程安全类)
4)将ArrayList当做首选,毕竟对于集合元素而已我们都是进行遍历,只有当程序的性能因为List的频繁插入和删除而降低时,再考虑LinkedList。
Set:
Set 里面的去重复原理
set及子类的 方法add.()
其实里面调用了重写之后的equals()和 hashcode()方法 :
重写之后hashcode() 比较是这俩元素对象的哈希值是否是同一个哈希值如果不同讲该元素放到数组中 如果相同返回true就进行equals比较
重写之后equals() 比较这俩元素对象是否是同一个对象 是返回 true 而且不把该元素放到数组中
HashSet 的数据结构
哈希表 = 数组+链表/红黑二叉树(在链表元素大于8个之上就转换为二叉树)
比较的是里面的元素对象的hashcode 是否相同 相同就挂在同一个数组元素下面
如果元素不同 但是哈希值相同这就是哈希值冲突 会进行equals判断 是否为同一个元素
使用 hashset集合来存储自定义类型 该类必须重写hashcode和equals方法再Set集合中才可以进行判断去重复
LinkedHashSet 集合包含了HashSet集合但是在这之上增加了 一条链表是来记录顺序的
所以LinkedHashSet是有序的
对Set的选择
1)HashSet由于使用HashCode实现,所以在某种程度上来说它的性能永远比TreeSet要好,尤其是进行增加和查找操作。
2)虽然TreeSet没有HashSet性能好,但是由于它可以维持元素的排序,所以它还是存在用武之地的。
Map:
Map是一个双列集合接口,如果实现了Map接口,特点是数据以键值对形式存在,键不可重复,值可以重复。java中主要有HashMap、TreeMap、Hashtable。本文主要介绍Map的接口方法:
1 HashMap、TreeMap、Hashtable
HashMap的存储原理:
HashMap 底层也是基于哈希表实现的。往HashMap添加元素的时候,首先会调用键的hashCode方法得到元素 的哈希码值,然后经过运算就可以算出该元素在哈希表中的存储位置。
情况1: 如果算出的位置目前没有任何元素存储,那么该元素可以直接添加到哈希表中。
情况2:如果算出 的位置目前已经存在其他的元素,那么还会调用该元素的equals方法与这个位置上的元素进行比较,如果equals方法返回 的是false,那么该元素允许被存储,如果equals方法返回的是true,那么该元素被视为重复元素,不允存储。
TreeMap存储原理:
TreeMap也是基于红黑树(二叉树)数据结构实现 的, 特点:会对元素的键进行排序存储。
TreeMap 要注意的事项:
1. 往TreeMap添加元素的时候,如果元素的键具备自然顺序,那么就会按照键的自然顺序特性进行排序存储。
2. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性, 那么键所属的类必须要实现Comparable接口,把键的比较规则定义在CompareTo方法上。
3. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性,而且键所属的类也没有实现Comparable接口,那么就必须在创建TreeMap对象的时候传入比较器。
Hashtable存储原理:
底层也是hash表实现,实现方式和HashMap一致,但是hashTable是线程安全的,操作效率低。
补充:如何选择合适的Map
- HashMap可实现快速存储和检索,但其缺点是其包含的元素是无序的,这导致它在存在大量迭代的情况下表现不佳。
- LinkedHashMap保留了HashMap的优势,且其包含的元素是有序的。它在有大量迭代的情况下表现更好。
- TreeMap能便捷的实现对其内部元素的各种排序,但其一般性能比前两种map差。
LinkedHashMap映射减少了HashMap排序中的混乱,且不会导致TreeMap的性能损失。
对Map的选择
1)HashMap与HashSet同样,支持快速查询。虽然HashTable速度的速度也不慢,但是在HashMap面前还是稍微慢了些,所以HashMap在查询方面可以取代HashTable。
2)由于TreeMap需要维持内部元素的顺序,所以它通常要比HashMap和HashTable慢。