Java篇--集合

来源:互联网 发布:php blog 模板 编辑:程序博客网 时间:2024/06/06 04:57

Collection

Collection函数库是在java.util包下的一些接口和类,类是用来产生对象存放数据用的,而接口是访问数据的方式。 
与数组的区别:
       (1)数组的容量是有限制的,而Collection库没有限制,它的容量可以自动调节。
       (2)Collection函数库只能用来存放对象,而数组没有这样的限制。

 


Collection接口是Collection层次结构中的根接口,存放于其中的数据,被称为元素(element);
  • List接口:有序可重复。
  • Set接口:无序不可重复。
  • Map接口:存放键值对,根据键找到值(value),键(key)不能重复。(解决通过一个对象找到另一个对象)
  • ArrayListz:底层实现是数组,所以查询快,插入、修改、删除数度慢。线程不安全,效率高。
  • LinkedList:底层实现是链表,所以查询慢,插入、修改、删除速度快。线程不安全,效率高。
  • Vector:底层也是用数组实现的,线程安全,效率低。
  • HashMap:效率高,线程不安全。键可以有一个null,值可以有多个null。
  • HashTable:效率低,线程安全。任何非null对象都可以作为键和值。
  • TreeMap:
  • HashSet:底层是通过hashMap实现的。Set的不可重复就是利用了Map里的键对象的不可重复。
  • TreeSet: 
所有实现了Coll接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。


ArrayList

      底层实现是数组,访问元素效率高 (查询快,插入、修改、删除元素慢)
      与LinkedList相比,它效率高,但线程不安全
      ArrayList数组是一个可变数组 ,可以存取包括null在内的所有元素
            - 每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小。
            - 随着向ArrayList中不断添加元素,其容量自动增长
            - 在添加大量元素前,应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量,这样可以减少递增式再分配的数量。
      - 所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。


LinkedList

      底层实现是双向循环链表,所以增删元素效率高,查询慢。
     线程安全
ArrayList和LinkedList比较
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
      这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。


Vector

      与ArrayList相似,但是Vector是同步的。所以说Vector是线程安全的动态数组。它的操作与ArrayList几乎一样。
      ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!
     1,vector是线程同步的,所以它也是线程安全的,而arraylist是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用arraylist效率比较高。
     2,如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组长度的100%,而arraylist增长率为目前数组长度的50%.如过在集合中使用数据量比较大的数据,用vector有一定的优势。
     3,如果查找一个指定位置的数据,vector和arraylist使用的时间是相同的,都是0(1),这个时候使用vector和arraylist都可以。而如果移动一个指定位置的数据花费的时间为0(n-i)n为总长度,这个时候就应该考虑到使用linklist,因为它移动一个指定位置的数据所花费的时间为0(1),而查询一个指定位置的数据时花费的时间为0(i)。


TreeSet

底层是一棵排序树,实现Comparable接口


Iterator

Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作。
Iterator接口定义如下方法:
      boolean  hasNext();    //判断是否有元素没有被遍历
      Object  next();      //返回游标当前位置的元素并将游标移动到下一个位置
      void remove();      //删除游标左面的元素,在执行完next之后该操作只能执行一次

HashMap

底层使用哈希存储来保存键值对中的键
    HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
    hashCode 根据地址生成的一个数(哈希码)。
 
       在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

从上图中可以看出,HashMap底层就是一个数组结构,数组中的每一项又是一个链表。链表里放Entry。当新建一个HashMap的时候,就会初始化一个数组。


TreeMap 

底层使用排序树来存储键值对中的键
HashMap和TreeMap比较
 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没有调优选项,因为该树总处于平衡状态。
 
HashTable
      
也是以哈希表数据结构实现的,解决冲突时与HashMap也一样也是采用了散列链表的形式,不过性能比HashMap要低.
HashMap和Hashtable比较:
1、历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。
2、同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的。
3、值:只有HashMap可以让你将空值作为一个表的条目的key或value 。

原创粉丝点击