版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java集合排序与java集合类详解
(Collection,List,Set,Map)
摘要容
集合是Java里面最常用的,也是最重要的一局部。能够用好集合
和理解好集合对于做Java程序的开发拥有无比的好处。本文详细解释
了关于Java中的集合是如何实现的,以与他们的实现原理。
目录
1集合框架1
1.1集合框架概述2
1.1.1容器简介2
1.1.2容器的分类4
1.2Collections
1.2.1常用方法6
1.2.2迭代器8
1.3Listll
1.3.1概述11
1.3.2常用方法11
1.3.3实现原理15
!.4Map18
1.4.1概逑18
1.4.2常1用方法18
1.4.3Cotparable接口23
1.4.4实现原理24
1.4.5覆写hashCode。28
1.5Set32
1.5.1概述32
1.5.2常用方法32
1.5.3实现原理36
1.6总结:集合框架中常用类比拟37
2练习38
3附录,排庠39
1集合框架
1.1集合框架被迷
1.1.1容器简介
到目前为止,我们已经学习了如何创建多个不同的对象,定义了这
些对象以后,我们就可以利用它们来做一些有意义的事情。
举例来说,假设要存储许多雇员,不同的雇员的区别仅,生于雇员的
号。我们可以通过号来顺序存储每个雇员,但是在存中实现呢?是不是
要准备足够的存来存储1000人雇员,然后再将这些雇员逐一插入?如
果已经插入了500条记录,这时需要插入一个号较低的新雇员,该怎么
办呢?是在存中将500条记录全部下移后,再从开头插入新的记录?
还是创建一个映射来记住每个对象的位置?当决定如何存储对象的集
合时,必须考■虑如F问题。
对于对象集合,必须执行为操作主要以下三种:
添加新的对象
删除对象
查找对象
我们必须确定如何将新的对象添加到集合中。可以将对象添加到集
合的末尾、开头或者中间的某个逻辑位置。
从集合中删除一个对象后,对象集合中现有对象会有什么影响呢?
可能必须将存移来移白,或者就在现有对象所驻留的存位置下一个
“洞〃。
在存中建立对象集合后,必须确定如何定位特定对象。可建立一种
机制,利用该机制可根据某些搜索条件(例如号)直接定位到目标对象
;否则,便需要遍历集合中的每个对象,直到找到要查找的对象为止。
前面大家已经学习过了数组。数组的作用是可以存取一俎数据。但
是它却存在一些缺点,使得无法使用它来比拟方便快捷的完成上述应用
场景的要求。
1.首先,在很多数情况下面,我们需要能够存储一组
数据的容器,这一点虽然数组可以实现,但是如果我们需要存
储的数据的个数多少并不确定。比如说:我们需要在容器里面
存储某个应用系统的当前的所有的在线用户信息,而当前的在
线用户信息是时刻都可能在变化的。也就是说,我汨需要一种
存储数据的容器,它能够自动的改变这个容器的所能存放的数
据数量的大小。这一点上,如果使用数组来存储的话,就显得
卜分的笨拙。
2.我们再假设这样一种场景:假定一个购物,经过一
段时间的运行,我们已经存储了一系列的购物清单了,购物清
单中有商品信息。如果我们想要知道这段时间里面有多少种商
品被销售出去了。那么我们就需要一个容器能够自动的过滤掉
购物清单中的关于商品的重复信息。如果使用数组,这也是很
难实现的。
3.最后再想愚,我们经常会遇到这种情况,我知道某
个人的名称,希望能够进一步了解这个人的其他的一些信息。
也就是说,我们在一个地方存放一些用户信息,我们希望能够
通过用户的来查找到对应的该用户的其他的一些信息。再举个
查字典例子:假设我们希望使用一个容器来存放单词以与对于
这个单词的解释,而当我们想要查找某个单词的意思的时候,
能够根据提供的单词在这个容器中找到对应的单词的解释。如
果使用数组来实现的话,就更加的困难了。
为解决这些问题,Java里面就设计了容器集合,不同的容器集合以
不同的格式保存对象.
数学背景
在常见用法中,集合(collection)和数学上直观的集(set)的概
念是一样的。集是一个唯一项缎,也就是说组中没有重复项。实际上,
“集合框架”包含了一个Set接口和许多具体的Set类。但正式的集
概念却比Java技术提前了一个世纪,那时英国数学家GeorgeBoole
按逻辑正式的定义了集的概念。大局部人在小学时通过我们熟悉的维
恩图引入的“集的交”和“集的并"学到过一些集的理论。
集的根本属性如下:
集只包含每项的一个实例
集可以是有限的,也可以是无限的
可以定义抽象概念
集不仅是逻辑学、数学和计算机科学的根底,对于商业和系统的日
常应用来说,它也很实用。“连接池”这一概念就是数据库服务器的一
个开放连接集。Web服务器必须管理客户机和连接集。文件尚述符提供
了操作系统中另一个集的示例。
映射是一种特别的集。它是一种对(pair)集,每个对表示一个元
素到另一元素的单向映射。一些映射示例有:
IP地址到域名(DNS)的映射
关键字到数据库记录的映射
字典(词到含义的映射)
2进制到10进制转换的映射
就像集一样,映射背后的思想比Java编程语言早的多,甚至比计
算机科学还早。而Java中的Map就是映射的一种表现形式.
1.1.2容器的分类
既然您已经具备了一些集的理论,您应该能够更轻松的理解“集合
框架”。"集合框架”由-组用来操作对象的接口组成。不同按口描
述不同类型的组。在很大程度上,一旦您理解了接口,您就理解了框架。
虽然您总要创建接口特定的实现,但访问实际集合的方法应咳限制在接
口方法的使用上;因此,允许您更改根本的数据结构而不必改变其它代
码。框架接口层次结构如以下图所示。
Java容器类类库的用途是“保存对象”,并将其划分为两个不同的
概念:
1)Collection。一组对立的元素,通常这些元素都服从某种规那
么。List必须保持元素特定的顺序,而Set不能有重复元素。
2)Mapo一组成对的“键值对"对象。初看起来这似乎应该是一
个Collection,其元素是成对的对象,但是这样的设计实现起来
太笨拙了,于是我们将Map明确的提取出来形成一个独立的概念。
Map一样容易扩展成多维Map,无需增加新的概念,只要让Map
中的键值对的每个“值”也是一个Map即可。
Colleulioii和Map的区别在了容器中每个位置保存的元素个数。C
ollection每个位置只能保存一个元素(对象)°此类容器包括:Lis
t,它以特定的顺序保存一组元素;Set那么是元素不能重复。
Map保存的是“键值对",就像一个小型数据库。我们可以通过“键”
找到该键对应的“值”。
Collection-对象之间没有指定的顺序,允许重复元素。
Set-对象之间没有指定的顺序,不允许重复元素
List-对象之间有指定的顺序,允许重复元素,并引入位
置下标。
Map-接口用于保存关键字(Key)和数值(Value)的集
合,集合中的每个对象参加时都提供数值和关键字,Map接口
既不继承Set也不继承Collection。
List、Set、Map共同的实现根底是Object数组
除了四个历史集合类外,Java2框架还引入了六个集合实现,如
下表所示。
接口实现历史集合类
SetHashSet
TreeSet
ListArrayListVector
Linkedl.istStack
MapHashMapHashtable
TreeMapProperties
历史集合类局部解释
Vector是个像可增大数组的历史集合类,但它可以存储不同类型
的数据元素。Java2SDK,版本2中Vector类被改良到“集合框
架"层次结构中以实现List接口。但是,如果您在使用新框架,您
应该使用ArrayList,而不是List。
从Vector转换为ArrayList时,一个关键的差异是一为
了更改元素值的位置,参数的顺序被颠倒了。
Stack类继承Vector,通过push()和pop()方法以实
现一个标准的后进先出(last-in-first-out(LIFO))堆极。可是,
我们要当心。因为Stack类继承Vector类,您仍然可以用被继
承的Veulor的方法访问或修改Sluck。
Enumeration接口
Enumeration接口允许您迭代集合中的所有元素。在"集合框架"
中,该接口被Iterator接口替代。但是,并不是所有的库都支持较
新的接口,所以您可能会发现自己常常使用Enumeration。尽管有些
人更喜欢Fterator这个方法名称,但用Enumeration迭代和
用Iterator迭代类似。不过,Enumeration不支持除去操作。
Enumerationenum=...;while(enum.hasNextElement()){
Objecte1ement=iterator.nextElement();//processe1
ement}
Hashtable实现是个一般的字典,它允许存储任何对象咋为它的键
或值(包括null)°在Java2SDK,版本1.2中,这个类被重新改
写到“集合框架"中去实现Map接口。所以,您可用原始的Hashtab
le方法或较新的Map方法。如果您需要一个同步的Map,使用Hash
table比使用同步的HashMap稍快一些。
任何集合(Collection)都能产生一个迭代器(Iterator),而一
个List除了能生成一个Listltcrator(列表迭代器)外,还能生成一
个普通迭代器,因为List正是从集合继承来的.
1.2Collection
1.2.1常用方法
Collection接口用于表示任何对象或元素组。想要尽可能以常规方式处理
一组元素时,就使用这一接口。Collection在前面的大图也可以看出,它是Li
st和Set的父类。并且它本身也是一个接口。它定义了作为集合所应该拥有的
一些方法。如下:
注意:
集合必须只有对象,集合中的元素不能是根本数据类型。
Collection接口支持如添加和除去等根本操作。设法除去一个元素时,如
果这个元素存在,除去的仅仅是集合中此元素的一个实例。
booleanadd(Objectelement)
booleanremove(Objectelement)
Collection接口还支持查询操作:
intsize()
booleanisEmpty()
booleancontains(Objectelement)
1teratoriterator()
组操作:Collection接口支持的其它操作,要么是作用于元素组的任务,
要么是同时作用于整个集合的任务。
booleancontainsAll(Collectioncollection)
booleanaddAl1(Collectioncollection)
voidclear()
voidremovcAll(Collectioncol1cction)
voidretainAll(Collectioncollection)
containsAll()方法允许您查找当前集合是否包含了另一个集合的所有元家,即另一个集合
是否是当前集合的子集。其余方法是可选的,因为特定的集合可能不支持集合更改。addAUO
方法确保另一个集合中的所有元素都祓添加到当前的集合中,通常称为并。clear0方法
从当前集合中除去所有元素。removeAHO方法类似于clear。,但只除去了元素的一个
子集。retainAl1()方法类似于removeAHO方法,不过可能感到它所做的与前面正好相
反:它从当前集合中除去不属于另一个集合的元素,即交。
我们看一个简单的例子,来了解一下集合类的根本方法的使用:
importjava.util.♦;
publicclassCollectionToArray{
publicstaticvoidmain(String[]args){
Collectioncollectionl=nevArrayListO;〃创建一个集合对象
collection1,add("000");〃添加对象到Collection集合中
collection!.add("l11");
'1
collectioni.addC222);
System.out.printIn("集合collection1的大小:"+collection1.sizcO);
System,out.printin("集合collectionl的容:"+collectionl);
collectionl.remove("000");〃从集合collectionl中移除掉,000"这个对象
System,out.printIn("集合collectionl移除000后的容:"+colleclionl);
System,out.prinlln("集合colleclionl中是否包含000:
"+collectionl.contains(*000"));
System.out.println("集合collectionl中是否包含111:
"+collectionl,contains(rlll")):
Collectioncollection2=nevArrayListO:
collection2.addAl1(collectionl)://^collectionl集合中的元素全部都加到
collections中
System,oul.prinlln("集合collection2的容:*+collection2);
collection?,clear。;//清空集合collectionl中的元素
System.out.printin("集合collection2是否为空:"+collection2.isEmptyO);
〃将集合collectionl转化为数组
Objects[]=collectionl.toArrayO:
for(inti=0;i<s.length:i++)(
System.out.println(s[i]);
|
)
)
运行结果为:
集合collectionl的大小:3
集合collectionl的容:[000,111,222]
集合collectionl移除000后的容:[111,222]
集合collectionl中是否包含000:false
集合collectionl中是否包含111:true
集合collection2的容:[ill,222]
集合collection2是否为空:true
111
222
这里需要注意的是,Collection它仅仅只是一个接口,而我们真正
使用的时候,确是创建该接口的一个实现类。做为集合的接口,它定义
了所有属于集合的类所都应该具有的一些方法。
而ArrayList(列表)类是集合类的一种实现方式。
这里需要一提的是,因为Collection的实现根底是数组,所以有
转换为Object数组的方法:
Object[]toArray()
Object[]toArray(Object[]a)
其中第二个方法Object口toArray(Object[]a)的参数a应该
是集合中所有存放的对象的类的父类。
1.2.2迭代器
任何容器类,都必须有某种方式可以将东西放进去,然后由某种方
式将东西取出来。毕竟,存放事物是容器最根本的工作。对于ArrayLi
st,add()是插入对象的方法,而get()是取出元素的方式之一。Arr
ayList很灵活,可以随时选取任意的元素,或使用不同的下标一次选取
多个元素。
如果从更高层的角度思考,会发现这里有一个缺点:要馍用容器,
必须知道其中元素确实切类型。初看起来这没有什么不好的,但是考虑
如下情况:如果原本是ArrayList,但是后来考虑到容器的特点,你
想换用Set,应该怎么做?或者你打算写通用的代码,它们只是使用
容器,不知道或者说不关心容器的类型,那么如何才能不重写代码就可
以应用于不同类型的容器?
所以迭代器(Iterator)的概念,也是出于一种设计模式就是为达成
此目的而形成的。所以Collection不提供get。方法。如果要遍历Col
lectin中的元素,就必须用Iterator。
迭代器(Iterator)本身就是一个对象,它的工作就是遍历并选择
集合序列中的对象,而客户端的程序员不必知道或关心该序列底层的结
构。此外,迭代器通常被称为‘‘轻量级"对象,创建它的代价小。但是,
它也有一些限制,例如,某些迭代器只能单向移动。
Collection接口的iterator0方法返回一个Iterator。Iterator和您
可能已经熟悉的Enumeration接口类似。使用Ileraior接口方法,您可
以从头至尾遍历集合,并安全的从底层Collection中除去元素。
下面,我们看一个对于迭代器的简单使用:
importjava.util.ArrayList:
importjava.util.Collection;
importjava.util.Iteralor;
publicclass1teratorDemo•
publicstaticvoidmain(String[]args){
Collectioncollection=nevArrayList();
collection.add(Ms1”::
collection,add("s2"};
collection,add(ns3"};
Iteratoriterator=collection,iterator();4一人迭代各
while(iterator.hasNext()){//遇石
Objectelement=iterator.next();
System,out.printin("iterator="1element);
}
if(collection.isEmpty())
System.out.println("collectionisEmpty!*):
else
System.out.println("collectionisnotEmpty!size="+colle
ction.size0);
Iteratoriterator2=collection.iteratorO;
while(iterator2.hasNextO){〃移除元素
Objectelement=iterator2.next();
System.out.printin("remove:"+elcment);
iterator?,remove();
)
Iteratoriterator?=collection,iterator();
if(!iterators.hasNextO)观察是否还有元亲
System.out.printin("还有元素");
}
if(collection.isEnipty())
System.out.println(Mcol1ectionisEmpty!*);
//使用collection,isEmpty()方法来判断
}
}
程序的运行结果为:
iterator=si
iterator=s2
iterator=s3
collectionisnotEmpty!size=3
remove:si
remove:s2
remove:s3
还有元素
collectionisEmpty!
可以看到,Java的Collection的Iterator能够用来,:
1)使用方法iterator()要求容器返回一个Iterator.
第一次调用Iterator的next。方法时,它返回集合序列的
第一个元素。
2)使用next。获得集合序列的中的下一个元素。
3)使用hasNextO检查序列中是否元素。
4)使用remove。将迭代器新返回的元素删除。
需要注意的是:方法删除由n”t方法返向的最后一个元素.在每
次调用next时,remove方法只能被调用一次。
大家看,Java实现的这个迭代器的使用就是如此的简单。Iterato
r(跌代器)虽然功能简单,但仍然可以帮助我们解决许多问题,同时
针对List还有一个更复杂更高级的Listiterator。您可以在下面的L
ist讲解中得到进一步的介绍。
1.3List
1.3.1概述
前面我们济述的(,l,ci,n接口实际上并没有直接的实现类II批注H1]:它有两个子接口:
1、List2、Set
是容器的一种,表示列表的意思。当我们不知道存储的数据有多少的情况,
我们就可以使用List耒完成存储数据的工作。例如前面提到的一种场景。
我们想要在保存一个应用系统当前的在线用户的信息。我们就可以使用一个
List耒存储。因为Lisi的最大的特点就是能够自动的根据插入的数据量来
动态改变容器的大小。下面我们先看看List接口的一些常用方法。
1.3.2常用方法
List就是列表的意思,它是Collection的一种,即继承了Collection
接口,以定义一个允许重复项的有序集合。该接口不但能够讨列表的一局部进展
处理,还添加了面向位置的操作。List是按对象的进入顺序进展保存财象,而
不做排序或编辑操作。lection接口的所有的方法外还拥有一曼
其他的方法。
面向位置的操作包括插入某个元素或Collection的功能,还包括获取、除
去或更改元素的功能。在List中搜索元素可以从列表的头部或尾部开始,如
果找到元素,还符报告元素所在的位置。
voidadd(intindex.Objectelement):添加对象element
到位置index上
booleanaddAl1(intindex,Collectioncollection):在i
ndex位置后添加容器collection中所有的元素
Objectget(intindex):取出下标为index的位置的元素
intindexOf(Objectelement):查找对象element在List
中第一次出现的位置
intlastIndexOf(Objectelement):查找对象element在Li
st中最后出现的位匿
Objectremove(intindex):删除index位置上的元素
Objectset(intindex,Objectelement):将index位置上
的对象替换为element并返回老的元素。
先看一下下面表格:
简述实现操作特性成员要求
提供快速的基于索引的成员访
成员可为任意
ArrayList问,对尾部成员的增加和删除
Object子类的对象
支持较好
提供基于索引
List的对成员的随
机访问
对列表中任何位置的成员的增
成员可为任意
LinkedList加和删除支持较好,但对基于
Object子类的对象
索引的成员访问支持性能较差
在“集合框架”中有两种常规的List实现:ArrayList和LinkedList。
使用两种List实现的哪一种取决于您特定的需要。如果要支持随机访
问,而不必在除尾部的任何位置插入或除去元素,那么,ArrayList提供
了可选的集合。但如果,您要频繁的从列表的中间位置添加和除去元素,
而只要顺序的访问列表元素,那么,LiukcdLisl实现更好。
我们以ArrayList为例,先看一个简单的例子:
例子中,我们把12个月份存放到ArrayList中,然后用一个循环,
并使用get()方法将列表中的对象都取出来。
而LinkedList添加了一些处理列表两端元素的方法(以下图元显示了新方
法):
使用这些新方法,您就可以轻松的把LinkedList当作一个堆栈、队列或
其它面向端点的数据结构。
我们再来看另外一个使用LinkedList耒实现一个简单的队列的例子
importjava.util.*:
publicclassListExample{
publicstaticvoidmain(Stringargs[]){
LinkedListqueue=netLinkedList();
queue.addEirst(,Bernacine,);
queue.addFirst(*E1izateth*):
queue.addFirst('Gene");
queue.addFirst(,E1izateth*);
queue.addFirst("Clara');
System,out.println(qucuc);
queue.removeLast();
queue.removeLast();
System.out.println(qu€ue);
)
)
运行程序产生了以下输出。请注意,仔Set不同的是List力许重复。
[Clara,Elizabeth,Gene,Elizabeth,Bernadine]
[Clara,Elizabeth.Gene]
该的程序演示了具体List类的使用。第一局部,创建一个由ArrayList
支持的List。填充完列表以后,特定条目就得到了。示例的LinkedList局部
把LinkedList当作一个队列,从队列头部添加东西,从尾部除去。
List接口不但以位置友好的方式遍历整个列表,还能处理集合的子集:
Listiterator1istIterator():返回一个Listlter
ator跌代器,默认开始位置为0
Listlterator1istlterator(intstartindex):返
回一个Listiterator跌代器,开始位置为startindex
ListsubList(intfromlndex,inttolncex):返回
一个子列表List,元素存放为从fromlndex到toIndex之
前的一个元素。
处理subList0时,位于fromlndex的元素在子列表中,而位于tolnde
x的元素那么不是,提醒这一点很重要。以下for-loop测试案例大致反映了
这一点:
for(inti=fromlndcx;i<tolndex;i++)(
//processelementatpositioni
}
此外,我们还应该提醒的是:对子列表的更改(如add(),remove0和s
et0调用)对底层List也有影响。
Listiterator接口
Listiterator接口继承Iterator接口以支持添加或更改底层集合中的
元素,还支持双向访问
以下源代码演示了列表中的反向循环。请注意Listiterator敢初位于列
表尾之后(list.size。),因为第一个元素的下标是0。
Listlist=...:
ListIteratoriterator=list.listltcrator(list.sizcO);
while(iterator.hasPrevious()){
Objectelement=iterator.previousO;
//Processe1ement
}
正常情况下,不用Listiterator改变某次遢历柒合元素的方向一向前
或者向后。虽然在技术上可能实现时,但在previousO后立刻调用next0,
返回的是同一个元素。把调用nextO和previous0的顺序菠倒一下,结果
一样。
我们看一个List的例子:
importjava.util.*;
publicclassListlteratorTest{
publicstaticvoidmain(String[]args){
List1ist=nevArrayList();
list,add("aaa");
list.addCbbb");
list,add("ucu");
list.add("ddd");
System.out.printin("下标0开始:"+list.listJteraCor(0).next。);
//next0
Sysiem.oul.prinlln('下标1开始;"+]ist.lisllleralor(l).next
0);
System.out.print1n('子List1-3:"+1ist.subl.i(1,3))://子列表
[.istIteratorit=list,listiterator();//默认从下标。开始
〃隐式光标属性add操作,插入到当前的下标的前面
it.add("sss");
while(it.hasNext())(
System.out.println("nextIndex="+it.nextIndex()+".Object=
w+it.next());
)
〃sel属性
ListIteratoritl=1ist.listlteratorO:
itl.next0:
iti.set(rooo"):
ListIteratorit2=1ist.1istIterator(1ist.size()):1下标
while(it2.hasPrevious()){
System,out.printin("previousIndex="+it2.previouslndex()+
”,Object=*+it2.previous());
)
)
}
程序的执行结果为:
下标0开始:aaa
下标1开始:bbb
子List1-3:[bbb,ccc]
nextIndex=l,Object=aaa
nextIndex=2.Object=bbb
nextIndox=3.Object=ccc
nextIndex=4.Object=ddd
previousIndox=4.Object=ddd
previousIndex=3,Object=ccc
previousIndex=2,Object=bbb
previousIndex=l,Object=aaa
previousIndex=0,Objecc=ooo
我们还需要梢微再解释一下add()操作。添加一个元素会导致新元
素立刻被添加到隐式光标的前面。因此,添加元素后调用previous()
会返回新元素,而调用next。那么不起作用,返回添加操作之前的下
一个元素。下标的显示方式,如以下图所示:
对于List的根本用法我们学会了,下面我们来进一步了解一二List的实
现原理,以便价升我们对于集合的理解。
1.3.3实现原理
前面已经提了一下Collection的实现根底都是基于数组的。下面我
们就已ArrayList为例,简单分析一下ArrayList列表的实现方式。
首先,先看下它的构造函数。
以下表格是在SUN提供的API中的描述:
ArrayList0Constructsanemptylistwithaninitial
capacityoften.
ArrayList(Collectionc)Constructsalistcontaining
theelementsofthespecifiedcollection,intheordertheyarereturned
bythecollection'siterator.
ArrayList(iniinitialcapacity)Constructsanempty
listwiththespecifiedinitialcapacity.
其中第一个构造函数ArrayList()和第二构造函数ArrayList(Collect
ionc)是按照Col1ection接口文档所述,所应该提供两个构造函数,一
个无参数,一个承受另一个Collection。
第3个构造函数:
ArrayList(intinitialCapacity)是ArrayLisl实现,的比拟重要的构造
函数,虽然,我们不常用它,但是某认的构造函数正是调用的该带参数:initi
alCapacity的构造函数耒实现的。其中参数:initialcapacity表示我们构造
的这个ArrayLisi列表的初始化意尽是多大。如果调用默认的构造函数,那么表
示默认调用该参数为initialCapacity=10的方式,来进展构这一个ArrayLis
t列表对象。
为了更好的理解这个initialcapacity参数的概念,我们先看看ArrayLis
I在Sun提供的源码中的实现方式。先看一下它的属性有哪些:
ArrayList继承了AbslraclLisi我们主要看看ArrayLisl中的属性就可以
T.
ArrayList中主要包含2个属性:
privatetransientObjectelementData[];
privateintsize;
其中数组::elementData[]是列表的实现核心属性:数组。我们使用该
数组来进展存放集合中的数据。而我们的初始化参数就是该数组构建时候的长
度,即该数组的length属性就是initialCapaciiy参数。
Keys:transient表示被修饰的属性不是对象持久状杰的一局赤,不会自动
的序列化。
第2个属性:size表示列来中真实数据的存放个数。
我们再来看一下ArrayList的构造函数,加深一下ArrayList是基于数组的
理解。
从源码中可以看到默认的构造函数调用的就是带参数的构造函数:
publicArrayList(intinitia
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高职木业产品设计与制造(木材制品设计)试题及答案
- 2025年中职彗星探测技术(彗星探测)模拟试题
- 2025-2026年二年级综合实践(生活体验)下学期期中单元
- 2025年高职护理伦理学(伦理基础)试题及答案
- 2025年中职现代物流(物流条码技术)试题及答案
- 2025年安全生产培训试题及答案
- 深度解析(2026)《GBT 18268.26-2010测量、控制和实验室用的电设备 电磁兼容性要求 第26部分:特殊要求 体外诊断(IVD)医疗设备》
- 深度解析(2026)《GBT 17983-2000带断屑槽可转位刀片近似切屑控制区的分类和代号》
- 深度解析(2026)《GBT 17980.38-2000农药 田间药效试验准则(一) 杀线虫剂防治根部线虫病》
- 2026届四川泸州市高考一模地理试卷试题(含答案详解)
- 游戏:看表情符号猜成语PPT
- 手术室医疗废物的管理
- 健康环保类、健康安全环保词典(EHS的常见英语单词缩写表)
- 普通机床主传动系统的设计课程设计说明书
- 精神分裂症等五个病种临床路径及表单(2023版)
- 语用学-文化语用原则
- GB/T 629-1997化学试剂氢氧化钠
- GB/T 37234-2018文件鉴定通用规范
- 水利工程监理规划78648
- 灭火器每月定期检查及记录(卡)表
- T-CCIAT 0043-2022 建筑工程渗漏治理技术规程
评论
0/150
提交评论