欢迎来到天天文库
浏览记录
ID:22227148
大小:287.50 KB
页数:48页
时间:2018-10-27
《Java集合Collection、List、Set、Map使用详解》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
----------专业最好文档,专业为你服务,急你所急,供你所需-------------文档下载最佳的地方Java集合排序及java集合类详解(Collection,List,Set,Map)摘要内容集合是Java里面最常用的,也是最重要的一部分。能够用好集合和理解好集合对于做Java程序的开发拥有无比的好处。本文详细解释了关于Java中的集合是如何实现的,以及他们的实现原理。目录1 集合框架21.1 集合框架概述21.1.1 容器简介21.1.2 容器的分类51.2 Collection61.2.1 常用方法61.2.2 迭代器91.3 List111.3.1 概述111.3.2 常用方法121.3.3 实现原理171.4 Map201.4.1 概述201.4.2 常用方法211.4.3 Comparable接口271.4.4 实现原理291.4.5 覆写hashCode()341.5 Set391.5.1 概述391.5.2 常用方法391.5.3 实现原理451.6 总结:集合框架中常用类比较462 练习473 附录:排序481 集合框架----------专业最好文档,专业为你服务,急你所急,供你所需-------------文档下载最佳的地方 ----------专业最好文档,专业为你服务,急你所急,供你所需-------------文档下载最佳的地方1.1 集合框架概述1.1.1 容器简介到目前为止,我们已经学习了如何创建多个不同的对象,定义了这些对象以后,我们就可以利用它们来做一些有意义的事情。举例来说,假设要存储许多雇员,不同的雇员的区别仅在于雇员的身份证号。我们可以通过身份证号来顺序存储每个雇员,但是在内存中实现呢?是不是要准备足够的内存来存储1000个雇员,然后再将这些雇员逐一插入?如果已经插入了500条记录,这时需要插入一个身份证号较低的新雇员,该怎么办呢?是在内存中将500条记录全部下移后,再从开头插入新的记录?还是创建一个映射来记住每个对象的位置?当决定如何存储对象的集合时,必须考虑如下问题。对于对象集合,必须执行的操作主要以下三种:u 添加新的对象u 删除对象u 查找对象我们必须确定如何将新的对象添加到集合中。可以将对象添加到集合的末尾、开头或者中间的某个逻辑位置。从集合中删除一个对象后,对象集合中现有对象会有什么影响呢?可能必须将内存移来移去,或者就在现有对象所驻留的内存位置下一个“洞”。在内存中建立对象集合后,必须确定如何定位特定对象。可建立一种机制,利用该机制可根据某些搜索条件(例如身份证号)直接定位到目标对象;否则,便需要遍历集合中的每个对象,直到找到要查找的对象为止。前面大家已经学习过了数组。数组的作用是可以存取一组数据。但是它却存在一些缺点,使得无法使用它来比较方便快捷的完成上述应用场景的要求。1. ----------专业最好文档,专业为你服务,急你所急,供你所需-------------文档下载最佳的地方 ----------专业最好文档,专业为你服务,急你所急,供你所需-------------文档下载最佳的地方首先,在很多数情况下面,我们需要能够存储一组数据的容器,这一点虽然数组可以实现,但是如果我们需要存储的数据的个数多少并不确定。比如说:我们需要在容器里面存储某个应用系统的当前的所有的在线用户信息,而当前的在线用户信息是时刻都可能在变化的。也就是说,我们需要一种存储数据的容器,它能够自动的改变这个容器的所能存放的数据数量的大小。这一点上,如果使用数组来存储的话,就显得十分的笨拙。2. 我们再假设这样一种场景:假定一个购物网站,经过一段时间的运行,我们已经存储了一系列的购物清单了,购物清单中有商品信息。如果我们想要知道这段时间里面有多少种商品被销售出去了。那么我们就需要一个容器能够自动的过滤掉购物清单中的关于商品的重复信息。如果使用数组,这也是很难实现的。3. 最后再想想,我们经常会遇到这种情况,我知道某个人的帐号名称,希望能够进一步了解这个人的其他的一些信息。也就是说,我们在一个地方存放一些用户信息,我们希望能够通过用户的帐号来查找到对应的该用户的其他的一些信息。再举个查字典例子:假设我们希望使用一个容器来存放单词以及对于这个单词的解释,而当我们想要查找某个单词的意思的时候,能够根据提供的单词在这个容器中找到对应的单词的解释。如果使用数组来实现的话,就更加的困难了。为解决这些问题,Java里面就设计了容器集合,不同的容器集合以不同的格式保存对象。数学背景在常见用法中,集合(collection)和数学上直观的集(set)的概念是相同的。集是一个唯一项组,也就是说组中没有重复项。实际上,“集合框架”包含了一个Set接口和许多具体的Set类。但正式的集概念却比Java技术提前了一个世纪,那时英国数学家GeorgeBoole按逻辑正式的定义了集的概念。大部分人在小学时通过我们熟悉的维恩图引入的“集的交”和“集的并”学到过一些集的理论。----------专业最好文档,专业为你服务,急你所急,供你所需-------------文档下载最佳的地方 ----------专业最好文档,专业为你服务,急你所急,供你所需-------------文档下载最佳的地方集的基本属性如下:u 集内只包含每项的一个实例u 集可以是有限的,也可以是无限的u 可以定义抽象概念集不仅是逻辑学、数学和计算机科学的基础,对于商业和系统的日常应用来说,它也很实用。“连接池”这一概念就是数据库服务器的一个开放连接集。Web服务器必须管理客户机和连接集。文件描述符提供了操作系统中另一个集的示例。映射是一种特别的集。它是一种对(pair)集,每个对表示一个元素到另一元素的单向映射。一些映射示例有:u IP地址到域名(DNS)的映射u 关键字到数据库记录的映射u 字典(词到含义的映射)u 2进制到10进制转换的映射就像集一样,映射背后的思想比Java编程语言早的多,甚至比计算机科学还早。而Java中的Map就是映射的一种表现形式。1.1.2 容器的分类既然您已经具备了一些集的理论,您应该能够更轻松的理解“集合框架”。“集合框架”由一组用来操作对象的接口组成。不同接口描述不同类型的组。在很大程度上,一旦您理解了接口,您就理解了框架。虽然您总要创建接口特定的实现,但访问实际集合的方法应该限制在接口方法的使用上;因此,允许您更改基本的数据结构而不必改变其它代码。框架接口层次结构如下图所示。 Java容器类类库的用途是“保存对象”,并将其划分为两个不同的概念:----------专业最好文档,专业为你服务,急你所急,供你所需-------------文档下载最佳的地方 ----------专业最好文档,专业为你服务,急你所急,供你所需-------------文档下载最佳的地方1) Collection。一组对立的元素,通常这些元素都服从某种规则。List必须保持元素特定的顺序,而Set不能有重复元素。2) Map。一组成对的“键值对”对象。初看起来这似乎应该是一个Collection,其元素是成对的对象,但是这样的设计实现起来太笨拙了,于是我们将Map明确的提取出来形成一个独立的概念。Map一样容易扩展成多维Map,无需增加新的概念,只要让Map中的键值对的每个“值”也是一个Map即可。Collection和Map的区别在于容器中每个位置保存的元素个数。Collection每个位置只能保存一个元素(对象)。此类容器包括:List,它以特定的顺序保存一组元素;Set则是元素不能重复。Map保存的是“键值对”,就像一个小型数据库。我们可以通过“键”找到该键对应的“值”。u Collection–对象之间没有指定的顺序,允许重复元素。u Set–对象之间没有指定的顺序,不允许重复元素u List–对象之间有指定的顺序,允许重复元素,并引入位置下标。u Map–接口用于保存关键字(Key)和数值(Value)的集合,集合中的每个对象加入时都提供数值和关键字。Map接口既不继承Set也不继承Collection。List、Set、Map共同的实现基础是Object数组除了四个历史集合类外,Java2框架还引入了六个集合实现,如下表所示。接口实现历史集合类SetHashSet TreeSet ListArrayListVector LinkedListStackMapHashMapHashtable TreeMapProperties历史集合类部分解释Vector 是个像可增大数组的历史集合类,但它可以存储不同类型的数据元素。Java2SDK,版本2----------专业最好文档,专业为你服务,急你所急,供你所需-------------文档下载最佳的地方 ----------专业最好文档,专业为你服务,急你所急,供你所需-------------文档下载最佳的地方中 Vector 类被改良到“集合框架”层次结构中以实现 List 接口。但是,如果您在使用新框架,您应该使用 ArrayList,而不是 List。从 Vector 转换为 ArrayList 时,一个关键的差别是―为了更改元素值的位置,参数的顺序被颠倒了。 Stack 类继承 Vector,通过 push() 和 pop() 方法以实现一个标准的后进先出(last-in-first-out(LIFO))堆栈。可是,我们要当心。因为 Stack 类继承 Vector 类,您仍然可以用被继承的 Vector 的方法访问或修改 Stack。Enumeration接口Enumeration 接口允许您迭代集合中的所有元素。在“集合框架”中,该接口被 Iterator 接口替代。但是,并不是所有的库都支持较新的接口,所以您可能会发现自己常常使用 Enumeration。尽管有些人更喜欢 Iterator 这个方法名称,但用 Enumeration 迭代和用 Iterator 迭代类似。不过,Enumeration 不支持除去操作。Enumerationenum=...;while(enum.hasNextElement()){Objectelement=iterator.nextElement();//processelement}Hashtable实现是个一般的字典,它允许存储任何对象作为它的键或值(包括null)。在Java2SDK,版本1.2中,这个类被重新改写到“集合框架”中去实现Map接口。所以,您可用原始的Hashtable方法或较新的Map方法。如果您需要一个同步的Map,使用Hashtable比使用同步的HashMap稍快一些。任何集合(Collection)都能产生一个迭代器(Iterator),而一个List除了能生成一个ListIterator(列表迭代器)外,还能生成一个普通迭代器,因为List正是从集合继承来的.1.2 Collection1.2.1 常用方法Collection接口用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口。Collection在前面的大图也可以看出,它是List和Set的父类。并且它本身也是一个接口。它定义了作为集合所应该拥有的一些方法。如下:----------专业最好文档,专业为你服务,急你所急,供你所需-------------文档下载最佳的地方 ----------专业最好文档,专业为你服务,急你所急,供你所需-------------文档下载最佳的地方注意:集合必须只有对象,集合中的元素不能是基本数据类型。Collection接口支持如添加和除去等基本操作。设法除去一个元素时,如果这个元素存在,除去的仅仅是集合中此元素的一个实例。u booleanadd(Objectelement)u booleanremove(Objectelement)Collection接口还支持查询操作:u intsize()u booleanisEmpty()u booleancontains(Objectelement)u Iteratoriterator()组操作:Collection接口支持的其它操作,要么是作用于元素组的任务,要么是同时作用于整个集合的任务。u booleancontainsAll(Collectioncollection)u booleanaddAll(Collectioncollection)u voidclear()u voidremoveAll(Collectioncollection)u voidretainAll(Collectioncollection)containsAll()方法允许您查找当前集合是否包含了另一个集合的所有元素,即另一个集合是否是当前集合的子集。其余方法是可选的,因为特定的集合可能不支持集合更改。addAll()方法确保另一个集合中的所有元素都被添加到当前的集合中,通常称为并。clear()方法从当前集合中除去所有元素。removeAll()方法类似于clear(),但只除去了元素的一个子集。retainAll()方法类似于removeAll()方法,不过可能感到它所做的与前面正好相反:它从当前集合中除去不属于另一个集合的元素,即交。 我们看一个简单的例子,来了解一下集合类的基本方法的使用:importjava.util.*;publicclassCollectionToArray{publicstaticvoidmain(String[]args){Collectioncollection1=newArrayList();//创建一个集合对象collection1.add("000");//添加对象到Collection集合中collection1.add("111");collection1.add("222");System.out.println("集合collection1的大小:"+collection1.size());System.out.println("集合collection1的内容:"+collection1);----------专业最好文档,专业为你服务,急你所急,供你所需-------------文档下载最佳的地方 ----------专业最好文档,专业为你服务,急你所急,供你所需-------------文档下载最佳的地方collection1.remove("000");//从集合collection1中移除掉"000"这个对象System.out.println("集合collection1移除000后的内容:"+collection1);System.out.println("集合collection1中是否包含000:"+collection1.contains("000"));System.out.println("集合collection1中是否包含111:"+collection1.contains("111"));Collectioncollection2=newArrayList();collection2.addAll(collection1);//将collection1集合中的元素全部都加到collection2中System.out.println("集合collection2的内容:"+collection2);collection2.clear();//清空集合collection1中的元素System.out.println("集合collection2是否为空:"+collection2.isEmpty());//将集合collection1转化为数组Objects[]=collection1.toArray();for(inti=0;i
此文档下载收益归作者所有
举报原因
联系方式
详细说明
内容无法转码请点击此处