Java容器.docx

上传人:b****5 文档编号:7651171 上传时间:2023-01-25 格式:DOCX 页数:13 大小:19.17KB
下载 相关 举报
Java容器.docx_第1页
第1页 / 共13页
Java容器.docx_第2页
第2页 / 共13页
Java容器.docx_第3页
第3页 / 共13页
Java容器.docx_第4页
第4页 / 共13页
Java容器.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

Java容器.docx

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

Java容器.docx

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{

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

当前位置:首页 > 农林牧渔 > 林学

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

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