频道栏目
首页 > 程序开发 > 软件开发 > Java > 正文
Java中的容器(一)很重要的基础,很重要的思想
2012-09-21 14:59:42      个评论      
收藏   我要投稿

容器 API
               在说容器之前,我想先谈一下数组。数组的特点是:数组一旦确定,就不能再变了。如果我们想改变数组,添加或者删除一个的话,那么我们只能再new一个新数组,然后把之前的copy进来。来个图吧,形象一些:

           于是,我们就希望有一个东西,我们可以让它想增长就增长,想减少就减少。
            接下来,我们来看看容器API:
            1、J2SDK所提供的容器API位于java.util包内。
            2、容器API的类图结构如下:

Collection接口:定义了存取一组对象的方法其子接口Set和List分别定义了存储方式。
                Set中的数据对象没有顺序且不可以重复(就是数学中的数组)。
          List中的数据对象有顺序且可以重复。
    Map接口定义了存储“键(key)-值(value)映射对”的方法。
         举例说明
[java] 
import java.util.*;     //引入包 
 
public class basicContainer 

    public static void main(String[] args) 
    { 
        //父类引用指向子类对象 
        Collection c=new HashSet(); 
        c.add("hellow"); 
        c.add(new Name("f1","l1")); 
        c.add(new Integer(100)); 
        c.remove("hellow");         //remove调用的是对象的equals方法 
        c.remove(new Integer(100)); 
        System.out.println(c.remove(new Name("f1","l1")));  //删除成功返回true否则返回false 
        System.out.println(c);  //将c打印出来 
    } 

 
//定义一个Name类 
class Name 

    private String firstName,lastName; 
    Name(String firstName,String lastName) 
    { 
        this.firstName=firstName; 
        this.lastName=lastName; 
    } 
    public String GetFirstName() 
    {return firstName;} 
    public String GetLastName() 
    {return lastName;} 
    public String toString() 
    {return firstName+" "+lastName;} 

        说明:
        1、当调用remove方法是,是调用的equals方法,如果相等则可以remove
        2、而Name没有重写object的toString()方法,所以删除不成功。
        运行结果:

 
          容器类对象在调用remove、contains方法的时候需要比较对象是否相等,这会涉及到对象类型的equals方法和hashCode方法;对于自定义的类型,需要重写equals和hashCode方法以实现自定义对象相等规则。
        注意:相等对象(equals)应该具有相等的hashCode.
        我们把上面的Name类添加上equals和hashCode方法
[java]
import java.util.*;     //引入包 
 
public class basicContainer 

    public static void main(String[] args) 
    { 
        //父类引用指向子类对象 
        Collection c=new HashSet(); 
        c.add("hellow"); 
        c.add(new Name("f1","l1")); 
        c.add(new Integer(100)); 
        c.remove("hellow");         //remove调用的是对象的equals方法 
        c.remove(new Integer(100)); 
        System.out.println(c.remove(new Name("f1","l1")));  //删除成功返回true否则返回false 
        System.out.println(c);  //将c打印出来 
    } 

 
//定义一个Name类 
class Name 

    private String firstName,lastName; 
    Name(String firstName,String lastName) 
    { 
        this.firstName=firstName; 
        this.lastName=lastName; 
    } 
    public String GetFirstName() 
    {return firstName;} 
    public String GetLastName() 
    {return lastName;} 
    public String toString() 
    {return firstName+" "+lastName;} 
     
    //重写equals方法 最好去复制object的方法声明 
    public boolean equals(Object obj) 
    { 
        if(obj instanceof Name) 
        { 
            Name name=(Name)obj; 
            return (firstName.equals(name.firstName)) &&  
                    (lastName.equals(name.lastName)); 
        } 
        return super.equals(obj); 
    } 
     
    //重写hashCode方法 
    public int hashCode() 
    { 
        return firstName.hashCode(); 
    } 

运行结果:

 
         说明:
         1、重写的hashCode方法:两个对象equals,firstName一定相等,firstName相等,它的hashCode一定相等,因为字符串类已经重写了hashCode方法。
         2、什么时候使用hashCode:当这个类的某个对象被当作键值来使用的时候。比如说:一个人事管理系统,人比较多,人的相关资料也特别多,如果把所有的东西都放到内存里,会很难弄,,这样可以把名字作为索引放在索引里,找相关信息的时候,先找到他的名字,再找相关信息。
         3、两个对象equals,两个对象必须具有相同的hashCode,所以重写equals必须重写hashCode方法。举例说明:我们在查字典的时候,先通过索引查,查到一个条目后,再去找相应的字,在这个意义上讲,索引是一个对象,字是一个值,不能说索引一样,找到的是不同的值,所以说这两个对象要是一样的话,那么hashCode必须一样。
       
 

点击复制链接 与好友分享!回本站首页
相关TAG标签 容器 思想 基础
上一篇:JAVA设计模式——装饰者模式
下一篇:HDU4392 Maximum Number Of Divisors
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站