Java集合(一)基本概念

  • Collection划分为:List,Set,Queue
    1. List接口常见有:ArrayList,LinkedList,AbstractList, CopyOnWriteArrayList, Vector,Stack
    2. Set接口常见有:HashSet,TreeSet,LinkedHashSet,AbstractSet,CopyOnWriteArraySet,EnumSet
    3. Queue接口常见有:(阻塞队列)ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue(双端队列)ArrayDeque、LinkedBlockingDeque、LinkedList
  • Map一般使用:Hashmap、Treemap、Hashtable、AbstractMap、ConcurrentHashMap、 LinkedHashMap、WeakHashMap

一、Collection接口

    最基本的集合接口。

二、List接口

    List接口为Collection直接接口。List所代表的的是有序的Collection,即它用凑中特定的插入顺序来维护元素顺序。

    实现List接口的集合主要有:ArrayList、LinkedList、Vecotr、Stack。

   2.1 ArrayList    是一个【标记1】动态数组,也是我们最常用的集合。允许任何符合规则的元素插入,甚至包括null。每个ArrayList都有一个初始容量(10),该容量代表了数组的大小。每次向容器中增加元素的时候都会进行容量检查,数组快溢出时,就会进行扩容操作。扩容操作会浪费时间和效率,最好在操作之前明确插入元素的数量。

  public ArrayList(int initialSize);

    2.2 LinkedList    LinkedList【标记2】是一个双向链表。所以它除了有ArrayList的基本操作方法之外还额外提供了get,remove,insert方法在LinkedList的首部或尾部。LinkedList继承了AbstractSequentialList。LinkedList不能随机访问,它所有的操作都是要按照双重链表的需要执行。在列表中索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。这样做的好处就是可以通过较低的代价在List中进行插入和删除操作。ArrayList和LinkedList都是非同步的。如果多个线程同时访问一个List,必须自己实现访问同步。

    List list = Collections.synchronizedList(new LinkedList(...));

    2.3 Vector    和ArrayList相似,但是Vector是同步的,所以说Vector是线程安全的动态数组。

    2.4 Stack Stack 继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector可以当做堆栈使用。

        push();//将元素入栈

        pop();//删除最后一个元素,并返回该元素的值。

        peek();//得到栈顶元素

        empty();//测试堆栈是否为空

        search();//检测元素在栈内位置

三、Set接口

    Set是一种不包括重复元素的Collection。它维持自己的内部排序,所以随机访问没有任何意义【标记3】。由于Set接口的特殊性,所有传入Set集合的元素都必须不同,同时要注意任何可变对象,如果在对集合元素进行操作时,导致导致e1.equals(e2)==true,则必定会产生某些问题。实现了Set接口的集合有:EnumSet、HashSet、TreeSet。

    3.1 EnumSet 是枚举的专用Set,所有的元素都是枚举类型。

    3.2 HashSet 堪称查询速度最快的集合,因为其内部由HashCode实现,其内部元素的顺序由哈希吗来决定,所以不保证set的迭代顺序。

    3.3TreeSet 基于TreeMap,生成一个总是处于排序状态的Set,内部以TreeMap实现,使用元素的自然顺序对元素进行排序,或根据创建Set时提供的Comparator进行排序,具体排序方式取决于构造方法。

四、Map接口【标记4】

    Map与List、Set接口不同,它是由一系列键值对组成的集合,提供了key到Value的映射。没有继承Collection接口。在Map中它保证了key与value的一一对应关系,所以它不能存在相同的key值,实现map的有:HashMap、TreeMap、HashTable、Properties、EnumMap。

   4.1 HashMap 以哈希表数据结构实现,查找对象时通过哈希函数计算其位置,可以说是为快速查询而设计的,内部定义了一个hash表数组(Entry[] table),通过哈希转换函数将元素的哈希地址转换成数组中存放的索引,如果有冲突,则使用散列链表的形式将所有相同哈希地址的元素穿起来。

    4.2 TreeMap 键以某种排序规则排序,内部以红黑树数据接口实现,实现了SortMap接口

    4.3 HashTable 也以哈希表数据结构实现,解决冲突时与HashMap也一样也是采用了散列链表的形式,不过性能比HashMap要低。

标记1:

    静态数组是在声明时已经确定子数组大小的数组,即数组元素的个数固定不变。

    动态数组并不是真正意义上的动态的内存,而是一块连续的内存,当添加新的元素时,容量已经等于当前的大小的时候(存不下了),执行下面3步

  1. 重新开辟一块大小为当前容量两倍的数组
  2. 把原数据拷贝过去
  3. 释放掉旧的数组

   最后再把这个元素加在后面。

标记2

    1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。

    2.对于随机访问get和set,ArrayList绝对优于LinkedList,因为LinkedList要移动指针。

    3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

    这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。

标记3:set是不能随机存取的,而且set的顺序是不固定的,读的顺序跟存的顺序也不同。set集合是根据哈希值来进行存储。

标记4:

    1、HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。HashMap中元素的排列顺序是不固定的)。

    2、  HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。集合框架”提供两种常规的Map实现:HashMap和TreeMap (TreeMap实现SortedMap接口)。

    3、在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。使用HashMap要求添加的键类明确定义了hashCode()和 equals()的实现。 这个TreeMap没有调优选项,因为该树总处于平衡状态(多看看数据结构)。


来自:

http://www.cnblogs.com/chenssy/p/3495238.html

https://www.cnblogs.com/yyf0309/p/vector.html

==============================================================================

差不多都是对着敲的,抄一遍有助自己理解,chenssy大佬总结的好棒,大家可以多看看他的博客

猜你喜欢

转载自blog.csdn.net/weixin_42615847/article/details/80998623