Java集合排序及java集合类总汇.docx

上传人:b****6 文档编号:6037989 上传时间:2023-01-03 格式:DOCX 页数:56 大小:50.50KB
下载 相关 举报
Java集合排序及java集合类总汇.docx_第1页
第1页 / 共56页
Java集合排序及java集合类总汇.docx_第2页
第2页 / 共56页
Java集合排序及java集合类总汇.docx_第3页
第3页 / 共56页
Java集合排序及java集合类总汇.docx_第4页
第4页 / 共56页
Java集合排序及java集合类总汇.docx_第5页
第5页 / 共56页
点击查看更多>>
下载资源
资源描述

Java集合排序及java集合类总汇.docx

《Java集合排序及java集合类总汇.docx》由会员分享,可在线阅读,更多相关《Java集合排序及java集合类总汇.docx(56页珍藏版)》请在冰豆网上搜索。

Java集合排序及java集合类总汇.docx

Java集合排序及java集合类总汇

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

(Collection,List,Set,Map)

摘要内容

Java里面最重要,最常用也就是集合一部分了。

能够用好集合和理

解好集合对于做Java程序的开发拥有无比的好处。

本文详细解释了关

于Java中的集合是如何实现的,以及他们的实现原理。

关键字:

Collection,List,Set,Map,集合,框架。

目录

1集合框架............................................2

1.1集合框架概述..............................2

1.1.1容器简介............................2

1.1.2容器的分类.........................4

1.2Collection.....................................................7

1.2.1常用方法...................................7

1.2.2迭代器..................................................9

1.3List..................................................11

1.3.1概述........................................11

1.3.2常用方法.............................11

1.3.3实现原理.............................................15

1.4Map......................................................18

1.4.1概述...................................................18

1.4.2常用方法..............................................19

1.4.3Comparable接口.................................23

1.4.4实现原理......................................................25

1.4.5覆写hashCode()...............................................29

1.5Set.......................................................33

1.5.1概述.................................................33

1.5.2常用方法............................................34

1.5.3实现原理.....................................38

1.6总结:

集合框架中常用类比较..............................39

2练习...................................3附录:

排序............................................................41

 

1集合框架

1.1集合框架概述

1.1.1容器简介

到目前为止,我们已经学习了如何创建多个不同的对象,定义了这

些对象以后,我们就可以利用它们来做一些有意义的事情。

举例来说,假设要存储许多雇员,不同的雇员的区别仅在于雇员

的身份证号。

我们可以通过身份证号来顺序存储每个雇员,但是在内存

中实现呢?

是不是要准备足够的内存来存储1000个雇员,然后再将这

些雇员逐一插入?

如果已经插入了500条记录,这时需要插入一个身份

证号较低的新雇员,该怎么办呢?

是在内存中将500条记录全部下移后,

再从开头插入新的记录?

还是创建一个映射来记住每个对象的位置?

当决定如何存储对象的集合时,必须考虑如下问题。

对于对象集合,必须执行的操作主要以下三种:

_添加新的对象

_删除对象

_查找对象

我们必须确定如何将新的对象添加到集合中。

可以将对象添加到集

合的末尾、开头或者中间的某个逻辑位置。

从集合中删除一个对象后,对象集合中现有对象会有什么影响呢?

可能必须将内存移来移去,或者就在现有对象所驻留的内存位置下一个

“洞”。

在内存中建立对象集合后,必须确定如何定位特定对象。

可建立

一种机制,利用该机制可根据某些搜索条件(例如身份证号)直接定位

到目标对象;否则,便需要遍历集合中的每个对象,直到找到要查找的

对象为止。

前面大家已经学习过了数组。

数组的作用是可以存取一组数据。

但是它却存在一些缺点,使得无法使用它来比较方便快捷的完成上述应

用场景的要求。

1.首先,在很多数情况下面,我们需要能够存储一组数据的容

器,这一点虽然数组可以实现,但是如果我们需要存储的数据

——疯狂大白菜

3/43

的个数多少并不确定。

比如说:

我们需要在容器里面存储某个

应用系统的当前的所有的在线用户信息,而当前的在线用户信

息是时刻都可能在变化的。

也就是说,我们需要一种存储数

据的容器,它能够自动的改变这个容器的所能存放的数据数量

的大小。

这一点上,如果使用数组来存储的话,就显得十分的

笨拙。

2.我们再假设这样一种场景:

假定一个购物网站,经过一段时

间的运行,我们已经存储了一系列的购物清单了,购物清单中

有商品信息。

如果我们想要知道这段时间里面有多少种商品被

销售出去了。

那么我们就需要一个容器能够自动的过滤掉购物

清单中的关于商品的重复信息。

如果使用数组,这也是很难实

现的。

3.最后再想想,我们经常会遇到这种情况,我知道某个人的帐

号名称,希望能够进一步了解这个人的其他的一些信息。

