Java中各种集合问题

一,java种集合关系图

Collection                接口的接口                   对象的集合

--List          子接口 有序 可重复

  --LinkedList                接口实现类  链表  插入删除  没有同步  线程不安全

  --ArrayList                  接口实现类  数组  随机访问  没有同步  线程不安全

  --Vector                      接口实现类  数组               同步        线程安全

    --Stack

--Set                              子接口  仅接收一次,并做内部排序  不可重复

  --HashSet

    --LinkedHashSet

  --TreeSet

Map                       接口                            键值对的集合

--Hashtable            接口实现类  同步        线程安全     不可以储存null值

--HashMap                        接口实现类  没有同步   线程不安全  可以储存null值

  --LinkedHashMap

  --WeakHashMap

--TreeMap

--IdentifyHashMap

Map采用哈希散列,查找元素时比ArrayList快

二、详细介绍

1、List接口

  1.1 次序是List最重要的特点,能够用索引来访问元素,允许有相同元素;

  1.2 除了Collection接口必备的iterator()方法,List提供了一个listIterator()方法,允许添加删除,设定元素,向前向后遍历;

  LinkedList:对顺序访问进行了优化,随机访问相对较慢

  1.3 LinkedList允许null值,提供了addFirst(),getFirst()等方法在LinkedList的首部或尾部,使linkedList可被用作堆栈,队列或双向队列;

  1.4 LinkedList没有同步方法,如果多线程访问时,必须自己实现访问同步

    如  List list=Collection.synchronizedList(new LinkedList(...));

  ArrayList:向List中间插入与移除元素的速度很慢,随机访问相对较快

  1.5 ArrayList有数组实现,允许所有元素,包括null

  1.6  ListIterator 只应该用来由后向前遍历 ArrayList, 而不是用来插入和移除元素。因为那比 LinkedList 开销要大很多;

  Vector:

  1.7 由Vector创建的iterator被创建而且正在被使用,另一线程改变了vector的状态,这时调用 Iterator 的方法时将抛出 ConcurrentModificationException ,因此必须捕获该异常

  Stack:

  1.8 实现一个后进先出的堆栈,Stack 提供 5 个额外的方法使得 Vector 得以被当作堆栈使用。基本的 push 和 pop 方法,还有 peek 方法得到栈顶的元素, empty 方法测试堆栈是否为空, search 方法检测一个元素在堆栈中的位置。 Stack 刚创建后是空栈;

2 Set接口

  2.1 set不保证维护元素的次序,最多有一个null值;

  2.2 Set的构造函数有一个约束条件 ,传入的Collection参数不能包含重复的元素;

  HashSet:

  LinkedHashSet:

  TreeSet:

3.Map接口

  3.1 可以用containsKey()和containsValue()测试Map中是否包含某个”键”或“值”,有内置的排序;

  3.2 HsahMap使用对象的hashCode()进行快速查询,“散列码”是“相对唯一”用以代表对象的 int 值,它是通过将该对象的某些信息进行转换而生成的,所有 Java 对象都能产生散列码,因为 hashCode() 是定义在基类 Object 中的方法;

  HashTable:

  3.3 实现了一个key-value映射的哈希表,任何非空对象都可以作为key或者value;

  3.4 添加数据put,去除数据get;

  3.5 Hashtable 通过初始化容量 (initial capacity) 和负载因子 (load factor) 两个参数调整性能,通常缺省的 load factor 0.75 较好地实现了时间和空间的均衡。增大 load factor 可以节省空间但相应的查找时间将增大,这会影响像 get 和 put 这样的操作;

  3.6 作为key的对象将通过计算散列函数来确定与之对应的value的位置,因此任何作为 key 的对象都必须实现 hashCode 方法和 equals 方法。hashCode 方法和 equals 方法继承自根类 Object ,如果你用自定义的类当作 key 的话,要相当小心,按照散列函数的定义,如果两个对象相同,即 obj1.equals(obj2)=true ,则它们的 hashCode 必须相同,但如果两个对象不同,则它们的 hashCode 不一定不同,如果两个不同对象的 hashCode 相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的 hashCode() 方法,能加快哈希表的操作;

  HashMap:

  3.7 hashmap非同步,允许null值。将 HashMap 视为 Collection 时( values() 方法可返回 Collection ),插入和查询“键值对”的开销是固定的,但其迭代子操作时间开销和 HashMap 的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将 HashMap 的初始化容量 (initial capacity) 设得过高,或者负载因子 (load factor) 过低;

  LinkedHashMap

  3.8 类似于 HashMap ,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用 (LRU) 的次序。只比 HashMap 慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序;

  WeakHashMap:

  3.9 弱键( weak key ) Map 是一种改进的 HashMap ,它是为解决特殊问题设计的,对 key 实行 “ 弱引用 ” ,如果一个 key 不再被外部所引用(没有 map 之外的引用),那么该 key 可以被垃圾收集器 (GC) 回收;

  TreeMap:

  基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序 ( 次序由 Comparabel 或 Comparator 决定 ) 。 TreeMap 的特点在于,你得到的结果是经过排序的。 TreeMap 是唯一的带有 subMap() 方法的 Map ,它可以返回一个子树;

  IdentifyHashMap:

  使用 == 代替 equals() 对“键”作比较的 hash map 。专为解决特殊问题而设计。

