集合
Java 2中最主要的特性之一是对集合的支持,提供了对各种数据结构的封装实现,极大方便了编程,使Java成为更加成熟的编程的平台。
一个集合是代表一组对象的一个对象,集合中的这一组对象的每一个称为它的元素。集合主要用来处理各种类型的对象的聚集,每一个对象都具有一定的数据类型。集合保留了对Object的引用,因此任何数据类型的对象都可以存放在集合中。
Java2数据结构主要提供了4种接口:Collection,List,Set和Map接口,用于描述不同类型的数据结构类型。
Collection中的对象的存放没有一定的顺序,并且允许重复,可以存在几个相同的对象。
List是个有序的对象聚集,对象存放按照一定的顺序存放,同时允许重复。
Set也是对象的无序聚集,但是不允许重复,即相同的对象只能在集合中出现一次。
Map是一种“键/值”对的集合,每个键(key)都映射到一个值(value)。
对于每种接口,根据存放的数据结构有不同具体的版本,如图所示是Java2提供的对数据结构的支持的集合关系图(其中用虚线框代表接口,实线框代表类)。
Java2提供的对数据结构的支持的集合关系图
图中的Utilitys是指这两个类包含着操作集合的许多工具。
接口Comparator是用于比较方法的集合,多用于工具类中。
1.Collection接口
Conection接口是任何对象组的集合,其中对象存放没有一定的顺序,并且允许重复,可以存在几个相同的对象。Colletion接口的定义如下:
public interface Collection
{
public int size();
public boolean isEmpty();
public boolean contains(Object o); //判断集合是否包含对象o
public Interator iterator();
//产生一个循环反复器,其中包含了该collection对象中所有的元素。
public Obj ect[] toArray(); //返回一个包含所有元素的对象数组
public Object[] toArray(Object a[]) //把所有的元素放入a[]数组中
public boolean add(Object o);//向集合加入对象,成功时返回true
public boolean containsAll(Cellection o); //判断o是否为子集
public boolean remove(Object o) ; //从集合加中删除对象o,成功时返回true
public boolean addAll(Collection o) ; //向集合加入集合o
public boolean retainAll(Collection o); //从集合加中保留子集合o
public boolean removeAll(Collection o); //清空指定集合o
public void clear(); //清空当前集合
public boolean equals(Object o) ; //比较两个对象是否相同
public int hashCode(); //获取集合的hashcode
Collection操作包括:增加元素,删除元素,检查内容和使用元素。
[例1]Collection接口的使用:
package com;
import java.util.*;
public class CollectionDemo
{
public static void main(String[] args)
{
Collection Months; //声明Months是无序,可重复的集合
String strMonths[]={"一月","四月","五月","六月","二月","三月","三月","七月","八月","九月","十月","十二月","十一月"}; //赋初值,2个"三月"
int n;
n=strMonths.length; //获得月份的数,既数组长度
Months=new ArrayList(); //创建ArrayList集合对象Months,Collection是接口,只能用它的某实现类创建对象,Collection是无序的
for(int i=0;i<n;i++)
Months.add(strMonths[i]); //将数组元素逐个加入集合中
// Months是无序的,不能按序一一输出
Object s[]=Months.toArray(); //为了输出集合中的内容,将集合导入数组s中
for(int i=0;i<s.length;i++) //输出s
System.out.println(s[i].toString());
}
}
输出结果如下:
一月
四月
五月
六月
二月
三月
三月
七月
八月
九月
十月
十二月
十一月
2.List接口
List接口是从Collection接口中派生出来的,List是个有序的对象聚集,对象按照一定的顺序存放,同时允许重复。List接口的定义如下:
public interface List extends Collection
{
int size();
boolean isEmpty();
boolean contains(Object o);
Object[] toArray();
Object[] toArray()(Object a[]);
boolean add(0bject o);
boolean remove(Object o);
boolean containsAll(Collection c);
boolean addAll(Collection c);
boolean addAll(int index,Collection c);
boolean removeAll(Collection c);
boolean retainAll(Collection c);
void clear();
boolean equals(0bject o);
int hashCode();
0bject get(int index); //因为是有序的,可以访问它的第i个元素
0bject set(int index,0bject element);
void add(int index,0bj ect element);
0bject remove(int index);
int indexof(0bject o);
int lastIndexof(0bj ect o);
ListIterator listIterator();
ListIterator listIterator(int index);
List subList(int fromIndex,int toIndex);
}
List接口有两个实现集合类: ArrayList和LinkedList类。
ArryList(数组表)的功能类似于Vector(矢量),用于存放数组维护的集合。维护和操作表达式集合时可以使用 ArrayList,但是要经常在表中间进行插入或者删除操作时,ArrayList就不如LinkedList方便了。
LinkedList(链表)是双向链表,每个节点引用上一个节点和下一个节点。
[例2]使用 List接口,对月份进行了逆序输出:
package com;
import java.util.*;
public class ListDemo
{
public static void main(String[] args)
{
List months;
String strMonths[]={"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
int n;
n=strMonths.length; //获得月份的数,既数组长度
months=new ArrayList(); //创建ArrayList集合对象,集合是List型的
for(int i=0;i<n;i++)
months.add(strMonths[i]); //将数组元素逐个加入集合months中
for(int i=months.size()-1;i>=0;i--) //集合是有序的,可以直接利用它的有序的下标(索引)输出集合的元素
System.out.println(months.get(i)); // 通过get(i)访问到了第i个元素
}
}
运行结果如下:
十二月
十一月
十月
九月
八月
七月
六月
五月
四月
三月
二月
一月
3.Set接口
Set接口是从Collection接口中派生出来的,是没有重复元素的集合,其接口并没有加入新的功能,只是限制不能有重复的元素存在。
Set接口有两个实现类:HashSet和TreeSet类。推荐使用HashSet类,因为它是基于散列表的集合;TreeSet是基于平衡树数据结构的,如果顺序很重要的话,则可以选择TreeSet。
4.Map接口
Map接口用于保存关键字(Key)和数值(Value)的集合,不允许重复,集合中的每个元素加入时都必须提供(键,值)对。
Map接口的定义如下:
public interface Map
{
int size(); //求Map集合的大小,返回元素个数
boolean isEmpty(); //判断集合是否为空,为空返回true
boolean containsKey(Object key); //判断集合中有这个key吗?有则返回true
boolean containsValue(Object value); //判断集合中有这个value吗?有则返回true
Object get(Object key); //返回这个key所对应的value
Object put(Object key, Object value); //向集合中加入“键----值”对元素
Object remove(Object key); //从集合中删除这个key的键值对
Object removeAll(Set keySet); //从集合中删除所有的键子集,效果为删除所有的“键--值”对
void putAll(Map t); //将Map集合t并入当前集合
void clear(); //清空集合
public Set keySet(); //返回集合中所有的key
public Collection values(); //返回集合中所有的value
public Set entrySet();
boolean equals(Object o);
int hashCode();
public interface Entry
{
Object getKey();
Object getValue();
Object setValue(Object value);
boolean equals(Object o);
inthashCode();
}
}
Map接口有三个实现集合类:HashMap,WeakHashMap和TreeMap类。
HashMap是基于Hash表的映射;WeakHash是基于弱引用Hash表的映射;TreeMap是基于平衡树的映射。
[例3]使用 Map接口:
package com;
import java.util.*;
public class MapDemo
{
public static void main(String[] args)
{
Map Months;
int n;
Months=new HashMap(); //用Map的一个实现类HashMap创建对象Months
Months.put(1, "一月");
Months.put(3, "三月");
Months.put(2, "二月");
Months.put(2, "二月"); //重复加入的元素被忽略
n=Months.size();
System.out.println(n);
System.out.println(Months.keySet()); //输出Months中所有的key
System.out.println(Months.values()); //输出Months中所有的value
System.out.println(Months.containsKey(2)); //Months中含有key值为2吗?
System.out.println(Months.containsValue("一月")); //含有value值为"一月"吗?
System.out.println(Months.containsValue("五月")); //含有value值为"五月"吗?
System.out.println(Months.get(3)); //输出键值3对应的value值
System.out.println(Months.get(4)); //输出键值4对应的value值
}
}
运行结果:
3
[1, 2, 3]
[一月, 二月, 三月]
true
true
false
三月
null