也就

是说,我们在一个地方存放一些用户信息,我们希望能够通过

用户的帐号来查找到对应的该用户的其他的一些信息。

再举个

查字典例子:

假设我们希望使用一个容器来存放单词以及对于

这个单词的解释,而当我们想要查找某个单词的意思的时候,

能够根据提供的单词在这个容器中找到对应的单词的解释。

果使用数组来实现的话,就更加的困难了。

为解决这些问题,Java里面就设计了容器集合,不同的容器集合以

不同的格式保存对象。

数学背景

在常见用法中,集合(collection)和数学上直观的集(set)的概

念是相同的。

集是一个唯一项组,也就是说组中没有重复项。

实际上,

“集合框架”包含了一个Set接口和许多具体的Set类。

但正式的集

概念却比Java技术提前了一个世纪,那时英国数学家GeorgeBoo

le按逻辑正式的定义了集的概念。

大部分人在小学时通过我们熟悉的

维恩图引入的“集的交”和“集的并”学到过一些集的理论。

——疯狂大白菜

4/43

集的基本属性如下:

_集内只包含每项的一个实例

_集可以是有限的,也可以是无限的

_可以定义抽象概念

集不仅是逻辑学、数学和计算机科学的基础,对于商业和系统的日

常应用来说,它也很实用。

“连接池”这一概念就是数据库服务器的一个

开放连接集。

Web服务器必须管理客户机和连接集。

文件描述符提供

了操作系统中另一个集的示例。

映射是一种特别的集。

它是一种对(pair)集,每个对表示一个元

素到另一元素的单向映射。

一些映射示例有:

_IP地址到域名(DNS)的映射

_关键字到数据库记录的映射

_字典(词到含义的映射)

_2进制到10进制转换的映射

就像集一样,映射背后的思想比Java编程语言早的多,甚至比计

算机科学还早。

而Java中的Map就是映射的一种表现形式。

1.1.2容器的分类

既然您已经具备了一些集的理论,您应该能够更轻松的理解“集合框

架”。

“集合框架”由一组用来操作对象的接口组成。

不同接口描述不同

类型的组。

在很大程度上,一旦您理解了接口,您就理解了框架。

虽然

您总要创建接口特定的实现,但访问实际集合的方法应该限制在接口方

法的使用上;因此,允许您更改基本的数据结构而不必改变其它代码。

框架接口层次结构如下图所示。

Java容器类类库的用途是“保存对象”,并将其划分为两个不同的

概念:

1)Collection。

一组对立的元素,通常这些元素都服从某种规则。

List必须保持元素特定的顺序,而Set不能有重复元素。

——疯狂大白菜

5/43

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数组

除了四个历史集合类外,Java2框架还引入了六个集合实现,如

下表所示。

接口实现历史集合类

SetHashSet

TreeSet

ListArrayListVector

LinkedListStack

MapHashMapHashtable

TreeMapProperties

——疯狂大白菜

6/43

这里没有Collection接口的实现,接下来我们再来看一下下面的

这张关于集合框架的大图:

这张图看起来有点吓人,熟悉之后就会发现其实只有三种容器:

Map,List和Set,它们各自有两个三个实现版本。

常用的容器用黑色

粗线框表示。

点线方框代表“接口”,虚线方框代表抽象类,而实线方框代表普

通类(即具体类,而非抽象类)。

虚线箭头指出一个特定的类实现了一

个接口(在抽象类的情况下,则是“部分”实现了那个接口)。

实线箭

头指出一个类可生成箭头指向的那个类的对象。

例如任何集合(Colle

ction)都能产生一个迭代器(Iterator),而一个List除了能生成一

个ListIterator(列表迭代器)外,还能生成一个普通迭代器,因为List

正是从集合继承来的.

——疯狂大白菜

7/43

1.2Collection

1.2.1常用方法

Collection接口用于表示任何对象或元素组。

想要尽可能以常规方式

处理一组元素时,就使用这一接口。

Collection在前面的大图也可以看出,它是

List和Set的父类。

并且它本身也是一个接口。

它定义了作为集合所应该拥有的

一些方法。

如下:

注意:

集合必须只有对象,集合中的元素不能是基本数据类型。

Collection接口支持如添加和除去等基本操作。

设法除去一个元素时,如

果这个元素存在,除去的仅仅是集合中此元素的一个实例。

_booleanadd(Objectelement)

_booleanremove(Objectelement)

Collection接口还支持查询操作:

_intsize()

_booleanisEmpty()

_booleancontains(Objectelement)

_Iteratoriterator()

组操作:

Collection接口支持的其它操作,要么是作用于元素组的任务,

要么是同时作用于整个集合的任务。

_booleancontainsAll(Collectioncollection)

_booleanaddAll(Collectioncollection)

_voidclear()

_voidremoveAll(Collectioncollection)

