Java集合类.docx

上传人:b****8 文档编号:9361877 上传时间:2023-02-04 格式:DOCX 页数:26 大小:96.80KB
下载 相关 举报
Java集合类.docx_第1页
第1页 / 共26页
Java集合类.docx_第2页
第2页 / 共26页
Java集合类.docx_第3页
第3页 / 共26页
Java集合类.docx_第4页
第4页 / 共26页
Java集合类.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

Java集合类.docx

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

Java集合类.docx

Java集合类

Java中的集合类(重点)

(Collectionframework)我们在前面学习过java数组,java数组的长度是固定的,在同一个数组中只能存放相同的类型数据(数组的缺点)。

数组可以存放基本类型的数据,也可以存入对象引用的数据。

在创建数组时,必须明确指定数组的长度,数组一旦创建,其长度就不能改变,在许多应用的场合,一组数据的数目不是固定的,比如一个单位的员工人数是变化的,有老的员工跳槽,也有新的员工进来。

为了使程序方便地存储和操纵数目不固定的一组数据,JDK中提供了java集合类,所有java集合类都位于java.util包中,与java数组不同,java集合类不能存放基本数据类型数据,而只能存放对象的引用。

Java集合类分为三种

Set(集合):

集合中对象不按特定的方式排序。

并且没有重复对象,但它有些实现类中的对象按特定方式排序。

--无序,不能重复

List(列表):

集合中的对象按照检索位置排序,可以有重复对象,允许按照对象在集中的索引位置检索对象,List和数组有些相似。

--有序,可以重复

Map(映射):

集合中的每一个元素包含一对键对象和值对象,集合中没有重复的键对象,值对象可以重复,它的有些实现类能对集合中的键对象进行排序。

Java的主要集合类的框架图

Collection和Iterator接口

在Collection接口中声明了适用于java集合(只包括Set和List)通用方法。

Collection接口的方法

方法

描述

booleanadd(Objecto)

向集合中加入一个对象的引用

voidclear()

删除集合中所有对象,即不再对持有对象的引用

booleancontains(Objecto)

判断在集合中是否含有特定对象的引用

booleanisEmpty()

判断集合是否为空

Iteratoriterator()

返回一个Iterator对象,可用它来遍历集合中的元素

booleanremove(Objecto)

从集合中删除一个对象的引用

intsize()

返回集合中元素的数目

Object[]toArray()

返回一个数组,该数组包含集合中的所有元素

Set接口和List即可都继承了Collection接口,而Map接口没有继承Collection接口,因此可以对Set对象和List对象调用以上方法,但是不能对Map对象调用以上方法。

Collection接口的iterator()和toArray()方法多用于获得集合中的所有元素,前者返回一个Iterator对象,后者返回一个包含集合中所有元素的数组。

Iterator隐藏底层集合的数据结构,向客户程序提供了遍历各种类型的集合的统一接口。

Iterator接口中声明了如下方法:

●hasNext():

判断集合中的元素是否遍历完毕,如果没有,就返回true。

●next():

返回下一个元素

●remove():

从集合中删除上一个由next()方法返回的元素。

注意:

如果集合中的元素没有排序,Iterator遍历集合中元素的顺序是任意的,并不一定与像集合中加入的元素的顺序一致。

Set(集合)

Set是最简单的一种集合,集合中的对象不按特定方式排序,并没有重复对象。

Set接口主要有两个实现类:

HashSet类还有一个子类LinkedHashSet类,它不仅实现了哈希算法,而且实现了链表数据结构,链表数据结构能提高插入核算出元素的性能。

TreeSet类实现了SortedSet接口中,具有排序功能。

List(列表)

List的主要特征使其元素已先行方式存储,集合中允许存放重复对象。

List接口主要的实现类包括:

●ArrayList—ArrayList代表长度可变的数组。

允许对元素进行快速的随机访问,但是向ArrayList中插入与删除元素的速度较慢。

●LinkedList—在实现中采用链表数据结构。

对顺序访问进行了优化,向List中插入和删除元素的速度较快,随机访问速度则相对较慢,随机访问是指检索位于特定索引位置元素。

Map(映射)

Map(映射)是一种把键对象key和值对象value进行映射的集合。

它的每一个元素都包含一对键对象和值对象,而之对象仍可以是Map类型。

以此类推,这样就形成了多级映射。

向Map集合中加入元素时,必须提供一对键对象和值对象,从Map集合上检索元素只要给出键对象,就会返回值对象。

实例1

CollectionAll.java

packagecollection;

importjava.util.ArrayList;

importjava.util.Collection;

importjava.util.HashMap;

importjava.util.HashSet;

importjava.util.Iterator;

