`
yjyj001
  • 浏览: 132668 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Vector List Collection Map HashMap HashTable

阅读更多
ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快! 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构。这些类均在java.util包中。本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类。  Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap Collection接口   Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。   所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。   如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:     Iterator it = collection.iterator(); // 获得一个迭代子     while(it.hasNext()) {       Object obj = it.next(); // 得到下一个元素     }   由Collection接口派生的两个接口是List和Set。 List接口   List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。 和下面要提到的Set不同,List允许有相同的元素。   除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。   实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。 LinkedList类   LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。   注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:     List list = Collections.synchronizedList(new LinkedList(...)); ArrayList类   ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。 size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。   每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。   和LinkedList一样,ArrayList也是非同步的(unsynchronized)。 Vector类   Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。 Stack 类   Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。 Set接口   Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。   很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。   请注意:必须小心操作可变对象(Mutable Object)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。 Map接口   请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。 Hashtable类   Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。   添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。 Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。 使用Hashtable的简单示例如下,将1,2,3放到Hashtable中,他们的key分别是”one”,”two”,”three”:     Hashtable numbers = new Hashtable();     numbers.put(“one”, new Integer(1));     numbers.put(“two”, new Integer(2));     numbers.put(“three”, new Integer(3));   要取出一个数,比如2,用相应的key:     Integer n = (Integer)numbers.get(“two”);     System.out.println(“two = ” + n);   由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。   如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条:要同时复写equals方法和hashCode方法,而不要只写其中一个。   Hashtable是同步的。 HashMap类   HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。 WeakHashMap类   WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。 总结   如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。   如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。   要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。   尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。
分享到:
评论

相关推荐

    List、ArrayList、Vector及map、HashTable、HashMap分别的区别

    List、ArrayList、Vector及map、HashTable、HashMap分别的区别 List、ArrayList、Vector及map、HashTable、HashMap是Java容器类中的几个重要的接口和实现类,了解它们之间的区别是非常重要的。 首先,我们来看List...

    Collection,List,Set和_Map用法和区别

    Collection, List, Set 和 Map 用法和区别 Collection 是 Java 中的一种对象集合,提供了许多有用的方法来操作集合元素,例如添加、删除、遍历等。Collection 是一个接口,下面有两个子接口:List 和 Set。 List ...

    collection,map的区分

    Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别2008-03-30 13:27 这几天这个论坛还处在各个方法的设计阶段,也写了一部分,现在又遇到了这样的问题,怎么保存大量对象。。。的,查了...

    java集合类面试题总结

    List 中包括 ArrayList、LinkedList、Vector 等,Set 中包括 HashSet、LinkedHashSet 等,Map 中包括 HashMap、Hashtable 等。 List、Set、Map 是否继承自 Collection 接口 List 和 Set 继承自 Collection 接口,...

    Java集合类List-Set-Map的区别和联系.doc

    集合类库是指 Collection、List、Set 和 Map,它们是 Java 中提供的集合类库,用于存储和操作数据。 二、Collection 和 Map Collection 是一个接口,提供了存储和操作数据的方法,它有两个子接口:List 和 Set。...

    JavaSE 笔试 精华

    Collection List LinkedList ArrayList Vector Stack Set HashSet Map HashMap Dictionary Hashtable Comparetor 2. Vector和ArrayList、LinkedList区别? Hashtable 和 HashMap之间的区别 LinkedList内部以链表...

    农行研发中心-校招常见面试题汇总.pdf

    Map接口的实现类有HashMap、HashTable、LinkedHashMap等。 2. 数组和集合的区别 数组和集合是Java语言中两种不同的数据结构。数组是一种固定大小的、同类型的元素组成的数据结构,而集合是一个可变大小的、可存储...

    Java基础部分 Java代码查错算法与编程html&JavaScript&ajax部分面试题

    60、HashMap和Hashtable的区别 2 61、List 和 Map 区别? 2 62、List, Set, Map是否继承自Collection接口? 2 63、List、Map、Set三个接口,存取元素时,各有什么特点? 2 64、说出ArrayList,Vector, LinkedList的存储...

    Java 容器类的解析及对比

    该资源为本人面试前整理的Java容器类的资料,分析描述了Collection、List、ArrayList、Vector及map、HashTable、HashMap区别,可用来复习。

    java collection总结-流氓版

    本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类,ArrayList Vector HashMap Hashtable

    java面试宝典

    66、HashMap和Hashtable的区别 17 67、说出ArrayList,Vector, LinkedList的存储性能和特性 17 68、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 17 69、文件读写的...

    Java 最常见的 208 道面试题:第二模块答案

    20. List、 Set、 Map 之间的区别是什么? 21. HashMap 和 Hashtable 有什么区别? 22. 如何决定使用 HashMap 还是 TreeMap? 23. 说一下 HashMap 的实现原理? 24. 说一下 HashSet 的实现原理? 25. ArrayList 和 ...

    Java期末复习-类集框架

    SortedMap接口、HashMap类、Hashtable类、Properties类、Map.Entry接口、WeakHashMap类、IndentityHashMap类 集合输出: Iterator、ListIterator、foreach、废除的Enumeration Collections工具类 Comparable接口、...

    Java集合面试题 52道

    Map 接口的实现类主要有 HashMap、TreeMap、Hashtable、ConcurrentHashMap 等;Set 接口的实现类主要有 HashSet、TreeSet、LinkedHashSet 等;List 接口的实现类主要有 ArrayList、LinkedList、Stack 等。 6. List...

    Java题目基础面试资料.doc

    HashMap 和 Hashtable 是 Java 中两个常用的 Map 实现类。它们的主要区别在于历史原因、同步性和值。Hashtable 是基于陈旧的 Dictionary 类的,HashMap 是 Java 1.2 引进的 Map 接口的一个实现。Hashtable 是线程...

    java集合分类总结.doc

    Map集合的主要实现类有HashMap、Hashtable、TreeMap等。HashMap是哈希表实现的,key不能重复,但是value可以重复。Hashtable是线程安全的,key和value不能为null。TreeMap是对key排好序的Map,key必须实现Comparable...

    Java 容器.pdf_电子版pdf版

    3. HashTable:和 HashMap 类似,但它是线程安全的,这意味着同一时刻多个线程可以同时写入 HashTable 并且不会导致数据不一致。 4. LinkedHashMap:使用双向链表来维护元素的顺序,顺序为插入顺序或者最近最少使用...

    中软国际Java程序员笔试题及答案.pdf

    HashMap和Hashtable都是Map接口的类,实现了将惟一键映射到特定的值上。HashMap类没有分类或者排序。它允许一个null键和多个null值。Hashtable类似于HashMap,但是不允许null键和null值。它也比HashMap慢,因为它是...

    Java集合框架常见面试题.pdf

    它提供了多种集合类,包括 List、Set、Map 等,每种集合类都有其特点和用途。 List 集合 List 集合是一种有序、可重复的集合,元素可以是任何类型的对象。List 集合可以按索引访问元素,元素的顺序是固定的。 Set...

    中软国际Java程序员笔试题及答案.doc

    * List 和 Set 是 Collection 接口的子接口,Map 不是。 8. ArrayList 和 Vector 的区别: * 同步性:Vector 是线程安全的,而 ArrayList 不是。 * 数据增长:Vector 默认增长为原来的一倍,而 ArrayList 是原来的...

Global site tag (gtag.js) - Google Analytics