Java中的容器(一)很重要的基础,很重要的思想
容器 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:当这个类的某个对象被当作键值来使用的时候。比如说:一个人事管理系统,人比较多,人的相关资料也特别多,如果把所有的东西都放到内存里,会很难弄,,这样可以把名字作为索引放在索引里,找相关信息的时候,先找到他的名字,再找相关信
补充:软件开发 , Java ,