importjava.util.LinkedHashMap;

importjava.util.LinkedHashSet;

importjava.util.LinkedList;

importjava.util.List;

importjava.util.Hashtable;

importjava.util.Map;

importjava.util.Set;

importjava.util.SortedMap;

importjava.util.SortedSet;

importjava.util.TreeMap;

importjava.util.TreeSet;

publicclassCollectionAll{

publicstaticvoidmain(Stringargs[]){

Listlist1=newLinkedList();

list1.add("我");

list1.add("是");

list1.add("谁");

list1.add("我");

traverse(list1);

Listlist2=newArrayList();

list2.add("你");

list2.add("是");

list2.add("谁");

list2.add("你");

traverse(list2);

Setset1=newHashSet();

set1.add("他");

set1.add("是");

set1.add("谁");

set1.add("他");

traverse(set1);

SortedSetset2=newTreeSet();

set2.add("您");

set2.add("是");

set2.add("谁");

set2.add("您");

System.out.println(set2.size());

traverse(set2);

LinkedHashSetset3=newLinkedHashSet();

set3.add("尔");

set3.add("是");

set3.add("谁");

set3.add("尔");

traverse(set3);

Mapm1=newHashMap();

m1.put("name05","我");

m1.put("name06","是");

m1.put("name08","谁");

m1.put("name09","我");

traverse(m1.keySet());

traverse(m1.values());

SortedMapm2=newTreeMap();

m2.put("name01","我");

m2.put("name02","是");

m2.put("name03","谁");

m2.put("name04","我");

traverse(m2.keySet());

traverse(m2.values());

LinkedHashMapm3=newLinkedHashMap();

m3.put("name01","我");

m3.put("name02","是");

m3.put("name03","谁");

m3.put("name04","我");

traverse(m3.keySet());

traverse(m3.values());

Hashtablenumbers=newHashtable();

numbers.put("name01","我");

numbers.put("name02","是");

numbers.put("name03","谁");

numbers.put("name04","我");

traverse(numbers.keySet());

traverse(numbers.values());

}

staticvoidtraverse(Collectioncoll){

Iteratoriter=coll.iterator();

while(iter.hasNext()){

Stringelem=(String)iter.next();

System.out.print(elem+"");

}

System.out.println();

}

}

一.集合框架中的各种实现类

HashSet类

HashSet类按照哈希算法---存取集合中的对象,具有很好的存取和查找功能。

当向集合中加入一个对象时,HashSet对调用对象的hashCode()方法来获得哈希码,然后根据这个哈希码进一步计算出对象在集合中的存放位置。

实例2MyHashSet.java

packagecollection;

importjava.util.*;

publicclassMyHashSet{

publicstaticvoidmain(Stringargs[]){

HashSetset=newHashSet(6);

Object[]values={"Tom","Mike","Mary","Linda","Jone","Jack"};

for(inti=0;i

values[i].hashCode();

set.add(values[i]);

System.out.println(set.hashCode());

}

set.remove("Mike");

System.out.println("size="+set.size());

Iteratoriter=set.iterator();

while(iter.hasNext()){

Stringelem=(String)iter.next();

System.out.println(elem+"");

}

System.out.println(set.contains("Jack"));

System.out.println(set.contains("Linda"));

System.out.println(set.contains("Mike"));

}

}

TreeSet类

TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序,一下程序创建了一个TreeSet对象,然后向集合中加入了4个Integer对象

实例3

TreeSetTest.java

packagecollection;

importjava.util.*;

publicclassTreeSetText{

publicstaticvoidmain(Stringargs[]){

Setset=newTreeSet();

set.add(newInteger(8));

set.add(newInteger(7));

set.add(newInteger(6));

set.add(newInteger(9));

Iteratorit=set.iterator();

while(it.hasNext())

System.out.println(it.next()+"");

}

}

由此我们知道当TreeSet集合中加入一个对象时,会把它插入到有序的对象序列中。

ArrayList类

ArrayList—ArrayList代表长度可变的数组。

允许对元素进行快速的随机访问,它允许所有元素,有包括null。

ArrayList是线程不同步的,向ArrayList中插入与删除元素的速度较慢

LinkedList类

LinkedList—实现了List接口,允许null元素,在实现中采用链表数据结构。

对顺序访问进行了优化,向List中插入和删除元素的速度较快,随机访问速度则相对较慢,随机访问是指检索位于特定索引位置元素。

注意:

LinkedList没有同步方法。

如果多个线程同时访问一个List,则必须实现访问同步。

一种解决方法是在创建List时构造一个同步的List:

Listlist=Collection.synchronizedList(newList(…));

实例4

StackL.java

