首页 Java集合排序及java集合类详解

Java集合排序及java集合类详解

举报
开通vip

Java集合排序及java集合类详解 1 Java集合排序及 java集合类详解 (Collection, List, Set, Map) 菜花 2 Java 里面最重要,最常用也就是集合一部分了。能够用好集合和理 解好集合对于做 Java 程序的开发拥有无比的好处。本文详细解释了关 于 Java 中的集合是如何实现的,以及他们的实现原理。 关键字: Collection , List ,Set , Map , 集合,框架。 目 录 1 ...

Java集合排序及java集合类详解
1 Java集合排序及 java集合类详解 (Collection, List, Set, Map) 菜花 2 Java 里面最重要,最常用也就是集合一部分了。能够用好集合和理 解好集合对于做 Java 程序的开发拥有无比的好处。本文详细解释了关 于 Java 中的集合是如何实现的,以及他们的实现原理。 关键字: Collection , List ,Set , Map , 集合,框架。 目 录 1 集合框架 ........................................................................................................................ 3 1.1 集合框架概述 .................................................................................................... 3 1.1.1 容器简介 ................................................................................................. 3 1.1.2 容器的分类 ............................................................................................... 5 1.2 Collection ............................................................................................................ 7 1.2.1 常用方法 ................................................................................................. 7 1.2.2 迭代器 ...................................................................................................... 9 1.3 List ...................................................................................................................... 11 1.3.1 概述 ........................................................................................................... 11 1.3.2 常用方法 ............................................................................................... 12 1.3.3 实现原理 ............................................................................................... 16 1.4 Map ..................................................................................................................... 19 1.4.1 概述 ........................................................................................................... 19 1.4.2 常用方法 ............................................................................................... 19 1.4.3 Comparable 接口 ................................................................................ 24 1.4.4 实现原理 ............................................................................................... 25 1.4.5 覆写hashCode() ..................................................................................... 30 1.5 Set .......................................................................................................................... 34 1.5.1 概述 ........................................................................................................... 34 1.5.2 常用方法 .................................................................................................. 34 1.5.3 实现原理 ............................................................................................... 39 1.6 总结 :集合框架中常用类比较 ........................................................................ 40 2 练习 .................................................................................................................................. 41 3 附录:排序 .................................................................................................................... 42 3 1 集合框架 1.1 集合框架概述 1.1.1 容器简介 到目前为止,我们已经学习了如何创建多个不同的对象,定义了这 些对象以后,我们就可以利用它们来做一些有意义的事情。 举例来说,假设要存储许多雇员,不同的雇员的区别仅在于雇员 的身份证号。我们可以通过身份证号来顺序存储每个雇员,但是在内存 中实现呢?是不是要准备足够的内存来存储 1000 个雇员,然后再将这 些雇员逐一插入?如果已经插入了 500 条 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 ,这时需要插入一个身份 证号较低的新雇员,该怎么办呢?是在内存中将 500条记录全部下移后, 再从开头插入新的记录? 还是创建一个映射来记住每个对象的位置? 当决定如何存储对象的集合时,必须考虑如下问题。 对于对象集合,必须执行的操作主要以下三种:  添加新的对象  删除对象  查找对象 我们必须确定如何将新的对象添加到集合中。可以将对象添加到集 合的末尾、开头或者中间的某个逻辑位置。 从集合中删除一个对象后,对象集合中现有对象会有什么影响呢? 可能必须将内存移来移去,或者就在现有对象所驻留的内存位置下一个 “洞”。 在内存中建立对象集合后,必须确定如何定位特定对象。可建立 一种机制,利用该机制可根据某些搜索条件(例如身份证号)直接定位 到目标对象;否则,便需要遍历集合中的每个对象,直到找到要查找的 对象为止。 前面大家已经学习过了数组。数组的作用是可以存取一组数据。 但是它却存在一些缺点,使得无法使用它来比较方便快捷的完成上述应 用场景的要求。 1. 首先,在很多数情况下面,我们需要能够存储一组数据的容 器,这一点虽然数组可以实现,但是如果我们需要存储的数据 4 的个数多少并不确定。比如说:我们需要在容器里面存储某个 应用系统的当前的所有的在线用户信息,而当前的在线用户信 息是时刻都可能在变化的。 也就是说,我们需要一种存储数 据的容器,它能够自动的改变这个容器的所能存放的数据数量 的大小。这一点上,如果使用数组来存储的话,就显得十分的 笨拙。 2. 我们再假设这样一种场景:假定一个购物网站,经过一段时 间的运行,我们已经存储了一系列的购物 清单 安全隐患排查清单下载最新工程量清单计量规则下载程序清单下载家私清单下载送货清单下载 了,购物清单中 有商品信息。如果我们想要知道这段时间里面有多少种商品被 销售出去了。那么我们就需要一个容器能够自动的过滤掉购物 清单中的关于商品的重复信息。如果使用数组,这也是很难实 现的。 3. 最后再想想,我们经常会遇到这种情况,我知道某个人的帐 号名称,希望能够进一步了解这个人的其他的一些信息。也就 是说,我们在一个地方存放一些用户信息,我们希望能够通过 用户的帐号来查找到对应的该用户的其他的一些信息。再举个 查字典例子:假设我们希望使用一个容器来存放单词以及对于 这个单词的解释,而当我们想要查找某个单词的意思的时候, 能够根据提供的单词在这个容器中找到对应的单词的解释。如 果使用数组来实现的话,就更加的困难了。 为解决这些问题,Java 里面就设计了容器集合,不同的容器集合以 不同的格式保存对象。 数学背景 在常见用法中,集合(collection)和数学上直观的集(set)的概 念是相同的。集是一个唯一项组,也就是说组中没有重复项。实际上, “集合框架”包含了一个 Set 接口和许多具体的 Set 类。但正式的集 概念却比 Java 技术提前了一个世纪,那时英国数学家 George Boo le 按逻辑正式的定义了集的概念。大部分人在小学时通过我们熟悉的 维恩图引入的“集的交”和“集的并”学到过一些集的理论。 5 集的基本属性如下:  集内只包含每项的一个实例  集可以是有限的,也可以是无限的  可以定义抽象概念 集不仅是逻辑学、数学和计算机科学的基础,对于商业和系统的日 常应用来说,它也很实用。“连接池”这一概念就是数据库服务器的一个 开放连接集。Web 服务器必须管理客户机和连接集。文件描述符提供 了操作系统中另一个集的示例。 映射是一种特别的集。它是一种对(pair)集,每个对表示一个元 素到另一元素的单向映射。一些映射示例有:  IP 地址到域名(DNS)的映射  关键字到数据库记录的映射  字典(词到含义的映射)  2 进制到 10 进制转换的映射 就像集一样,映射背后的 思想 教师资格思想品德鉴定表下载浅论红楼梦的主题思想员工思想动态调查问卷论语教育思想学生思想教育讲话稿 比 Java 编程语言早的多,甚至比计 算机科学还早。而 Java 中的 Map 就是映射的一种表现形式。 1.1.2 容器的分类 既然您已经具备了一些集的理论,您应该能够更轻松的理解“集合框 架”。 “集合框架”由一组用来操作对象的接口组成。不同接口描述不同 类型的组。在很大程度上,一旦您理解了接口,您就理解了框架。虽然 您总要创建接口特定的实现,但访问实际集合的方法应该限制在接口方 法的使用上;因此,允许您更改基本的数据结构而不必改变其它代码。 框架接口层次结构如下图所示。 Java 容器类类库的用途是“保存对象”,并将其划分为两个不同的 概念: 1) Collection 。 一组对立的元素,通常这些元素都服从某种规则。 List 必须保持元素特定的顺序,而 Set 不能有重复元素。 6 2) Map 。 一组 成对的“键值对”对象。初看起来这似乎应该是 一个 Collection ,其元素是成对的对象,但是这样的设计实现起 来太笨拙了,于是我们将 Map 明确的提取出来形成一个独立的概 念。另一方面,如果使用 Collection 表示 Map 的部分内容,会便 于查看此部分内容。因此 Map 一样容易扩展成多维 Map ,无需 增加新的概念,只要让 Map 中的键值对的每个“值”也是一个 M ap 即可。 Collection 和 Map 的区别在于容器中每个位置保存的元素个数。Co llection 每个位置只能保存一个元素(对象)。此类容器包括:List , 它以特定的顺序保存一组元素;Set 则是元素不能重复。 Map 保存的是“键值对”,就像一个小型数据库。我们可以通过“键” 找到该键对应的“值”。  Collection – 对象之间没有指定的顺序,允许重复元素。  Set – 对象之间没有指定的顺序,不允许重复元素  List– 对象之间有指定的顺序,允许重复元素 ,并引入位置 下标。  Map – 接口用于保存关键字(Key)和数值(Value)的集 合,集合中的每个对象加入时都提供数值和关键字。Map 接口 既不继承 Set 也不继承 Collection。 List、Set、Map 共同的实现基础是 Object 数组 除了四个历史集合类外,Java 2 框架还引入了六个集合实现,如 下表所示。 接口 实现 历史集合类 Set HashSet TreeSet List ArrayList Vector LinkedList Stack Map HashMap Hashtable TreeMap Properties 这里没有 Collection 接口的实现,接下来我们再来看一下下面的 这张关于集合框架的大图: 7 这张图看起来有点吓人,熟悉之后就会发现其实只有三种容器: Map,List 和 Set ,它们各自有两个三个实现版本。常用的容器用黑色 粗线框表示。 点线方框代表“接口”,虚线方框代表抽象类,而实线方框代表普 通类(即具体类,而非抽象类)。虚线箭头指出一个特定的类实现了一 个接口(在抽象类的情况下,则是“部分”实现了那个接口)。实线箭 头指出一个类可生成箭头指向的那个类的对象。例如任何集合( Colle ction )都能产生一个迭代器( Iterator ),而一个 List 除了能生成一 个 ListIterator (列表迭代器)外,还能生成一个普通迭代器,因为 List 正是从集合继承来的. 1.2 Collection 1.2.1 常用方法 Collection 接口用于表示任何对象或元素组。想要尽可能以常规方式 处理一组元素时,就使用这一接口。Collection 在前面的大图也可以看出,它是 List 和 Set 的父类。并且它本身也是一个接口。它定义了作为集合所应该拥有的 一些方法。如下: 注意 : 集合必须只有对象,集合中的元素不能是基本数据类型。 Collection 接口支持如添加和除去等基本操作。设法除去一个元素时,如 果这个元素存在,除去的仅仅是集合中此元素的一个实例。  boolean add(Object element)  boolean remove(Object element) Collection 接口还支持查询操作:  int size()  boolean isEmpty()  boolean contains(Object element)  Iterator iterator() 组操作 :Collection 接口支持的其它操作,要么是作用于元素组的任务, 要么是同时作用于整个集合的任务。  boolean containsAll(Collection collection)  boolean addAll(Collection collection) 8  void clear()  void removeAll(Collection collection)  void retainAll(Collection collection) containsAll() 方法允许您查找当前集合是否包含了另一个集合的所有元素,即另一个集合是 否是当前集合的子集。其余方法是可选的,因为特定的集合可能不支持集合更改。 addAll() 方法确保另一个集合中的所有元素都被添加到当前的集合中,通常称为并。 clear() 方法从 当前集合中除去所有元素。 removeAll() 方法类似于 clear() ,但只除去了元素的一个子集。 retainAll() 方法类似于 removeAll() 方法,不过可能感到它所做的与前面正好相反:它从当 前集合中除去不属于另一个集合的元素,即交。 我们看一个简单的例子,来了解一下集合类的基本方法的使用: import java.util.*; public class CollectionToArray { public static void main(String[] args) { Collection collection1=new ArrayList();//创建一个集合对象 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")); Collection collection2=new ArrayList(); collection2.addAll(collection1);//将 collection1 集合中的元素全部都加到 collection2 中 System.out.println("集合 collection2的内容:"+collection2); collection2.clear();//清空集合 collection1 中的元素 System.out.println("集合 collection2是否为空 :"+collection2.isEmpty()); //将集合 collection1转化为数组 Object s[]= collection1.toArray(); for(int i=0;i 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 元素所在的位置。  void add(int index, Object element) :添加对象 element 到位置 inde x 上  boolean addAll(int index, Collection collection) :在 index 位置后添 加容器 collection 中所有的元素  Object get(int index) :取出下标为 index 的位置的元素  int indexOf(Object element) :查找对象 element 在 List 中第一次出 现的位置  int lastIndexOf(Object element) :查找对象 element 在 List 中最后出 现的位置  Object remove(int index) :删除 index 位置上的元素  Object set(int index, Object element) :将 index 位置上的对象替换为 element 并返回老的元素。 先看一下下面表格: 简述 实现 操作特性 成员要求 List 提供基于索引 的对成员的随 机访问 ArrayList 提供快速的基于索引的成员访 问,对尾部成员的增加和删除 支持较好 成员可为任意 Object子类的对象 LinkedList 对列表中任何位置的成员的增 加和删除支持较好,但对基于 索引的成员访问支持性能较差 成员可为任意 Object子类的对象 在“集合框架”中有两种常规的 List 实现:ArrayList 和 Linked List。使用两种 List 实现的哪一种取决于您特定的需要。如果要支 持随机访问,而不必在除尾部的任何位置插入或除去元素,那么,Arr ayList 提供了可选的集合。但如果,您要频繁的从列表的中间位置添 13 加和除去元素,而只要顺序的访问列表元素,那么,LinkedList 实现 更好。 我们以 ArrayList 为例,先看一个简单的例子: 例子中,我们把 12 个月份存放到 ArrayList 中,然后用一个循环, 并使用 get()方法将列表中的对象都取出来。 而 LinkedList 添加了一些处理列表两端元素的方法(下图只显示了新方 法): 使用这些新方法,您就可以轻松的把 LinkedList 当作一个堆栈、队列或 其它面向端点的数据结构。 我们再来看另外一个使用 LinkedList 来实现一个简单的队列的例子: import java.util.*; public class ListExample { public static void main(String args[]) { LinkedList queue = new LinkedList(); queue.addFirst("Bernadine"); queue.addFirst("Elizabeth"); queue.addFirst("Gene"); queue.addFirst("Elizabeth"); queue.addFirst("Clara"); System.out.println(queue); queue.removeLast(); queue.removeLast(); System.out.println(queue); } } 运行程序产生了以下输出。请注意,与 Set 不同的是 List 允许重复。 [Clara, Elizabeth, Gene, Elizabeth, Bernadine] [Clara, Elizabeth, Gene] 该的程序演示了具体 List 类的使用。第一部分,创建一个由 ArrayLis t 支持的 List。填充完列表以后,特定条目就得到了。示例的 LinkedList 部分把 LinkedList 当作一个队列,从队列头部添加东西,从尾部除去。 List 接口不但以位置友好的方式遍历整个列表,还能处理集合的子集:  ListIterator listIterator() :返回一个 ListIterator 跌代器, 默认开始位置为0 14  ListIterator listIterator(int startIndex) :返回一个 ListIterat or 跌代器,开始位置为 startIndex  List subList(int fromIndex, int toIndex) :返回一个子列表 List ,元素存放为从 fromIndex 到 toIndex 之前的一个元素。 处理 subList() 时,位于 fromIndex 的元素在子列表中,而位于 to Index 的元素则不是,提醒这一点很重要。以下 for-loop 测试案例大致反 映了这一点: for (int i=fromIndex; i 本文档为【Java集合排序及java集合类详解】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_782927
暂无简介~
格式:pdf
大小:506KB
软件:PDF阅读器
页数:44
分类:互联网
上传时间:2012-01-05
浏览量:52