Collection Framework
Java 集合框架
LiFan(李凡)
Chengdu University of Information Technology
The Department Of Computer Science
2005
Collections Overview
? 集合 (Collection)是一个对象的容器,可以存
放对象,便于组织和管理对象
? java.util包 中定义了各种用于集合操作的类
和接口,这些类和接口构成了 Java语言的 集
合框架 (Collection Framework)
? 集合框架中定义了接口对常用的集合类型进
行抽象,还提供了一些优化的对接口的实现
类,简化程序设计
Collection Framework
? 根据不同类型的集合的特点和用途,集合框
架在设计的时候将集合分为以下三种类型,
(1) 数学概念中的集合 (Set) — 以无序的方式
容纳对象,并且任意两个对象均不相同
(2) 列表 (List) — 以一定的顺序容纳对象,能
够对容纳的对象进行随机存取
(3) 映射 (Map) — 将对象以一个键 (Key)值存
放,根据键值可以访问对应的对象
Collection Interfaces
? 集合框架中将不同类型的集合和集合相关的
操作抽象为高层的接口,并构成层次结构
? java.util包中定义如下高层集合接口,
Collection — 除映射类型外所有集合类型的超类
型,声明了针对集合的通用方法
Set — 用于表示数学概念中的集合
List — 用于表示列表类型集合
Map — 用于表示映射类型的集合
Collection
Set List
Map
Sorted Collections
? 有序集合 指集合中容纳的对象按照一定的规
则进行排序
? 集合框架中提供了 Set,List和 Map的有序类
型,
SortedSet — Set接口的子接口
SortedMap — Map接口的子接口
Collection
Set List
Map
SortedSet
SortedMap
Iterator Interface
? 如何以一种通用的方式遍历访问集合框架中
定义的所有类型的集合?
? java.util包中定义了 接口 Iterator,声明了用
于遍历任何类型的集合中的对象的方法,是
对设计模式中的迭代器模式的应用
? 接口 ListIterator扩展了接口 Iterator的,增加
了针对 List类型的集合的遍历操作
Collection
Set List
Map
SortedSet
SortedMap
Iterator
ListIterator
Default Implementation
? 集合框架中提供了一些常用的集合接口的实
现类,
HashSet — 使用散列表算法实现 Set接口
TreeSet — 使用平衡二叉树算法实现 SortedSet接口
ArrayList — 使用数组存放对象来实现 List接口
LinkedList — 使用双向链表来实现 List接口
HashMap — 使用散列表算法实现 Map接口
TreeMap — 使用平衡二叉树算法实现 Map接口
Collection
Set
List
Map
SortedSet
SortedMap
ArrayList
LinkedList
TreeSet
HashSet
TreeMap
HashMap
java.util.Collection Interface
? 除映射类型的集合外,接口 java.util.Collection是
所有集合类型的超类型,声明了与集合操作相关
的通用方法
public int size()
public boolean isEmpty()
public boolean contains(Object elem)
public Object[] toArray()
public Object[] toArray(Object[] dest)
java.util.Collection Interface
public add(Object elem)
public remove(Object elem)
public boolean containsAll(Collection coll)
public boolean addAll(Collection coll)
public boolean removeAll(Collection coll)
public boolean retainAll(Collection coll)
public void clear()
public Iterator iterator()
java.util.Iterator Interface
? 该接口声明了用于遍历集合的方法,
public boolean hasNext()
public Object next()
public void remove()
? 通过调用 Collection接口及其子接口的实现类的对
象的 iterator()方法可以返回一个该接口的实现类的
对象,使用该对象来遍历访问集合中每个对象
? 在使用 Iterator对象遍历集合时,如果要删除集合
中的某个对象,必须使用该接口中 remove()方法!
public void removeLongStrings(Collection coll,int maxLen){
Iterator it=coll.iterator();
while(it.hasNext()){
String str=(String)it.next();
if(str.length()>maxLen)
coll.remove(str);
}
}
错误的删除操作!
public void removeLongStrings(Collection coll,int maxLen){
Iterator it=coll.iterator();
while(it.hasNext()){
String str=(String)it.next();
if(str.length()>maxLen)
it.remove();
}
}
正确的删除操作!
java.util.Set Interface
? 该接口并没有声明新的方法,但要求实现类
所表示的集合中不能容纳两个相同的对象
? 判定两个对象是否相同是一般是通过调用对
象的 equals(Object other)方法来实现的
java.util.SortedSet Interface
? 该接口扩展了接口 Set,新增了与有序集合
相关的操作,
public Object first()
public Object last()
public SortedSet subSet(Object min,Object max)
public SortedSet headSet(Object max)
public SortedSet tailSet(Object min)
public Comparator comparator()
SortedSet intSet=new TreeSet();
intSet.add(new Integer(50));
intSet.add(new Integer(25));
intSet.add(new Integer(100));
intSet.add(new Integer(-15));
System.out.println(intSet.first());
System.out.println(intSet.last());
SortedSet subSet=intSet.tailSet(new Integer(25));
Iterator it=subSet.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
-15
100
25
50
100
How to order objects?
? 接口 SortedSet的实现类使用不同的算法将放
入的对象与集合中的其它对象进行比较,根
据比较的结果确定对象的位置,可分为两种
情况,
(1) 如果对象所属的类实现了 java.lang.Comparable
接口,则调用对象的 compareTo(Object other)比
较不同的对象,否则按 (2)
(2) 使用集合对象中的 Comparator接口的实现类对
象的 compare(Object obj1,Object obj2)比较不同
的对象
java.lang.Comparable Interface
? 该接口只声明了唯一的方法,
public int compareTo(Object other)
? 除 Boolean类外,所有基本数据类型的 Wrapper
类都实现了该接口
? String类,java.io.File类,java.util.Date类等都
实现了该接口
? 实现 Comparable接口在设计目的上是指定类的
对象的自然顺序,但是 不同类的对象不能使用
该接口比较!
java.util.Comparator Interface
? 但对象不能实现 Comparable接口时可以使用
该接口为有序集合指定对象的比较规则
? 该接口中声明了用于比较对象的方法,
public int compare(Object obj1,Object obj2)
? 该接口的实现类称为,比较器,,可作为有
序集合类的构造函数的参数
public TreeSet(Comparator c)
public TreeMap(Comparator c)
SortedSet intSet=new TreeSet(new Comparator(){
public int compare(Object obj1,Object obj2){
return – obj1.compareTo(obj2);
}
});
intSet.add(new Integer(50));
intSet.add(new Integer(25));
intSet.add(new Integer(100));
intSet.add(new Integer(-15));
Iterator it=intSet.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
100
50
25
-15
java.util.List Interface
? 由于列表集合中存放的是对象的有序序列,因此
该接口新增了与有序性相关的方法,
public Object get(int index)
public Object set(int index,Object elem)
public void add(int index,Object elem)
public Object remove(int index)
public int indexOf(Object elem)
public int lastIndexOf(Object elem)
public List subList(int min,int max)
ListIterator listIterator()
ListIterator listIterator(int index)
java.util.ListIterator Interface
? 该接口扩展了接口 Iterator,新增了用于列表
操作的方法,
public void add(Object elem)
public void set(Object elem)
public boolean hasPrevious()
public Object previous()
public int previousIndex()
public int nextIndex()
List objList=new ArrayList();
objList.add(new Integer(100));
objList.add(new Double(123.5));
objList.add(“Java”);
ListIterator it=objList.listIterator(objList.size());
while(it.hasPrevious()){
Object obj=it.previous();
System.out.println(obj);
}
Java
123.5
100
java.util.Map Interface
? 映射 表示一个 键 /值 (key/value)对,通过,键,
可以快速的找到,值,
? 该接口声明了一下于映射相关的方法,
public int size()
public boolean isEmpty()
public boolean containsKey(Object key)
public boolean containsValue(Object value)
java.util.Map Interface
public Object get(Object key)
public Object put(Object key,Object value)
public Object remove(Object key)
public void putAll(Map otherMap)
public void clear()
public Set keySet()
public Collection values()
Map scoreMap=new HashMap();
scoreMap.put(“200101004”,new Float(85.5));
scoreMap.put(“200101002”,new Float(76));
scoreMap.put(“200101001”,new Float(88));
scoreMap.put(“200101003”,new Float(90));
Float score=(Float)scoreMap.get(“200101001”);
System.out.println(“sno,200101001 score:,+score);
sno,200101001 score,85.5
java.util.SortedMap Interface
? 该接口扩展了 Map接口,它的实现类能对映
射中的 键 (Key)值 进行排序,它新增了与有
序的键值相关的方法,
public Object firstKey()
public Object lastKey()
public SortedMap subMap(Object minKey,Object
maxKey)
public SortedMap headMap(Object maxKey)
public SortedMap tailMap(Object minKey)
Map scoreMap=new TreeMap();
scoreMap.put(“200101004”,new Float(85.5));
scoreMap.put(“200101002”,new Float(76));
scoreMap.put(“200101001”,new Float(88));
scoreMap.put(“200101003”,new Float(90));
Set snoSet=scoreMap.keySet();
Iterator it=snoSet.iterator();
Object sno=null;
while(it.hasNext()){
sno=it.next();
System.out.println(scoreMap.get(sno));
}
88
76
90
85.5
java.util.Collections Class
? 该类定义了用于许多与集合操作相关的静态方法
和常量
static List EMPTY_LIST
static Map EMPTY_MAP
static Set EMPTY_SET
static int binarySearch(List list,Object key)
static void copy(List dest,List src)
static void fill(List list,Object obj)
static void reverse(List list) static void shuffle(List list)
static void sort(List) static void swap(List list,int i,int j)
Synchronizing Collection
? 当集合类对象可能被多个线程访问和修改时,
要使用 Collections类中定义的方法创建集合
对象的 同步对象
static Collection synchronizedCollection(Collection coll)
static List synchronizedList(List list)
static Set synchronizedSet(Set set)
static Map synchronizedMap(Map map)
static SortedSet synchronizedSortedSet(SortedSet set)
static SortedMap synchronizedSortedMap(SortedMap map)
Collection c = Collections.synchronizedCollection(myCollection);
List list = Collections.synchronizedList(new ArrayList());
Map m = Collections.synchronizedMap(new HashMap());
Set s = Collections.synchronizedSet(new Ha hSet());
SortedMap m = Collections.synchronizedSortedMap(new TreeMap());
SortedSet s = Collections.synchronizedSortedSet(new TreeSet());
Synchronizing Collection
? 当使用 Iterator访问被同步的集合时,必须使
用 synchronized语句块并将集合对象作为锁
对象进行同步!
Collection c = Collections.synchronizedCollection(myCollection);
.....,
synchronized(c) {
Iterator i = c.iterator();
while (i.hasNext())
foo(i.next());
}
Unmodifiable Collection
? 如果要禁止对集合的内容进行修改,可以使
用 Collections类中定义的方法创建集合对象
的不可变对象
static Collection unmodifiableCollection(Collection coll)
static List unmodifiableList(List list)
static Set unmodifiableSet(Set set)
static Map unmodifiableMap(Map map)
static SortedSet unmodifiableSortedSet(SortedSet set)
static SortedMap unmodifiableSortedMap(SortedMap map)
Collection c = Collections,unmodifiableCollection(myCollection);
.....,
c.add(obj1); 将抛出 UnsupportedOperationException异常
java.util.Arrays Class
? 该类定义了许多与数组操作相关的静态方法,
static List asList(Object[] a)
static binarySearch(<类型 >[] a,<类型 > key)
static boolean equals (<类型 >[] a,<类型 >[] b)
static void fill (<类型 >[] a,<类型 > val)
static void fill (<类型 >[] a,int from,int to,<类型 > val)
static void sort (<类型 >[] a)
static void sort (<类型 >[] a,int from,int to)
String[] names={“Zhangsan”,“Lisi”,“Wangwu”};
List nameList=Arrays.asList(names);
int index=Arrays.binarySearch(names,“Lisi”);
index=? 1
String[] names2={“Zhangsan”,“Lisi”,“James”};
boolean b=Arrays.equals(names,names2);
b=? false
int[] a=new int[100];
Arrays.fill(a,-1);
Arrays.sort(names);
names=? Lisi Wangwu Zhangsan
The Legacy Collection Types
? 为了保证兼容性,java.util包中还有许多 遗
留的集合类型
java.util.Enumeration
java.util.Vector
java.util.Stack
java.util.Dictionary
java.util.Hashtable
java.util.Properties Class
? 该类也属于映射集合类型,要求键 /值对必须都是
字符串,可以将键 /值对输出到外部文件中,或者
从文件中读入键 /值度,一般可用于管理系统的配
置信息
public String getProperty()
public void setProperty(String key,String value)
public Enumeration propertyNames()
public void store(OutputStream out,String header)
pubilc void load(InputStream in)
Properties config=new Properties();
config.setProperty(“dbname”,“MySQL”);
config.setProperty(“dburl”,“jdbc:mysql://localhost:3306/test”)
config.setProperty(“username”,“root”);
config.setProperty(“password”,“1234”);
FileOutputStream configFile=new FileOutputStream(“db.ini”);
config.store(configFile,“JDBC Connection Config”);