packagecollection;

importjava.util.LinkedList;

publicclassStackL{

privateLinkedListlist=newLinkedList();

publicvoidpush(Objectv){

list.addFirst(v);

}

publicObjecttop(){

returnlist.getFirst();

}

publicObjectpop(){

returnlist.removeFirst();

}

publicstaticvoidmain(Stringargs[]){

StackLstack=newStackL();

for(inti=0;i<10;i++)

stack.push(newInteger(i));

System.out.println(stack.top());

System.out.println(stack.top());

System.out.println(stack.pop());

System.out.println(stack.pop());

System.out.println(stack.pop());

}

}

ListIterator接口(现在很少用了)

List的listIterator()方法返回一个ListIterator对象,ListIterator接口继承了Iterator接口,此外还提供了专门操控列表的方法。

●add():

向列表插入一个元素

●hasNext():

判断列表中是否还有下一个元素

●hasPrevious():

判断列表中是否还有上一个元素

●next():

返回列表中的下一个元素

●previous():

返回列表中的上一个元素

实例5

ListIterator.java

importjava.util.*;

publicclassListInserter{

publicstaticvoidinsert(Listlist,intdata){

ListIteratorit=list.listIterator();

while(it.hasNext()){

Integerin=(Integer)it.next();

if(data<=in.intValue()){

it.previous();

it.add(newInteger(data));

break;

}

}

}

publicstaticvoidmain(Stringargs[]){

Listlist=newLinkedList();

list.add(newInteger(3));

list.add(newInteger

(2));

list.add(newInteger(5));

list.add(newInteger(9));

Collections.sort(list);

insert(list,6);

ListIteratorit=list.listIterator();

while(it.hasNext()){

Integerelem=(Integer)it.next();

System.out.println(elem+"");

}

}

}

实例6比较java数组和各种List的性能

PerformanceTester.java

packagecollection;

importjava.util.*;

publicclassPerformanceTester{

privatestaticfinalintTIMES=100000;

publicstaticabstractclassTester{

privateStringoperation;

publicTester(Stringoperation){this.operation=operation;}

publicabstractvoidtest(Listlist);

publicStringgetOperation(){returnoperation;}

}

staticTesteriterateTester=newTester("iterate"){

publicvoidtest(Listlist){

for(inti=0;i<10;i++){

Iteratorit=list.iterator();

while(it.hasNext())

{it.next();}

}

}

};

staticTestergetTester=newTester("get"){

publicvoidtest(Listlist){

for(inti=0;i

for(intj=0;j<10;j++)

list.get(j);

}

};

staticTesterinsertTester=newTester("insert"){

publicvoidtest(Listlist){

ListIteratorit=list.listIterator(list.size()/2);

for(inti=0;i

it.add("hello");

}

};

staticTesterremoveTester=newTester("remove"){

publicvoidtest(Listlist){

ListIteratorit=list.listIterator();

while(it.hasNext()){

it.next();

it.remove();

}

}

};

staticpublicvoidtestJavaArray(Listlist){

Tester[]testers={iterateTester,getTester};

test(testers,list);

}

staticpublicvoidtestList(Listlist){

Tester[]testers={insertTester,iterateTester,removeTester};

test(testers,list);

}

staticpublicvoidtest(Tester[]testers,Listlist){

for(inti=0;i

System.out.print(testers[i].getOperation()+"操作:

");

longt1=System.currentTimeMillis();

testers[i].test(list);

longt2=System.currentTimeMillis();

System.out.println(t2-t1+"ms");

System.out.println();

}

}

publicstaticvoidmain(Stringargs[]){

Listlist=null;

System.out.println("---测试java数组---");

Stringss[]=newString[TIMES];

Arrays.fill(ss,"hello");

list=Arrays.asList(ss);

testJavaArray(list);

ss=newString[TIMES/2];

Collectioncol=Arrays.asList(ss);

System.out.println("---测试Vector---");

list=newVector();向量(存取对象的1.5前的)

list.addAll(col);

testList(list);

System.out.println("---测试LinkedList---");

list=newLinkedList();

list.addAll(col);

testList(list);

System.out.println("---测试ArrayList---");

list=newArrayList();

list.addAll(col);

testList(list);

}

}

从结果可以看出,对java数组进行随机访问和迭代操作具有最快的速度;对LinkedList进行插入和删除具有最快的速度;对ArrayList进行随机访问也具有较快的速度,Vector类在各个方面都没有突出的性能描述与历史集合类,已经不提倡使用它。

Map

Map(映射)是一种把键对象和值对象进行映射的集合。

它的每一个元素都包含一

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

当前位置:首页 > 解决方案 > 学习计划

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

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