相互分享学习Collection接口遇到问题,直接步入正题。
看一下Test.javacode
public classTest {
public static void main(String[] args) {
Collection<Object>c = newArrayList<Object>();
c.add("Hello");
c.add(new Integer(10));
c.add(new Double(10.1));
c.add(new Name("yang","xiao"));
System.out.println(c.size());//4
System.out.println(c);//c.toString()
c.remove("Hello");
System.out.println("result:"+c.remove(new Name("yang","xiao")));// result :false
System.out.println(c); //c.toString()
}
}
class Name {
private StringfirstName;
private StringlastName;
public String getFirstName() {
returnfirstName;
}
public String getLastName() {
return lastName;
}
public void setFirstName(StringfirstName) {
this.firstName = firstName;
}
public String toString() {
return "fName="+ firstName+ ", lName=" + lastName;
}
public void setLastName(StringlastName) {
this.lastName = lastName;
}
public Name(String firstName,String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
结果:
4
[Hello, 10, 10.1, fName=yang,lName=xiao]
result:false
[10, 10.1, fName=yang, lName=xiao]
为什么c.remove(newName("yang","xiao")) Name移除false呢?继续往下面看。
接下来修改一下Test.java (添加两个方法 equals()和hashCode()方法)
public classCopyOfTest {
public static void main(String[] args){
Collection<Object>c = newArrayList<Object>();
c.add("Hello");
c.add(new Integer(10));
c.add(new Double(10.1));
c.add(new Name("yang","xiao"));
System.out.println(c.size());//4
System.out.println(c);//c.toString()
c.remove("Hello");
System.out.println("result:"+c.remove(new Name("yang","xiao")));// result :true
System.out.println(c);
}
}
class Name {
private StringfirstName;
private StringlastName;
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public void setFirstName(StringfirstName) {
this.firstName = firstName;
}
public String toString() {
return "fName="+ firstName+ ", lName=" + lastName;
}
public void setLastName(StringlastName) {
this.lastName = lastName;
}
public Name(String firstName,String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public boolean equals(Object obj) {
if (objinstanceof Name) {
Namename = (Name) obj;
return (firstName.equals(name.firstName) &&lastName
.equals(name.lastName));
}
returnsuper.equals(obj);
}
public int hashCode() {
return lastName.hashCode();
}
}
结果:
4
[Hello, 10, 10.1, fName=yang,lName=xiao]
result:true
[10, 10.1]
当我们添加了equals()和hashCode()
c.remove(new Name("yang","xiao")) 现在Name移除true
两者的差别就在于有没有equals()和hashCode();
分析:
第一个Test.java
没有equals() 和hashCode()
c.add(new Name("yang","xiao"))、c.remove(newName("yang","xiao")
两个Name("yang","xiao")不是同一个对象,因为Name类继承Object类且调用的是Object里面的equals()和hashCode(),
Object判断两个对象相等
例如:只有两个对象的引用一样才返回真
String x=”1”;
String y=”1”
x==y 返回true。
很显然每次new一个Name对象他们的引用值是不同的。
第二个Test.java
重写了Object类的equals()和hashCode()。
c.add(new Name("yang","xiao"))、c.remove(newName("yang","xiao")
两个Name("yang","xiao")是同一对象,因为我们重写了equals()和hashCode()。判断一个对象是否相等是根据我们自己定义的equals()和hashCode()方法。两个对象内容相等我们就认为他们是同一个对象。
关键:重写equals()和hashCode()。
到这里我想大家应该明白了吧。
看一下Test.javacode
public classTest {
public static void main(String[] args) {
Collection<Object>c = newArrayList<Object>();
c.add("Hello");
c.add(new Integer(10));
c.add(new Double(10.1));
c.add(new Name("yang","xiao"));
System.out.println(c.size());//4
System.out.println(c);//c.toString()
c.remove("Hello");
System.out.println("result:"+c.remove(new Name("yang","xiao")));// result :false
System.out.println(c); //c.toString()
}
}
class Name {
private StringfirstName;
private StringlastName;
public String getFirstName() {
returnfirstName;
}
public String getLastName() {
return lastName;
}
public void setFirstName(StringfirstName) {
this.firstName = firstName;
}
public String toString() {
return "fName="+ firstName+ ", lName=" + lastName;
}
public void setLastName(StringlastName) {
this.lastName = lastName;
}
public Name(String firstName,String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
结果:
4
[Hello, 10, 10.1, fName=yang,lName=xiao]
result:false
[10, 10.1, fName=yang, lName=xiao]
为什么c.remove(newName("yang","xiao")) Name移除false呢?继续往下面看。
接下来修改一下Test.java (添加两个方法 equals()和hashCode()方法)
public classCopyOfTest {
public static void main(String[] args){
Collection<Object>c = newArrayList<Object>();
c.add("Hello");
c.add(new Integer(10));
c.add(new Double(10.1));
c.add(new Name("yang","xiao"));
System.out.println(c.size());//4
System.out.println(c);//c.toString()
c.remove("Hello");
System.out.println("result:"+c.remove(new Name("yang","xiao")));// result :true
System.out.println(c);
}
}
class Name {
private StringfirstName;
private StringlastName;
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public void setFirstName(StringfirstName) {
this.firstName = firstName;
}
public String toString() {
return "fName="+ firstName+ ", lName=" + lastName;
}
public void setLastName(StringlastName) {
this.lastName = lastName;
}
public Name(String firstName,String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public boolean equals(Object obj) {
if (objinstanceof Name) {
Namename = (Name) obj;
return (firstName.equals(name.firstName) &&lastName
.equals(name.lastName));
}
returnsuper.equals(obj);
}
public int hashCode() {
return lastName.hashCode();
}
}
结果:
4
[Hello, 10, 10.1, fName=yang,lName=xiao]
result:true
[10, 10.1]
当我们添加了equals()和hashCode()
c.remove(new Name("yang","xiao")) 现在Name移除true
两者的差别就在于有没有equals()和hashCode();
分析:
第一个Test.java
没有equals() 和hashCode()
c.add(new Name("yang","xiao"))、c.remove(newName("yang","xiao")
两个Name("yang","xiao")不是同一个对象,因为Name类继承Object类且调用的是Object里面的equals()和hashCode(),
Object判断两个对象相等
例如:只有两个对象的引用一样才返回真
String x=”1”;
String y=”1”
x==y 返回true。
很显然每次new一个Name对象他们的引用值是不同的。
第二个Test.java
重写了Object类的equals()和hashCode()。
c.add(new Name("yang","xiao"))、c.remove(newName("yang","xiao")
两个Name("yang","xiao")是同一对象,因为我们重写了equals()和hashCode()。判断一个对象是否相等是根据我们自己定义的equals()和hashCode()方法。两个对象内容相等我们就认为他们是同一个对象。
关键:重写equals()和hashCode()。
到这里我想大家应该明白了吧。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货