MLDN 开发实战经典 第十三章 Java类集.docx
《MLDN 开发实战经典 第十三章 Java类集.docx》由会员分享,可在线阅读,更多相关《MLDN 开发实战经典 第十三章 Java类集.docx(71页珍藏版)》请在冰豆网上搜索。
MLDN开发实战经典第十三章Java类集
第十三章Java类集
在创建Java数组时,必须明确指定数组的长度,数组一旦创建,其长度就不能被改变。
在许多应用场合,一组数据的数目是不固定的,比如一个单位的员工数目是变化的。
为了使用程序能方便地存储和操纵数目不固定的一组数据,JDK类库提供了Java类集(集合),所有Java类集都位于java.util包中。
Java类集中不能存放基本类型数据,而只能存放对象的引用。
⏹Java类集主要分为以下3种类型:
⏹Set(集):
集合中的对象不按特定方式排序,并且没有重复对象。
⏹List(列表):
集合中的对象按照索引位置排序,可以有重复对象。
⏹Map(映射):
集合中的每一个元素包含一对键对象和值对象,没有重复的键对象,值对象可以重复。
在Java中必须掌握的知识点,会开发的:
1、面向对象
2、Java的类集
3、JavaIO
4、JDBC
1、认识类集、Collection接口
1.1、课程目标
⏹掌握Java设置类集框架的目的
⏹掌握类集中的各个主要接口
⏹掌握Collection接口的作用
1.2、具体内容
类集的作用
类集实际上就是一个动态的对象数组,与一般的对象数组不同,类集中的对象内容可以任意扩充。
类集的特征:
⏹这种框架是高性能的
⏹框架必须允许不同类型的类集以相同的方式和高度互操作方式工作
⏹类集必须是容易扩展和修改的
对象数组的操作中基本上都要保证对象类型的一致性,对于类集而言本身其内容元素也应该保持一致,不管是何种类型的数据,所有的操作方式都应该是一样的。
类集框架主要接口
No.
接口
描述
1
Collection
是存入一组单值的最大接口,所谓的单值是指集合中的每个元素都是一个对象。
一般很少直接使用此接口直接操作。
2
List
是Collection接口的子接口,也是最常用的接口,此接口对Collection接口进行了大量的扩充,里面的内容是允许重复的。
3
Set
是Collection接口的子类,没有对Collection接口进行扩充,里面不允许存放重复内容
4
Map
Map是存放一对值的最大接口,即接口中的每个元素都是一对,以key->value形式保存
5
Iterator
集合的输出接口,用于输出集合中的内容,只能进行从前到后的单向输出
6
ListIterator
是Iterator的子类接口,可以进行双向输出
7
Enumeration
是最早的输出接口,用于输出指定集合中的内容
8
SortedSet
单值的排序接口,实现此接口的集合类,里面的内容是可以排序的,使用比较器排序
9
SortedMap
存放一对值的排序接口,实现此接口的集合类,内容按照key排序,使用比较器排序
10
Queue
队列接口,此接口的子类可以实现队列操作
11
Map.Entry
Map.Entry的内部接口,每个Map.Entry对象都保存着一对key->value的内容,每个Map接口中都保存多个Map.Entry接口实例。
以上的接口必须全部掌握。
并且掌握各个接口的主要特点。
Collection接口的的定义
⏹Collection是保存单值集合的最大父接口。
⏹Collection接口定义:
◆publicinterfaceCollectionextendsIterable
⏹JDK1.5之后为Collection接口增加了泛型声明
所有的类集操作都存放在java.util包中
Collection方法定义
方法摘要
boolean
add(E e)确保此collection包含指定的元素(可选操作)。
boolean
addAll(Collection
extendsE> c)将指定collection中的所有元素都添加到此collection中(可选操作)。
void
clear()移除此collection中的所有元素(可选操作)。
boolean
contains(Object o)如果此collection包含指定的元素,则返回true。
boolean
containsAll(Collection
> c)如果此collection包含指定collection中的所有元素,则返回true。
boolean
equals(Object o)比较此collection与指定对象是否相等。
int
hashCode()返回此collection的哈希码值。
boolean
isEmpty()如果此collection不包含元素,则返回true。
Iterator
iterator()返回在此collection的元素上进行迭代的迭代器。
boolean
remove(Object o)从此collection中移除指定元素的单个实例,如果存在的话(可选操作)。
boolean
removeAll(Collection
> c)移除此collection中那些也包含在指定collection中的所有元素(可选操作)。
boolean
retainAll(Collection
> c)仅保留此collection中那些也包含在指定collection的元素(可选操作)。
int
size()返回此collection中的元素数。
Object[]
toArray()返回包含此collection中所有元素的数组。
T[]
toArray(T[] a)返回包含此collection中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。
Collection接口的使用注意
在一般的开发中,往往很少去直接使得Collection接口进行开发,而基本上都是使用其子接口。
子接口主要有:
List、Set、Queue、SortedSet。
之所以不使用Collection接口也是Java的逐步发展形成的,最早的时候实际上Collection接口被广泛使用,因为EJB技术的支持,在EJB2.x中大量的使用了Collection接口,但是随着发展,SUN公司开始将这些标准进行逐步的规范化,所以在SUN一个开源——宠物商店,基本上就不再直接使用Collection了,而是使用List或Set,这样来说可以更加清楚的表示出操作的类型。
Collection子接口的定义
Collection接口虽然是集合的最大接口,从但是如果直接使用Collection接口进行操作的等方面,则表示的操作意义不明确,所以在Java开发中已经不提倡直接使用Collection接口了,主要的子接口如下:
⏹List接口:
可以存放重复的内容。
⏹Set接口:
不能存放重复的内容,所有的重复内容是靠hashCode()和equals()两个方法区分的
⏹Queue:
队列接口
⏹SortedSet接口:
可以对集合中的数据进行排序
1.3、总结
2、List接口
2.1、本章目标
⏹掌握List接口与Collection接口的关系
⏹掌握List接口的常用子类:
ArrayList、Vector
⏹掌握ArrayList与Vector类的区别
2.2、具体内容
Collection下分为很多的子接口,其中有一个List接口,List接口中可以存放任意的数据。
而且在List接口中内容是允许重复的。
List接口的功能要比Collection接口强大很多,因为大量的扩充了Collection接口的操作。
如果要想使用接口,则肯定要使用对象的多态性进行实例化的操作,那么对于List接口本身也是一样的。
ArrayList类是List中最常用的子类。
importjava.util.ArrayList;
importjava.util.List;
publicclassArrayListDemo{
publicstaticvoidmain(Stringargs[]){
ListallList=null;
allList=newArrayList();//指定操作的泛型为String
allList.add(“Hello”);//此方法由Collection接口而来
allList.add(“World”);//默认情况下向最后加入
System.out.println(allList);
}
};
指定位置上添加一组数据,添加的方法是List接口扩充的方法
importjava.util.ArrayList;
importjava.util.List;
importjava.util.Collection;
publicclassArrayListDemo01{
publicstaticvoidmain(Stringargs[]){
ListallList=null;
CollectionallCollection=null;
allList=newArrayList();//指定操作的泛型为String
allCollection=newArrayList();//指定一个集合
allList.add("Hello");//此方法由Collection接口而来
allList.add(0,"World");//在第一个位置上添加新的内容
System.out.println(allList);
allCollection.add("LXH");//向Collection中加入内容
allCollection.add("");
allList.addAll(allCollection);//把集合allCollection加入到allList中
allList.addAll(0,allCollection);//加入到指定的第1个位置
System.out.println(allList);
}
};
既然可以增加数据,那么就可以删除数据
List中存在两种删除:
根据对象内容、根据对象编号
importjava.util.ArrayList;
importjava.util.List;
publicclassArrayListDemo02{
publicstaticvoidmain(Stringargs[]){
ListallList=null;
allList=newArrayList();//指定操作的泛型为String
allList.add("Hello");//此方法由Collection接口而来
allList.add(0,"World");//在第一个位置上添加新的内容
allList.add("MLDN");//向Collection中加入内容
allList.add("");
allList.remove(0);//删除第一个元素,指定删除的位置
allList.remove("Hello");//此方法由Collection接口继承而来
System.out.println(allList);//输出的是集合
}
};
集合中的内容可以添加,可以删除,那么实际上最重要的就是输出(输出的是元素)。
⏹在List接口中提供了get()方法,利用此方法就可以完成输出。
⏹通过循环完成输出,循环的次数由size()方法取得。
importjava.util.ArrayList;
importjava.util.List;
publicclassArrayListDemo03{
publicstaticvoidmain(Stringargs[]){
ListallList=null;
allList=newArrayList();//指定操作的泛型为String
allList.add("Hello");//此方法由Collection接口而来
allList.add("Hello");//此方法由Collection接口而来
allList.add(0,"World");//在第一个位置上添加新的内容
allList.add("MLDN");//向Collection中加入内容
allList.add("");
System.out.print("由前向后输出:
");
for(inti=0;iSystem.out.print(allList.get(i)+"、");
}
System.out.print("\n由后向前输出:
");
for(inti=allList.size()-1;i>=0;i--){
System.out.print(allList.get(i)+"、");
}
}
};
结果:
由前向后输出:
World、Hello、Hello、MLDN、、
由后向前输出:
、MLDN、Hello、Hello、World、
此输出方式是List接口所独有的,而其他接口是没有的,尤其是Collection中是没有根据索引取出内容的操作。
importjava.util.ArrayList;
importjava.util.List;
publicclassArrayListDemo04{
publicstaticvoidmain(Stringargs[]){
ListallList=null;
allList=newArrayList();//指定操作的泛型为String
allList.add("Hello");//此方法由Collection接口而来
allList.add(0,"World");//在第一个位置上添加新的内容
allList.add("MLDN");//向Collection中加入内容
allList.add("");
Stringstr[]=allList.toArray(newString[]{});//指定好类型
System.out.print("指定数组类型:
");
for(inti=0;iSystem.out.print(str[i]+"、");
}
System.out.print("\n返回对象数组:
");
Objectobj[]=allList.toArray();//返回Object类型
for(inti=0;iStringtemp=(String)obj[i];//进行向下转型
System.out.print(temp+"、");
}结果:
指定数组类型:
World、Hello、MLDN、、
}返回对象数组:
World、Hello、MLDN、、
};
既然已经完成基本的输出功能,集合中还有以下的几个操作:
判断集合是否为空:
booleanisEmpty()
截取部分集合:
ListsubList(intfromIndex,inttoIndex),List接口扩充
查找指定的对象是否存在:
intindexOf(Objecto),如果查找到则返回位置,否则返回-1
查找是否存在:
booleancontains(Objecto)
importjava.util.ArrayList;
importjava.util.List;
publicclassArrayListDemo05{
publicstaticvoidmain(Stringargs[]){
ListallList=null;
allList=newArrayList();//指定操作的泛型为String
System.out.println("集合操作前是否为空?
"+allList.isEmpty());
allList.add("Hello");//此方法由Collection接口而来
allList.add(0,"World");//在第一个位置上添加新的内容
allList.add("MLDN");//向Collection中加入内容
allList.add("");
System.out.println(allList.contains("Hello")?
"\"Hello\"字符串存在!
":
"\"Hello\"字符串不存在!
");
ListallSub=allList.subList(2,3);//字符串截取
System.out.println("集合截取:
");
for(inti=0;iSystem.out.print(allSub.get(i)+"、");
}
System.out.println("MLDN字符串的位置:
"+allList.indexOf("MLDN"));
System.out.println("集合操作后是否为空?
"+allList.isEmpty());
}
};
以上的操作都是使用ArrayList子类完成的。
挽救的子类:
Vector
在List接口中还有一个子类:
Vector,Vector类属于一个挽救的子类,从整个Java的集合发展历史来看,Vector算是一个元老级的类,在JDK1.0的时候就已经存在此类了。
但是到了Java2(JDK1.2)之后重点强调了集合框架的概念,所以行后定义了很多的新接口(如:
List等),但是考虑到一大部分的人已经习惯了使用Vector类,所以Java的设计者,就是Vector类多实现了一个List接口,这才将其保留下来。
但是因为其是List子类,所以Vector类的使用与之前的并没有太大的区别。
Vector类的定义:
publicclassvectorextendsAbstractListimplementsList,RandomAccess,Cloneable,Serializalbe
虽然Vector类是旧的类,但是因为让其实现了List的接口,所以对程序来讲是一样的。
importjava.util.Vector;
importjava.util.List;
publicclassVectorDemo01{
publicstaticvoidmain(Stringargs[]){
ListallList=null;
allList=newVector();//指定操作的泛型为String
allList.add("Hello");//此方法由Collection接口而来
allList.add("Hello");//此方法由Collection接口而来
allList.add(0,"World");//在第一个位置上添加新的内容
allList.add("MLDN");//向Collection中加入内容
allList.add("");
for(inti=0;iSystem.out.print(allList.get(i)+"、");
}
}
};
因为Vector类本身属于旧的类,所以在类中也提供了很多重复的方法。
增加元素:
publicvoidaddElement(Eobj)—>此方法是最早的增加元素的操作,之后此方法的功能与add()方法是一致的。
importjava.util.Vector;
importjava.util.List;
publicclassVectorDemo02{
publicstaticvoidmain(Stringargs[]){
VectorallList=null;
allList=newVector();//指定操作的泛型为String
allList.addElement("Hello");//此方法由Collection接口而来
allList.addElement("MLDN");//向Collection中加入内容
allList.addElement("");
for(inti=0;iSystem.out.print(allList.get(i)+"、");
}
}
};
子类的差异:
ArrayList与Vector的区别
No.
比较点
ArrayList
Vector
1
推出时间
Jdk1.2之后推出的,属于新的操作类
JDK1.0时推出,属于旧的操作类
2
性能
采用异步处理方式,性能更高
采用同步处理方式,性能较低
3
线程安全
属于非线程安全的操作类
属于线程安全的操作类
4
输出
只能使用Iterator、foreach输出
可以使用Iterator、foreach、Enumeration输出
2.3、总结
1、掌握了以上的操作方法,实际上List接口的作用就明白了,而且之后的全部类集操作中也基本上都是以这些方法为操作的标准,只是各个的特性不一样,例如:
List中允许有重复元素。
2、ArrayList和Vector类的区别
3、LinkedList类
3.1、本章目标
⏹掌握LinkList与List接口的关系
⏹掌握Queue接口的作用
3.2、具体内容
Queue方法摘要
boolean
a