三  比较

1.数组(Array) 数组类(Arrays)

  1.1 java存储及随机访问一连串对象时,array最有效率,但缺点是容量固定且无法动态改变,无法判断实际存在多少元素,length为容量;

  1.2 数组类专门操作数组,数组类拥有一组static函数:equals() ,fill() ,sort(),binarySearch() 在排好序的array中查找元素 ,System.arraycopy() array复制;

  1.3 若编写程序时不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库, array 不适用;

2.容器(Collection)和map

  2.1 collection每个位置只有一个元素;map持有key-value对,像个小型数据库 ( Collections.max(Collection coll); 取 coll 中最大的元素);

四、总结

1 List,Set,Map将持有对象一律视为object型别;

2 Collection 、 List 、 Set 、 Map 都是接口,不能实例化。继承自它们的 ArrayList, Vector, HashTable, HashMap 是具象 class ,这些才可被实例化;

3 使用keySet()抽取key序列,将 map 中的所有 keys 生成一个 Set(不可重复);

使用 values() 抽取 value 序列,将 map 中的所有 values 生成一个 Collection ;

4 在各种 Lists ,对于需要快速插入,删除元素,应该使用 LinkedList (可用 LinkedList 构造堆栈 stack 、队列 queue ),如果需要快速随机访问元素,应该使用 ArrayList 。最好的做法是以 ArrayList 作为缺省选择。 Vector 总是比 ArrayList 慢,所以要尽量避免使用;

5 在各种 Sets 中, HashSet 通常优于 HashTree (插入、查找)。只有当需要产生一个经过排序的序列,才用 TreeSet 。 HashTree 存在的唯一理由:能够维护其内元素的排序状态;在各种 Maps 中 HashMap 用于快速查找

6 当元素个数固定,用 Array ,因为 Array 效率是最高的

原文:http://blog.csdn.net/jackie03/article/details/7312481

时间: 2024-10-09 21:17:10

Java中各种集合问题的相关文章

java中的集合框架

由于数组具有属性单一,长度不可改变的缺点,于是在程序中我们使用集合来代替它. 集合中不可放入基本数据类型,基本数据类型都是通过自动拆包和自动装箱功能才能放入和取出集合. 分类:Collection接口和Map接口 Collection:存放单一值元素,又可分为list接口类型和set接口类型 list接口类型:存放元素是有序的可重复的,可通过循环来取出其中的元素,实现类ArrayList() set接口类型:hash值排列,存放元素是无序不可重复的,通过指针取出其中元素,实现类HashSet()

菜鸟日记之 java中的集合框架

