集合

2019-06-24  本文已影响0人  时光会把你雕刻成你应有的样子

Collection接口是集合的顶层接口,它下面有子接口或者间接的实现类,而具体的实现类中有些可以保存重复元素,有些不能保存重复元素,有些可以保证数据有序,一些则无序

集合框架继承体系

List:list是按照元素的添加顺序来存储对象的,因此是有序的。他的实现类ArrayList、LinkedList、Vector都是有序的。


arrayList:ArrayList是一个可以处理变长数组的类型,这里不局限于“数”组,ArrayList是一个泛型类,可以存放任意类型的对象。


linkedList:在LinkedList的内部实现中,并不是用普通的数组来存放数据的,而是使用结点<Node>来存放数据的,有一个指向链表头的结点first和一个指向链表尾的结点last。不同于ArrayList只能在数组末尾添加数据,LinkList可以很方便在链表头或者链表尾插入数据,或者在指定结点前后插入数据,还提供了取走链表头或链表尾的结点,或取走中间某个结点,还可以查询某个结点是否存在。add()方法默认在链表尾部插入数据。总之,LinkedList提供了大量方便的操作方法,并且它的插入或增加等方法的效率明显高于ArrayList类型,但是查询的效率要低一点,因为它是一个双向链表


因此,LinkedList与ArrayList最大的区别是LinkedList更加灵活,并且部分方法的效率比ArrayList对应方法的效率要高很多,对于数据频繁出入的情况下,并且要求操作要足够灵活,建议使用LinkedList;对于数组变动不大,主要是用来查询的情况下,可以使用ArrayList。


Vector:Vector也是一个类似于ArrayList的可变长度的数组类型,它的内部也是使用数组来存放数据对象的。值得注意的是Vector与ArrayList唯一的区别是,Vector是线程安全的,即它的大部分方法都包含有关键字synchronized,因此,若对于单一线程的应用来说,最好使用ArrayList代替Vector,因为这样效率会快很多(类似的情况有StringBuffer与StringBuilder);而在多线程程序中,为了保证数据的同步和一致性,可以使用Vector代替ArrayList实现同样的功能。


Set:Set是无序的,并且set中的元素不能重复。set的底层实现其实是Map,它是计算key的哈希值来确定元素在数组中的存放位置,所以是无序的,应为在Map中key的值不能重复,所以set中的元素不能重复。它的实现类有:haseSet、TreeSet。


HashSet:内部的数据结构是哈希表,是线程不安全的。HashSet中保证集合中元素是唯一的方法:通过对象的hashCode和equals方法来完成对象唯一性的判断。如果对象的hashCode值不同,则不用判断equals方法,就直接存到HashSet中。 如果对象的hashCode值相同,需要用equals方法进行比较,如果结果为true,则视为相同元素,不存,如果结果为false,视为不同元素,进行存储

注意:如果元素要存储到HashCode中,必须覆盖hashCode方法和equals方法。


TreeSet:可以对Set集合中的元素进行排序,是线程不安全的。TreeSet中判断元素唯一性的方法是:根据比较方法的返回结果是否为0,如果是0,则是相同元素,不存,如果不是0,则是不同元素,存储。

TreeSet对元素进行排序的方式:元素自身具备比较功能,即自然排序,需要实现Comparable接口,并覆盖其compareTo方法。元素自身不具备比较功能,则需要实现Comparator接口,并覆盖其compare方法。

注意:LinkedHashSet是一种有序的Set集合,即其元素的存入和输出的顺序是相同的。


上一篇下一篇

猜你喜欢

热点阅读