Java容器.docx
《Java容器.docx》由会员分享,可在线阅读,更多相关《Java容器.docx(13页珍藏版)》请在冰豆网上搜索。
![Java容器.docx](https://file1.bdocx.com/fileroot1/2023-1/22/585955ae-642f-4906-8cbe-29e8f28c5716/585955ae-642f-4906-8cbe-29e8f28c57161.gif)
Java容器
Java笔记
==============================================
本章内容:
容器的概念
容器API
Collection接口
Iterator接口
增强的for循环
Set接口
List接口和Comparable接口
Collections类
Map接口
自动打包和解包
泛型
1136:
一个图,一个类Collections,三个知识点For,Generic,Auto-Boxing/Unboxing,六个接口Collection,Set,List,Comparable,Map,Iterator
=============================================
容器API
Collection接口定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式
Set中的数据对象没有顺序且不可以重复
List中的数据对象有顺序且可以重复
Map接口定义了存储“键值映射对”的方法。
Collection接口中定义的方法:
intsize();
booleanisEmpty();
voidclear();
booleancontains(Objectelement);
booleanadd(Objectelement);
booleanremove(Objectelement);
Iteratoriterator();
booleancontainsAll(Collectionc);
booleanaddAll(Collectionc);
booleanremoveAll(Collectionc);
booleanretainAll(Collectionc);
Objeet[]toArray();
如:
importjava.util.*;
publicclassTest{
publicstaticvoidmain(String[]srgs)
{
Collectionc=newArrayList();//父类引用指向子类的对象
c.add("Hello");
c.add(newName("f1","f2"));
c.add(newInteger(200));//添加的东西不能是基本的数据类型,必须为Object
System.out.println(c.size());
System.out.println(c);//调用toString方法,所以要重写toString方法
}
publicclassName{
privateStringfirstName,lastName;
publicName(StringfirstName,StringlastName){
this.firstName=firstName;
this.lastName=lastName;
}
publicStringgetFirstName(){returnfirstName;}
publicStringgetLastName(){returnlastName;}
publicStringtoString(){returnfirstName+""+lastName;}
}
}
=========================================
Collection方法举例
容器类对象在调用remove、contains等方法时需要比较对象是否相等,这会涉及到独享类型的equals方法和hashCode方法;对于自定义的泪类,需要重写equals和hashCode方法以实现自定义的对象相等规则。
注意:
相等的对象应具有相等的hashCode。
importjava.util.*;
publicclassBasicContainer{
publicstaticvoidmain(String[]args){
Collectionc=newHashSet();
c.add("Hello");
c.add(newName("firstName","lastName"));
c.add(newInteger(100));
System.out.print(c);
System.out.println(c.size());
c.remove("Hello");
c.remove(newInteger(100));
System.out.println(c.remove(newName("firstName","lastName")));//false
System.out.println(c);
}
}
className{
privateStringfirstName;
privateStringlastName;
publicName(StringfirstName,StringlastName){
this.firstName=firstName;
this.lastName=lastName;
}
publicStringgetFirstName(){returnfirstName;}
publicStringgetLastName(){returnlastName;}
publicStringtoString(){
returnfirstName+""+lastName;
}
//重写equals()方法
publicbooleanequals(Objectobj){
if(objinstanceofName){
Namename=(Name)obj;//强制转换符
return(firstName.equals(name.firstName))&&(lastName.equals(name.lastName));
}
returnsuper.equals(obj);
}
//重写hashCode方法
publicinthashCode(){
returnfirstName.hashCode();
}
}
==================================================
Iterator接口
1.所有实现了Collection接口的容器类都有一个iterator方法,用以返回一个实现了Iterator接口的对象。
2.Iterator对象成为迭代器,用以方便的实现对容器内元素的遍历操作。
3.Iterator接口定义了如下方法:
booleanhasNext();//如果仍有元素可以迭代,则返回true
Objectnext();//返回游标右边的元素并将游标移动到下一个位置
voidremove();//删除游标左边的元素,在执行完next之后该操作只能执行一次
如:
publicstaticvoidmain(String[]args){
Collectionc=newArrayList();//父类引用指向子类的对象
c.add(newName("f1,","l1"));
c.add(newName("f2,","l2"));
c.add(newName("f3,","l3"));
System.out.println("大小:
"+c.size());
System.out.println("内容:
"+c);
Iteratori=c.iterator();
while(i.hasNext()){
Namen=(Name)i.next();
System.out.print(n.getFirstName()+"");
}
4.Iterator对象的remove方法是在迭代过程中删除元素的唯一安全的方法。
for(Iteratori=c.iterator();i.hasNext();){
Namen=(Name)i.next();
if(n.getFirstName().length()<3)
i.remove();//如果换成c.remove(name);会产生异常
}
System.out.println(c);
================================================
补充:
JDK1.5增强的for循环
1.增强的for循环对于遍历array或Collection的时候相当方便
2.缺陷:
对于数组不能方便的访问下标值;对于集合与Iterator相比不能方便地删除集合中的内容,而且在内部也是调用Iterator
3.总结:
除了简单遍历并读出其中的内容外,不建议使用增强的for循环
如:
在E:
\JavaLesson\Lesson1\rongqi\下的EnhancedFor.java文件
importjava.util.*;
publicclassEnhancedFor{
publicstaticvoidmain(String[]args){
int[]arr={1,2,3,4,5};
for(inti:
arr){
System.out.print(i+"");
}
System.out.println();
Collectionc=newArrayList();
c.add(newString("aaa"));
c.add(newString("bbb"));
c.add(newString("ccc"));
for(Objectj:
c){
System.out.println(j);
}
}
}
====================================================
Set接口
1.Set接口是Collection的子接口。
Set接口没有提供额外的方法,但实现Set接口的容器类中的元素是没有顺序的,而且不可以重复。
2.Set融合期可以与数学中“集合”的概念相对应。
3.j2sdkAPI中所提供的Set容器类有HashSet,TreeSet等。
如:
在E:
\JavaLesson\Lesson1\rongqi\下的TestSet.java文件
importjava.util.*;
publicclassTestSet{
publicstaticvoidmain(String[]args){
Sets1=newHashSet();
Sets2=newHashSet();
s1.add("a");s1.add("b");s1.add("c");
s2.add("d");s2.add("a");s2.add("b");
//Set和List容器类都有Constructor(Collectionc)
//构造方法用以初始化容器类
Setsn=newHashSet(s1);
sn.retainAll(s2);//求sn与s2的交集
Setsu=newHashSet(s1);
su.addAll(s2);//su与s2的并集
System.out.println(sn);
System.out.println(su);
}
}
=====================================================
List接口
1.List接口是Collection的子接口,实现List接口的容器类中的元素是有顺序的,而且可以重复的。
2.List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
3.J2SDK所提供的List容器类有ArrayList、LinkedList等。
所提供的方法有:
objectget(intindex);
objectset(intindex,objectelement);
voidadd(intindex,objectelement);
objectremove(intindex);
intindexOf(objecto);
intlastIndexOf(objecto);
如:
importjava.util.*;
publicclassTestList{
publicstaticvoidmain(String[]args){
Listl1=newLinkedList();
for(inti=0;i<=5;i++){
l1.add("a"+i);
}
System.out.println(l1);
l1.add(3,"a100");//在第三个位置添加元素a100
System.out.println(l1);
l1.set(6,"a200");//设置第六个元素为a200
System.out.println(l1);
System.out.println((String)l1.get
(2)+"");//取出第二个位置上的元素
System.out.println(l1.indexOf("a3"));//第三个元素的位置
l1.remove
(1);
System.out.println(l1);
}
}
====================================
List常用算法
类java.util.Collections提供了一些静态的方法实现了基于List容器的一些常用算法。
voidsort(List)对List容器内的元素排序
voidshuffle(List)对List容器内的元素进行随机排序
voidreverde(List)对List容器内的元素逆序排列
voidfill(List,object)用一个特定的对象重写整个List容器
voidcopy(Listdest,Listsrc)将srcList容器内容拷贝到destList容器
intbinarySearch(List,Object)对于顺序的List容器,采用折半查找特定对象
如:
在E:
\JavaLesson\Lesson1\rongqi\下的TestListAlgorithm.java文件
importjava.util.*;
publicclassTestListAlgorithm{
publicstaticvoidmain(String[]args){
Listl1=newLinkedList();
Listl2=newLinkedList();
for(inti=0;i<=9;i++){
l1.add("a"+i);
}
System.out.println(l1);
Collections.shuffle(l1);//随机排列
System.out.println(l1);
Collections.reverse(l1);//逆序
System.out.println(l1);
Collections.sort(l1);//排序
System.out.println(l1);
System.out.println(Collections.binarySearch(l1,"a4"));//折半查找
}
}
=================================================
Comparable接口
上面的算法根据什么确定容器中对象的大小呢?
所有可以开需的类都实现了java.lang.Comparable接口,Comparable接口中只有一个方法:
publicintcompareTo(objectobj)
该方法返回0表示this==obj
返回整数表示this>obj
返回负数表示this实现了Comparable接口的泪通过实现compareTo方法从而确定该类对象的排序方式。
如:
在E:
\JavaLesson\Lesson1\rongqi\下的BasicContainerSort.java文件
importjava.util.*;
publicclassBasicContainerSort{
publicstaticvoidmain(String[]args){
Listl1=newLinkedList();
l1.add(newName("Aspen","Hou"));
l1.add(newName("Ton","Karl"));
l1.add(newName("Jim","Green"));
l1.add(newName("Kate","Smith"));
System.out.println(l1);
Collections.sort(l1);
System.out.println(l1);
}
}
//该写Name类,继承Comparable接口,并改写compareTo()方法
classNameimplementsComparable{
privateStringfirstName;
privateStringlastName;
publicName(StringfirstName,StringlastName){
this.firstName=firstName;
this.lastName=lastName;
}
publicStringgetFirstName(){returnfirstName;}
publicStringgetLastName(){returnlastName;}
publicStringtoString(){
returnfirstName+""+lastName;
}
//重写equals()方法
publicbooleanequals(Objectobj){
if(objinstanceofName){
Namename=(Name)obj;//强制转换符
return(firstName.equals(name.firstName))&&(lastName.equals(name.lastName));
}
returnsuper.equals(obj);
}
//重写hashCode方法
publicinthashCode(){
returnfirstName.hashCode();
}
//改写compareTo方法
publicintcompareTo(Objecto){
Namen=(Name)o;
intlastCmp=lastNpareTo(n.lastName);
return(lastCmp!
=0?
lastCmp:
firstNpareTo(n.firstName));
}
}
====================================================
Map接口
1.实现Map接口的泪用来存储键值对
2.Map接口的实现类有HashMap和Treemap等
3.Map类中存储的键值对通过键来标识,所以键不能重复
它实现的方法有:
Objectput(Objextkey,Objectvalue);
Objectget(Objectkey);
Objectremove(Objectkey);
booleancontainsKey(Objectkey);
booleancontainsValue(Objectvalue);
intsize();
booleanisEmpty();
voidputAll(Mapt);
voidclear();
如:
在E:
\JavaLesson\Lesson1\rongqi\下的TestMap.java文件
importjava.util.*;
publicclassTestMap{
publicstaticvoidmain(String[]args){
Mapm1=newHashMap();
Mapm2=newTreeMap();
m1.put("one",newInteger
(1));//Key是一个String类型,Value是一个Integer对象类型
//m1.put("one",1);可以这样写,这是自动打包
m1.put("two",newInteger
(2));
//m1.put("two",2);可以这样写
m1.put("three",newInteger(3));
//m1.put("three",3);可以这样写
m2.put("A",newInteger
(1));
//m2.put("Ae",1);可以这样写
m2.put("B",newInteger
(1));
//m2.put("B",1);可以这样写
System.out.println(m1.size());//3
System.out.println(m1.containsKey("one"));//true
System.out.println(m2.containsValue(newInteger
(1)));//true
//上面一条语句也可以这样写:
System.out.println(m2.containsValue
(1));,这叫做自动解包
if(m1.containsKey("two")){
inti=((Integer)m1.get("two")).intValue();
//inti=(Integer)m1.get("two");
System.out.println(i);//2
}
Mapm3=newHashMap(m1);
m3.putAll(m2);
System.out.println(m3);
}
}
============================================
//这是一个计算main参数出现次数的小程序
importjava.util.*;
publicclassTestArgsWords{