1、老师说删掉集合类中的元素用迭代器的remove方法安全,并用下面的程序给我们 做了演示 ,用集合类的remove方法确实删不掉kk.si这个元素,不过老师 也说不出 原理来,我想请问一下为什么会这样,而且换不同的Collection子类问题也不同,有的甚至运行时异常,这是为什么呢?
2、老师说要使c.remove(new Name("zhang", "san"));删掉zhang.san,必须在name类里重写equals方法和hashcode方法,重写 equals方法我明白是为了把比较引用改成比较内容,但重写的 hashcode的这个方法我还是不太明白!
import java.util.*;public class TestCollection { public static void main(String[] args) {
Collection c = new LinkedList(); c.add("123");
c.add(new Name("zhang", "san"));
c.add(new Name("ll", "si"));
c.add(new Name("kk", "si")); Iterator i = c.iterator();//迭代器
while (i.hasNext()) {
Object o =i.next();
if (o instanceof Name) {
Name n = (Name) o;//对象造型
if (n.getFirstName().length() < 3) {
System.out.println(n.getFirstName());
//i.remove();//Iterator对象的remove方法是在迭代过程中删除元素的唯一的安全方法
c.remove(n);//不安全 }
}
}
System.out.println(c.size());
System.out.println(c);
}
}class Name {
private String firstName;
private String lastName; public String getFirstName() {
return firstName;
} public String getLastName() {
return lastName;
} public Name(String f, String l) {
this.firstName = f;
this.lastName = l; } public String toString() {
return this.firstName + "." + this.lastName;
} public boolean equals(Object obj) {
if (obj instanceof Name) {
Name n = (Name) obj;
return this.firstName.equals(n.firstName)
&& this.lastName.equals(n.lastName);
}
return super.equals(obj); } public int hashCode() {
return this.firstName.hashCode()+this.lastName.hashCode();
}}
2、老师说要使c.remove(new Name("zhang", "san"));删掉zhang.san,必须在name类里重写equals方法和hashcode方法,重写 equals方法我明白是为了把比较引用改成比较内容,但重写的 hashcode的这个方法我还是不太明白!
import java.util.*;public class TestCollection { public static void main(String[] args) {
Collection c = new LinkedList(); c.add("123");
c.add(new Name("zhang", "san"));
c.add(new Name("ll", "si"));
c.add(new Name("kk", "si")); Iterator i = c.iterator();//迭代器
while (i.hasNext()) {
Object o =i.next();
if (o instanceof Name) {
Name n = (Name) o;//对象造型
if (n.getFirstName().length() < 3) {
System.out.println(n.getFirstName());
//i.remove();//Iterator对象的remove方法是在迭代过程中删除元素的唯一的安全方法
c.remove(n);//不安全 }
}
}
System.out.println(c.size());
System.out.println(c);
}
}class Name {
private String firstName;
private String lastName; public String getFirstName() {
return firstName;
} public String getLastName() {
return lastName;
} public Name(String f, String l) {
this.firstName = f;
this.lastName = l; } public String toString() {
return this.firstName + "." + this.lastName;
} public boolean equals(Object obj) {
if (obj instanceof Name) {
Name n = (Name) obj;
return this.firstName.equals(n.firstName)
&& this.lastName.equals(n.lastName);
}
return super.equals(obj); } public int hashCode() {
return this.firstName.hashCode()+this.lastName.hashCode();
}}
解决方案 »
- JFrame图标化后在任务栏中闪烁
- 遇到的AWT的小问题,大家帮忙解决下
- java中socketServer.accept后,执行接下来代码后怎么返回到原来的侦听状态
- 一点小问题,,100分
- 如何屏蔽JTextField对backspace键的反应
- Applet连接M$-ACCESS是否需要特殊设置?
- 一个简单的问题!请帮忙
- applet如何打开新的网页,如何和所在网页通讯
- Nokia MobileSet中如何让手机识别中文?
- 小弟遇到一件怪事,特向各位大侠请教:我写了一个applet访问数据库的小程序,连接成功,但没有一行数据返回。我用application访问,就返回了表中数据。盼望大家指点!
- 用正则怎么表示这个字串<meta http-equiv="content-type" content="text/html; charset=utf-8">
- 一个处理字符串的小问题
必须在name类里重写equals方法和hashcode方法,重写 equals方法我明白是为了把比较引用改成比较内容,但重写的 hashcode的这个方法我还是不太明白! 这个跟删除没关系。我以前看到过这样的技术文章。但现在忘记了,我去查阅一下资料。再告诉你答案!
1、目前我还不敢看jdk源码,呵呵 !因为基础知识还没学完呢,您看我目前记住这句话是不是对的------因为Collection具体子类的实现不同,所以使用迭代器的remove方法才能保证正确的结果。
2、如果用c.remove(new Name("zhang", "san"));删除,是不是又在集合器外部新new了一个张三,jdk调用自定义name类的equals方法和hashcode方法,如果不重写,因为objiect的方法比较的是引用,引用不同,集合器判断不含此元素,所以删不掉,如果name类重写这2个方法,变成比较内容,集合器就会找到自己里面含有并删除,而集合器外面那个由垃圾回收机制处理,如果是这样的话,这个hashcode方法让我混乱,它返回的是集合器里面张三的hashcode还是集合器外面的那个张三的hashcode,什么是hashcode?我的理解是标识身份的一个int值,不过这个hashcode有什么用?好像只重写equals就行了吧?混乱中......
Iterator i = c.iterator();//迭代器
while (i.hasNext()) {
Object o = i.next();
if (o instanceof Name) {
Name n = (Name) o;//对象造型
if (n.getFirstName().length() < 3) {
System.out.println("n.getFirstName()"+n.getFirstName());
//i.remove();//Iterator对象的remove方法是在迭代过程中删除元素的唯一的安全方法
//c.remove(n);//不安全
i.remove(); //改成用i.remove()方法删除
}
}
}
迭代器也能正确的找到真正的那个next?
我也不知道分析的对不对,这当中我也有很多模糊的地方,看来要看看书啦。
import java.util.*;public class TestCollection { public static void main(String[] args) {
Collection c = new LinkedList(); c.add("123");
c.add(new Name("zhang", "san"));
System.out.println(c); c.remove(new Name("zhang", "san"));
System.out.println(c);
}
}class Name {
private String firstName;
private String lastName; public Name(String f, String l) {
this.firstName = f;
this.lastName = l; } public String toString() {
return this.firstName + "." + this.lastName;
} public boolean equals(Object obj) {
if (obj instanceof Name) {
Name n = (Name) obj;
return this.firstName.equals(n.firstName)
&& this.lastName.equals(n.lastName);
}
return super.equals(obj); } //public int hashCode() {
//return this.firstName.hashCode()+this.lastName.hashCode();
//}}