黑马程序员技术交流社区

标题: 技术分享:不需要遍历的直接修改 ,HashSet集合中特定的内.. [打印本页]

作者: 费世福    时间: 2015-8-18 20:53
标题: 技术分享:不需要遍历的直接修改 ,HashSet集合中特定的内..
本帖最后由 费世福 于 2015-8-18 22:43 编辑

package it.cast.hashset;
import java.util.HashSet;
public class Test {
        /**
         * 要求:将Student学号003的学生的名字“ddd”换成"fff"
         *                 
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                HashSet<Student> hashSet = new HashSet<Student>();
                hashSet.add(new Student("001","qqq",18));
                hashSet.add(new Student("002","aaa",14));
                hashSet.add(new Student("003","ddd",13));
               
                Student student2 = new Student(null,"fff",13);
                hashSet.add(student2);
                student2.setName("003");
                hashSet.remove(student2);
                //遍历显示
                for (Student student : hashSet) {
                        System.out.println(student);
                }
        }
}
/**************************************************************************
package it.cast.hashset;

public class Student {
                //成员属性
                private String studentid;
                private String name;
                private int age;
               
                //构造方法
                public Student() {
                        super();
                        // TODO Auto-generated constructor stub
                }
                public Student(String name,String studentid,int age) {
                        super();//父类是Object
                        this.age = age;
                        this.name = name;
                        this.studentid = studentid;
                       
                }
                //获得成员属性的get与set
                public String getName() {
                        return name;
                }
                public void setName(String name) {
                        this.name = name;
                }
                public String getStudentid() {
                        return studentid;
                }
                public void setStudentid(String studentid) {
                        this.studentid = studentid;
                }
               
                public int getAge() {
                        return age;
                }
                public void setAge(int age) {
                        this.age = age;
                }
                //toString
                @Override
                public String toString() {
                        return "Student [studentid=" + studentid + ", name=" + name
                                        + ", age=" + age + "]";
                }
                @Override
                public int hashCode() {
                        final int prime = 31;
                        int result = 1;
                        //result = prime * result + age;
                        result = prime * result + ((name == null) ? 0 : name.hashCode());
                        /*result = prime * result
                                        + ((studentid == null) ? 0 : studentid.hashCode());*/
                        return result;
                }
        /*        @Override
                public int hashCode() {
                        final int prime = 31;
                        int result = 1;
                        result = prime * result
                                        + ((studentid == null) ? 0 : studentid.hashCode());
                        return result;
                }*/
                @Override
                public boolean equals(Object obj) {
                        if (this == obj)
                                return true;
                        if (obj == null)
                                return false;
                        if (getClass() != obj.getClass())
                                return false;
                        Student other = (Student) obj;
                /*        if (age != other.age)
                                return false;*/
                        if (name == null) {
                                if (other.name != null)
                                        return false;
                        } else if (!name.equals(other.name))
                                return false;
                        /*if (studentid == null) {
                                if (other.studentid != null)
                                        return false;
                        } else if (!studentid.equals(other.studentid))
                                return false;*/
                        return true;
                }
               
                /*@Override
                public int hashCode() {
                        final int prime = 31;
                        int result = 1;
                        result = prime * result
                                        + ((studentid == null) ? 0 : studentid.hashCode());
                        return result;
                }

                @Override
                public boolean equals(Object obj) {
                        if (this == obj)
                                return true;
                        if (obj == null)
                                return false;
                        if (getClass() != obj.getClass())
                                return false;
                        Student other = (Student) obj;
                        if (studentid == null) {
                                if (other.studentid != null)
                                        return false;
                        } else if (!studentid.equals(other.studentid))
                                return false;
                        return true;
                }
                */
               
}




HashSet修改元素.png (166.8 KB, 下载次数: 9)

HashSet修改元素.png

作者: Hi_about...    时间: 2015-8-18 20:53
理解 理解 这样的确可以实现{:2_44:}
作者: 费世福    时间: 2015-8-18 20:55
这样的操作,可以避免了HashSet的效率低的特点哦
作者: liuch111    时间: 2015-8-18 22:29
为什么  hashSet.remove(student2);
删除的是 ddd对象 而不是fff对象呢?

看了几遍还是没懂!
作者: 费世福    时间: 2015-8-18 22:38
本帖最后由 费世福 于 2015-8-18 22:40 编辑
liuch111 发表于 2015-8-18 22:29
为什么  hashSet.remove(student2);
删除的是 ddd对象 而不是fff对象呢?

删除的时候,hashcode算出来的结果是HashSet中要被删除的ddd元素,所以删除的是ddd,而不是fff
作者: 费世福    时间: 2015-8-18 22:48
liuch111 发表于 2015-8-18 22:29
为什么  hashSet.remove(student2);
删除的是 ddd对象 而不是fff对象呢?

就是走了捷径,所以效率高
作者: 费世福    时间: 2015-8-19 10:45
怎么没人关注呢{:2_42:}
作者: 费世福    时间: 2015-8-19 11:54
Hi_about... 发表于 2015-8-19 11:52
理解 理解 这样的确可以实现

{:2_30:}重在理解
作者: wyd1    时间: 2015-8-22 22:57
实际开发中不会用到
作者: 手心的温度    时间: 2015-8-22 23:47
聪明的楼主,粉你
作者: jbl3344    时间: 2015-8-23 23:28
好吧好吧好吧
作者: 旦夕    时间: 2015-8-25 15:45
如果要替换多个元素呢
作者: 旦夕    时间: 2015-8-25 15:47
哦哦,再看一遍明白了,谢谢楼主
作者: woshicbb    时间: 2015-8-27 22:17
好长的代码!头晕了
作者: ll5353231    时间: 2015-9-26 19:03
呵呵 看清楚了




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