java中的集合框架图 如图所示:java中的集合分为两种Collection和Map两种接口 可分为Collection是单列集合和Map的双列集合 Collection单列集合:继承了Iterator接口所以具有了iterator()方法 ,该方法返回一个Iterator<T>,这个接口具有 HasNext (),next(),remove()3个方法可以在实现类里完成实现. hasNext():判断是否有下一个元素 cusor是当前的操作下标 next():读取下一个元素 remove(

java中的集合操作类(未完待续)

申明: 实习生的肤浅理解,如发现有错误之处,还望大牛们多多指点 废话 其实我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList<XXXXX>(); 但是我仅仅只是了解,list这个类是一个可变长用来存储的对象实例的类,我甚至觉得这个List对象可以理解成数组,但是却又与java中咱们正常理解的数组很多的不同,比如说,他的长度可以随着需要自动增长,比如说,实例化一个List类就和咱们声明数组的时候是不一样的! 今天的实习生活

java中TreeSet集合如何实现元素的判重

1 /* 2 看一下部分的TreeSet源码.... 3 public class TreeSet<E> extends AbstractSet<E> 4 implements NavigableSet<E>, Cloneable, java.io.Serializable 5 { 6 private transient NavigableMap<E,Object> m; 7 //NavigableMap继承SortedMap, 二者都是接口,在TreeMa

java中list集合的内容,如何使用像数据库中group by形式那样排序

java中list集合的内容,如何使用像数据库中group by形式那样排序,比如:有一个 List<JavaBean> 他中包含了一些如下的内容JavaBean:name    money(名称)  (金额) 来源A   100来源B   200来源C   300来源B   6600来源A   99800<数据1> 最后想实现的是:如果假设这些数据在数据库中,那么通过 select name,sum(money) from Table group by name 该语句得到的Li

java中各种集合的用法和比较

一,java中各种集合的关系图 Collection       接口的接口     对象的集合 ├ List             子接口         按进入先后有序保存   可重复 │├ LinkedList    接口实现类     链表     插入删除   没有同步   线程不安全 │├ ArrayList     接口实现类      数组     随机访问   没有同步   线程不安全 │└ Vector        接口实现类       数组              

Java中的集合框架(上)

Java中的集合框架概述 集合的概念: Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象. 集合的作用: 1.在类的内部,对数据进行组织: 2.简单的快速的搜索大数据量的条目: 3.有的集合接口,提供了一系列排列有序的元素,并且 可以在序列中间快速的插入或删除有关的元素. 4.有的集合接口,提供了映射关系,可以通过 关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型. 与数组的对比一为何选择集合而不是数组 1.数组的长度固定,集合长度可变 2.数

Java 中的集合接口——List、Set、Map

Java 中的集合接口——List.Set.Map 什么叫集合:集合就是Java API所提供的一系列类的实例,可以用于动态存放多个对象.这跟我们学过的数组差不多,那为什么我们还要学集合,我们看看数组跟集合有什么区别: 数组:长度固定,遍历速度快 可以存储基本类型和引用类型: 集合:长度不固定,只能存储引用类型对象: 从数组跟集合的特点我们很明显的看出,数组有一定的局限性,如果我们需要不定期的往我们的数据中存储数据,数组就满足不了我们的要求. Java集合框架提供了一套性能优良.使用方便的接口和

JAVA笔记整理(九),JAVA中的集合

在工作中,我们经常需要将多个对象集中存放,可以使用数组,但是数组的长度一旦固定之后是不可变的,为了保存数量确定的数据,我们可以使用JAVA中的集合. 在我看来,JAVA中的集合可以看作是一个特殊的数据库,可以针对这个数据库进行数据的增删查改,可以查看数据库的大小,查看数据库是否为空等等. JAVA中的集合是由Collection和Map两个接口派生出来的,正因为是两个接口,所以只能通过其子类来将其实例化,下图为常用集合: Collection是List.Queue和Set接口的父接口,Map是H

Java中的集合框架-Map

前两篇<Java中的集合框架-Commection(一)>和<Java中的集合框架-Commection(二)>把集合框架中的Collection开发常用知识点作了一下记录,从本篇开始,对集合框架里的另外一部分Map作一下记录. 一,集合框架的Map接口 Map与Collection不同之处在于它是以键值对来存储数据: Map比较常用的实现类有四个:HashTable,HashMap,LinkedHashMap,TreeMap: Map的方法也可以分为四类,增删改查,大致如下: 新