Java集合类.docx
《Java集合类.docx》由会员分享,可在线阅读,更多相关《Java集合类.docx(26页珍藏版)》请在冰豆网上搜索。
![Java集合类.docx](https://file1.bdocx.com/fileroot1/2023-2/3/b748e3a2-2db1-478e-9c17-a32931697be9/b748e3a2-2db1-478e-9c17-a32931697be91.gif)
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;ivalues[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;ifor(intj=0;j<10;j++)
list.get(j);
}
};
staticTesterinsertTester=newTester("insert"){
publicvoidtest(Listlist){
ListIteratorit=list.listIterator(list.size()/2);
for(inti=0;iit.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;iSystem.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(映射)是一种把键对象和值对象进行映射的集合。
它的每一个元素都包含一