JAVA集合类用法总结.doc_第1页
JAVA集合类用法总结.doc_第2页
JAVA集合类用法总结.doc_第3页
JAVA集合类用法总结.doc_第4页
JAVA集合类用法总结.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

java中的集合类总结2008年09月28日 星期日 下午 12:39在使用Java的时候,我们都会遇到使用集合(Collection)的时候,但是Java API提供了多种集合的实现,我在使用和面试的时候频频遇到这样的“抉择” 。 :)(主要还是面试的时候)久而久之,也就有了一点点的心得体会,写出来以供大家讨论 。总的说来,Java API中所用的集合类,都是实现了Collection接口,他的一个类继承结构如下:Collection-List-VectorCollection-List-ArrayListCollection-List-LinkedListCollection-Set-HashSetCollection-Set-HashSet-LinkedHashSetCollection-Set-SortedSetuser2.getId) return 1;else if(user1.getId=user2.getId) return 0;return -1; classTestComparator public static void main(String args) TestComparator.test();public static void test()Set set=new TreeSet(new MyComparator();Users user1=newUsers(张三,17);Users user2=newUsers(李四,13);Users user3=newUsers(王五,19);Users user5=new Users(王五,19);set.add(user1);set.add(user2);set.add(user3);set.add(user5);for(Object obj :set)System.out.println(obj); 2、自然排序,将需要排序的那个类实现Comparable接口并且重写其中的compareTo方法例如下:class Usersimplements Comparable private String name; private int id; public Users(String name,int id) =name;this.id=id; public void setName(String name) =name; public String getName() return name; public void setId(int id) this.id=id; public int getId() return id; /这里重写了父类的toString方法 public String toString() return + t + this.id + t;/重写compareTo方法 public int compareTo(Object o) UserBean user = (UserBean) o; if (this.id user.id) return 1; else if (this.id = user.id) return 0;return -1; 3.如果是HashSet自然排序,则要求排序的类重写hashCode方法和equals方法二、对List和Set集进行遍历: List集有三种方法进行遍历: 1、通过下标遍历,2使用迭代器进行遍历,3、增强循环进行遍历 List list=new ArrayList(); list.add(aa); list.add(bb); list.add(cc); for(int i=0;ilist.size();i+)System.out.println(list.get(i); Iterator it=list.iterator(); while(it.hasNext() System.out.println(it.next(); for(Object obj :list)System.out.println(obj);三、Vector和ArrayList的区别:1、Vector 和ArrayList都实现了List接口,Vector是线程安全的,可以多个线程同时访问,但性能比较差2、ArrayList线程不安全,不支持多个线程同时访问,但性能比较好,访问的速度快四、Map集是以键值对的形式存放的,键不可以重复,值可以重复,如果键重复,会将原来的值覆盖, Map集的实现类主要有三个:HashMap,TreeMap,HashTableHashMap与HashTable 的区别: 1、HashTable是线程安全的,支持同步。2、HashMap线程不安全,不支持同步,但性能比HashTable好Map集的遍历:1、Map map=new HashMap()map.put(1,张飞);map.put(2,关羽);map.put(3,刘备);/得到键的集合Set set=map.keySet();for(Object obj :set)System.out.println(map.get(obj);2、/得到健值对的集合Set s=map.entrySet(); for(Object obj :set)System.out.println(obj); 五、对List集进行客户化排序,可以通过Collections类的sort方法,要求传一个List集和一个Comparator对象 例:List list=new ArrayList()Users user1=newUsers(张三,17);Users user2=newUsers(李四,13);Users user3=newUsers(王五,19);Users user5=new Users(王五,19);list.add(user1);list.add(user2);list.add(user3);list.add(user5);Collections.sort(list,new Mycomparator();Iterator it=list.iterator();while(it.hasNext() System.out.println(it.next();JAVA中的集合类(2007-01-05 19:22:11) 分类:培训笔记为什么要使用集合类当你事先不知道要存放数据的个数,或者你需要一种比数组下标存取机制更灵活的方法时,你就需要用到集合类。理解集合类集合类存放于java.util包中。集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。集合类型主要有3种:set(集)、list(列表)和map(映射)。(1)集集(set)是最简单的一种集合,它的对象不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。对集中成员的访问和操作是通过集中对象的引用进行的,所以集中不能有重复对象。集也有多种变体,可以实现排序等功能,如TreeSet,它把对象添加到集中的操作将变为按照某种比较规则将其插入到有序的对象序列中。它实现的是SortedSet接口,也就是加入了对象比较的方法。通过对集中的对象迭代,我们可以得到一个升序的对象集合。(2)列表列表的主要特征是其对象以线性方式存储,没有特定顺序,只有一个开头和一个结尾,当然,它与根本没有顺序的集是不同的。列表在数据结构中分别表现为:数组和向量、链表、堆栈、队列。关于实现列表的集合类,是我们日常工作中经常用到的,将在后边的笔记详细介绍。(3)映射映射与集或列表有明显区别,映射中每个项都是成对的。映射中存储的每个对象都有一个相关的关键字(Key)对象,关键字决定了对象在映射中的存储位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样。关键字应该是唯一的。关键字本身并不能决定对象的存储位置,它需要对过一种散列(hashing)技术来处理,产生一个被称作散列码(hash code)的整数值,散列码通常用作一个偏置量,该偏置量是相对于分配给映射的内存区域起始位置的,由此确定关键字/对象对的存储位置。理想情况下,散列处理应该产生给定范围内均匀分布的值,而且每个关键字应得到不同的散列码。 集合类简介 java.util中共有13个类可用于管理集合对象,它们支持集、列表或映射等集合,以下是这些类的简单介绍集:HashSet: 使用HashMap的一个集的实现。虽然集定义成无序,但必须存在某种方法能相当高效地找到一个对象。使用一个HashMap对象实现集的存储和检索操作是在固定时间内实现的.TreeSet: 在集中以升序对对象排序的集的实现。这意味着从一个TreeSet对象获得第一个迭代器将按升序提供对象。TreeSet类使用了一个TreeMap.列表:Vector: 实现一个类似数组一样的表,自动增加容量来容纳你所需的元素。使用下标存储和检索对象就象在一个标准的数组中一样。你也可以用一个迭代器从一个Vector中检索对象。Vector是唯一的同步容器类?当两个或多个线程同时访问时也是性能良好的。Stsck: 这个类从Vector派生而来,并且增加了方法实现栈?一种后进先出的存储结构。LinkedList: 实现一个链表。由这个类定义的链表也可以像栈或队列一样被使用。ArrayList: 实现一个数组,它的规模可变并且能像链表一样被访问。它提供的功能类似Vector类但不同步。映射:HashTable: 实现一个映象,所有的键必须非空。为了能高效的工作,定义键的类必须实现hashcode()方法和equal()方法。这个类是前面java实现的一个继承,并且通常能在实现映象的其他类中更好的使用。HashMap: 实现一个映象,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个)。WeakHashMap: 实现这样一个映象:通常如果一个键对一个对象而言不再被引用,键/对象对将被舍弃。这与HashMap形成对照,映象中的键维持键/对象对的生命周期,尽管使用映象的程序不再有对键的引用,并且因此不能检索对象。TreeMap: 实现这样一个映象,对象是按键升序排列的。Set和List都是由公共接口Collection扩展而来,所以它们都可以使用一个类型为Collection的变量来引用。这就意味着任何列表或集构成的集合都可以用这种方式引用,只有映射类除外(但也不是完全排除在外,因为可以从映射获得一个列表。)所以说,把一个列表或集传递给方法的标准途径是使用Collection类型的参数。 Vector 还是ArrayList,哪一个更好,为什么? 要回答这个问题不能一概而论,有时候使用Vector比较好;有时是ArrayList,有时候这两个都不是最好的选择。你别指望能够获得一个简单肯定答案,因为这要看你用它们干什么。下面有4个要考虑的因素:(1)API(2)同步处理(3)数据增长性(4)使用模式下面针对这4个方面进行一一探讨API在由Ken Arnold等编著的Java Programming Language(Addison-Wesley, June 2000)一书中有这样的描述,Vector类似于ArrayList.。所有从API的角度来看这两个类非常相似。但他们之间也还是有一些主要的区别的。同步性Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。数据增长从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。使用模式在ArrayList和Vector中,从一个指定的位置(通过索引)查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用O(1)表示。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢?这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是其他操作,你最好选择其他的集合操作类。比如,LinkLi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论