J2SDK所提供的容器API位于java.util包内,容器API的类图结构如下:
左边是一个一个装,右边是一对一对来装Set的数据对象没有顺序并且不可以重复,List有顺序可以重复(互相的equals)Map接口定义了存储“键(key)—值(value)映射对”的方法2.Collection接口Collection接口中所定义的方法:int size();
boolean isEmpty();void clear();
boolean contains(Object element); 是不是包含某个对象boolean add(Object element);boolean remove(Object element); 去除Iterator iterator();boolean containsALL(Collection c); 是不是包含另一个集合中的所有元素boolean addALL(Collection c);boolean removeALL(Collection c);boolean retainALL(Collection c); 求交集Object[] toArray();例如:import java.util.*;
public class Name { PRivate String s; private String c; public Name(String s, String c) { this.s = s; this.c = c; } public String toString() { return s + " " + c; }}public class Cllection { public static void main(String agrs[]) { Collection c = new ArrayList(); //使用父类引用指向子类对象,可以放入不同类型的对象 c.add("hello"); c.add(new Integer(100)); //只能添加对象,不能添加基础的数据类型 c.add(new Name("f1", "l1")); System.out.println(c.size()); System.out.println(c); }}结果是:3 [hello, 100, f1 l1]3.Collection方法举例容器类对象在调用remov、contains等方法时需要比较对象是否相等,这回涉及到对象类型的equals方法和hashCode方法;对于自定义的类型,需要重写equals方法以实现自定义的对象相等规则。注意:相等的对象应该具有相等的hash Codes。重写equals方法时同时也要重写hashCode。增加Name类的equals和hashCode方法如下:public class Name { private String s; private String c; public Name(String s, String c) { this.s = s; this.c = c; } public String getS() { return s; } public String getC() { return c; } public String toString() { return s + " " + c; } public boolean equals(Object obj) { if (obj instanceof Name) { Name name = (Name) obj; return (s.equals(name.s)) && (s.equals(name.s)); } return super.equals(obj); } public int hashCode() { //地址,索引 return s.hashCode(); }}public class Cllection { public static void main(String agrs[]) { Collection c = new HashSet(); //使用父类引用指向子类对象,可以放入不同类型的对象 c.add("hello"); c.add(new Integer(100)); //只能添加对象,不能添加基础的数据类型 c.add(new Name("f1", "l1")); c.remove("hello"); c.remove(new Integer(100)); System.out.println(c.remove(new Name("f1", "l1"))); //equals时才去除,返回true,这两个不是同一个对象 System.out.println(c); }}结果是:true []如果没有重写equals方法时,结果是:false [f1 l1]4.Iterator接口所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。Iterator是统一的来遍历Collection里所有元素的方法Iterator对象称作迭代(重复反馈过程的活动)器,用以方便的实现对容器内元素的遍历操作。Iterator接口定义了如下方法:boolean hasNext(); //判断游标右边是否有元素Object next(); //返回游标右边的元素并将游标移动到下一个位置void remove(); //删除游标左边的元素,在执行完next之后该操作只能执行一次public class TestIterator { public static void main(String agrs[]) { Collection c = new HashSet(); c.add(new Name("f1", "l1")); c.add(new Name("f2", "l2")); c.add(new Name("f3", "l3")); Iterator i = c.iterator(); while (i.hasNext()) { Name n = (Name) i.next(); System.out.println(n.getS() + " "); } }}结果是:f1 f2 f3Iterator对象的remove方法是在迭代过程中删除元素的唯一的安全方法。例:public class TestIterator { public static void main(String agrs[]) { Collection c = new HashSet(); c.add(new Name("f1", "1111")); c.add(new Name("f2", "l2")); c.add(new Name("f3", "1113")); for (Iterator i = c.iterator(); i.hasNext(); ) { Name n = (Name) i.next(); if (n.getC().length() < 3) { i.remove(); } } System.out.println(c); }}结果是:[f1 1111, f3 1113]5.JDK1.5增强的for循环增强的for循环对于遍历array或collection的时候相当简便缺陷:数组:不能方便的访问下标值集合:与使用Iterator相比,不能方便的删除集合中的内容,在内部也是调用Iterator出了简单遍历并读出其中的内容外,不建议使用增强for例:public class TestEnhanceFor { public static void main(String agrs[]) { Collection c = new HashSet(); c.add(new Name("a", "aa")); c.add(new Name("b", "bb")); c.add(new Name("c", "cc")); for (Object o : c) { System.out.println(o); } }}结果:a aab bb
c cc6.Set接口Set接口是Collection的子接口,Set接口没有提供额外的方法,但实现Set接口的容器类中的元素是没有顺序的,而且不可以重复。Set容器可以与数学中“集合”的概念相对应,有HashSet,TreeSet等
public class TestSet { public static void main(String ages[]) { Set s = new HashSet(); s.add("hello"); s.add("world"); s.add(new Name("f1", "l1")); s.add(new Integer(100)); s.add(new Name("f1", "l1"));//如果Name中没有重写equals方法,该项就会被添加,如果重写了,就不会添加 s.add("hello"); //相同元素不会被加入 System.out.println(s); }}结果是:[world, 100, hello, f1 l1]
public class TestSet { public static void main(String ages[]) { Set s1 = new HashSet(); Set s2 = new HashSet(); s1.add("a"); s1.add("b"); s1.add("c"); s2.add("a"); s2.add("d"); s2.add("b");//Set和List容器类都具有 //Collection(Collection c)构造方法用于初始化容器类 Set sn = new HashSet(s1); sn.retainAll(s2); //交集 Set su = new HashSet(s1); su.addAll(s2); System.out.println(sn); System.out.println(su); }}结果是:[a, b]
[a, b, c, d]
新闻热点
疑难解答