黑马程序员技术交流社区

标题: 集合中remove()方法疑问? [打印本页]

作者: 陈忠    时间: 2012-4-26 20:26
标题: 集合中remove()方法疑问?
本帖最后由 陈忠 于 2012-4-26 20:57 编辑

import java.util.ArrayList;
import java.util.List;


public class TestCollection {
        public static void main(String[] args){
                 List<Name> list = new ArrayList<Name>();
                 
                 Name name = new Name("aa","nbb");
                 
                 list.add(new Name("zhang","san"));
                 list.add(new Name("li","si"));
                 list.add(new Name("wang","wu"));
                 list.add(name);
                 
                 System.out.println(list.remove(new Name("zhang","san")));//为什么这里输出的是false
                 System.out.println(list.remove(name));//用name的时候就是true
                 System.out.println(list.contains(new Name("wang","wu")));//为什么这里输出的是false
                 System.out.println(list);
        }
}

class Name implements Comparable<Name> {
        private String firstName;
        private String lastName;
        
        public String getFirstName() {
                return firstName;
        }

        public String getLastName() {
                return lastName;
        }

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


        public int compareTo(Name name) {
                int compare = firstName.compareTo(name.firstName);
                return compare!=0?compare:lastName.compareTo(name.lastName);
        }

        public boolean equals(Name name) {
               
                return (firstName.equals(name.firstName))
                                &&(lastName.equals(name.lastName));
        }

        public int hashCode() {
                return firstName.hashCode();
        }
        
        
}
作者: chenwei    时间: 2012-4-26 20:40
remove();的返回值
如果列表包含指定的元素,则返回 true
new Name("zhang","san")))和new Name("zhang","san")))是创建了2个对象 并不相等,所以程序认为没有包含指定的元素返回false
2个name是同一个对象,是相等的,返回true
下面也一样
作者: 陈忠    时间: 2012-4-26 20:52
chenwei 发表于 2012-4-26 20:40
remove();的返回值
如果列表包含指定的元素,则返回 true
new Name("zhang","san")))和new Name("zhang"," ...

接上述问题     当我定义Name name = new Name("aa","bb");
                                Name nameOne = new Name("aa","bb");
这时name 和nameOne 也应该是指的两个对象。我用name.equals(nameOne),能返回true。该怎么理解啊 ?

作者: chenwei    时间: 2012-4-26 21:02
你name里面的equals方法比较的是2个字符串是否相等,相等的话返回true
跟对象无关,比的是内容
作者: 张小庆    时间: 2012-4-26 21:36
你remove的时候集合里还没有你new的那个对象,当然是false了,那个name是你之前new的对象,返回也就理所当然是true了
作者: 徐鑫    时间: 2012-4-26 23:31
System.out.println(list.remove(new Name("zhang","san")));//你这里删除一个新创建的Name类,怎么可能删除的到呢,它不在集合里               
                 System.out.println(list.remove(name));//name是集合里的对象可以删除
                 System.out.println(list.contains(new Name("wang","wu")));//同上
                 System.out.println(list);





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2