首页 > 学院 > 开发设计 > 正文

Java基础--容器(1)

2019-11-14 10:40:00
字体:
来源:转载
供稿:网友
1.容器​容器:java API所提供的一系列类的实例,用于在程序中存放对象。​

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 aa       

b 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]


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表