_voidretainAll(Collectioncollection)

containsAll()方法允许您查找当前集合是否包含了另一个集合的所有元素,即另一个集合是

否是当前集合的子集。

其余方法是可选的,因为特定的集合可能不支持集合更改。

addAll()

方法确保另一个集合中的所有元素都被添加到当前的集合中,通常称为并。

clear()方法从

当前集合中除去所有元素。

removeAll()方法类似于clear(),但只除去了元素的一个子集。

retainAll()方法类似于removeAll()方法,不过可能感到它所做的与前面正好相反:

它从当

前集合中除去不属于另一个集合的元素,即交。

我们看一个简单的例子,来了解一下集合类的基本方法的使用:

importjava.util.*;

publicclassCollectionToArray{

——疯狂大白菜

8/43

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

System.out.println(s[i]);

}

}

}

运行结果为:

集合collection1的大小:

3

集合collection1的内容:

[000,111,222]

集合collection1移除000后的内容:

[111,222]

集合collection1中是否包含000:

false

集合collection1中是否包含111:

true

集合collection2的内容:

[111,222]

集合collection2是否为空:

true

111

222

这里需要注意的是,Collection它仅仅只是一个接口,而我们真正

使用的时候,确是创建该接口的一个实现类。

做为集合的接口,它定义

了所有属于集合的类所都应该具有的一些方法。

而ArrayList(列表)类是集合类的一种实现方式。

这里需要一提的是,因为Collection的实现基础是数组,所以有转

换为Object数组的方法:

——疯狂大白菜

9/43

_Object[]toArray()

_Object[]toArray(Object[]a)

其中第二个方法Object[]toArray(Object[]a)的参数a应该是集

合中所有存放的对象的类的父类。

1.2.2迭代器

任何容器类,都必须有某种方式可以将东西放进去,然后由某种方

式将东西取出来。

毕竟,存放事物是容器最基本的工作。

对于ArrayLis

t,add()是插入对象的方法,而get()是取出元素的方式之一。

ArrayL

ist很灵活,可以随时选取任意的元素,或使用不同的下标一次选取多个

元素。

如果从更高层的角度思考,会发现这里有一个缺点:

要使用容器,

必须知道其中元素的确切类型。

初看起来这没有什么不好的,但是考虑

如下情况:

如果原本是ArrayList,但是后来考虑到容器的特点,你想

换用Set,应该怎么做?

或者你打算写通用的代码,它们只是使用容器,

不知道或者说不关心容器的类型,那么如何才能不重写代码就可以应用

于不同类型的容器?

所以迭代器(Iterator)的概念,也是出于一种设计模式就是为达成

此目的而形成的。

所以Collection不提供get()方法。

如果要遍历Collec

tin中的元素,就必须用Iterator。

迭代器(Iterator)本身就是一个对象,它的工作就是遍历并选择

集合序列中的对象,而客户端的程序员不必知道或关心该序列底层的结

构。

此外,迭代器通常被称为“轻量级”对象,创建它的代价小。

但是,

它也有一些限制,例如,某些迭代器只能单向移动。

Collection接口的iterator()方法返回一个Iterator。

Iterat

or和您可能已经熟悉的Enumeration接口类似。

使用Iterator接

口方法,您可以从头至尾遍历集合,并安全的从底层Collection中

除去元素。

下面,我们看一个对于迭代器的简单使用:

importjava.util.ArrayList;

importjava.util.Collection;

importjava.util.Iterator;

——疯狂大白菜

10/43

publicclassIteratorDemo{

publicstaticvoidmain(String[]args){

Collectioncollection=newArrayList();

collection.add("s1");

collection.add("s2");

collection.add("s3");

Iteratoriterator=collection.iterator();//得到一个

迭代器

while(iterator.hasNext()){//遍历

Objectelement=iterator.next();

System.out.println("iterator="+element);

}

if(collection.isEmpty())

System.out.println("collectionisEmpty!

");

else

System.out.println("collectionisnotEmpty!

size

="+collection.size());

Iteratoriterator2=collection.iterator();

while(iterator2.hasNext()){//移除元素

Objectelement=iterator2.next();

System.out.println("remove:

"+element);

iterator2.remove();

}

Iteratoriterator3=collection.iterator();

if(!

iterator3.hasNext()){//察看是否还有元素

System.out.println("还有元素");

}

if(collection.isEmpty())

System.out.println("collectionisEmpty!

");

//使用collection.isEmpty()方法来判断

}

}

程序的运行结果为:

iterator=s1

iterator=s2

iterator=s3

collectionisnotEmpty!

size=3

remove:

s1

remove:

s2

remove:

s3

还有元素

collectionisEmpty!

——疯狂大白菜

11/43

可以看到,Java的Collection的Iterator能够用来,:

1)使用方法iterator()要求容器返回一个Iterator.第一次调

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1