黑马程序员技术交流社区

标题: 这是我敬爱的老师的笔记,看看很受益呀 [打印本页]

作者: FutureQing    时间: 2016-4-8 23:46
标题: 这是我敬爱的老师的笔记,看看很受益呀
Set(☆☆☆☆☆):存取无序 元素唯一
        一:HashSet(☆☆☆☆☆):存取无序 元素唯一
               
                代码演示:
                public static void demo1() {
                        HashSet<String> hs = new HashSet<>();        //创建HashSet对象
                        boolean b1 = hs.add("a");
                        boolean b2 = hs.add("a");                //当向set集合中存储重复元素的时候返回为false
                        hs.add("b");
                        hs.add("c");
                        hs.add("d");
                        System.out.println(hs);                        //[d, b, c, a] 存取无序  并且去掉了重复元素
                        System.out.println(b1);                        //true
                        System.out.println(b2);                        //false
                       
                        for (String string : hs) {                //只要能用迭代器迭代的,就可以使用增强for循环遍历
                                System.out.println(string);
                        }
                }

                保证元素唯一性 需要让元素重写两个方法 一个是 hashCode() 另一个是 equals()
                HashSet在存储元素的过程中 首先会去调用元素的hashCode()值,看其哈希值与已经存入HashSet的元素的哈希值是否相同
                        如果不同 :就直接添加到集合
                        如果相同 :则继续调用元素的equals() 和哈希值相同的这些元素依次去比较
                                        如果说有返回true的   那就重复 不添加
                                        如果说比较结果都说false  那就是不重复 就添加

                        为了减少equals的比较次数提高效率 一般情况 让属性不同的对象尽量hashCode()值不同
                        那么如何重写 equals()和hashCode()呢? Eclipse自动生成即可

                代码演示:
                public static void main(String[] args) {

                        HashSet<Person> hs = new HashSet<>();
                        hs.add(new Person("张三", 23));
                        hs.add(new Person("张三", 23));
                        hs.add(new Person("李四", 24));
                        hs.add(new Person("李四", 24));
                        hs.add(new Person("李四", 24));
                        hs.add(new Person("李四", 24));
                       
                        System.out.println(hs);                //Person重写了equals()方法和hashCode()方法,所以 hs 去除了重复的元素
                }
                public class Person {                        //Person里面 Eclipse自动生成了 equals()方法和hashCode()方法
                        private String name;
                        private int age;
                        public Person() {
                                super();                       
                        }
                        public Person(String name, int age) {
                                super();
                                this.name = name;
                                this.age = age;
                        }
                        public String getName() {
                                return name;
                        }
                        public void setName(String name) {
                                this.name = name;
                        }
                        public int getAge() {
                                return age;
                        }
                        public void setAge(int age) {
                                this.age = age;
                        }
                        @Override
                        public String toString() {
                                return "Person [name=" + name + ", age=" + age + "]";
                        }                       
                        /*
                         * 为什么是31?
                         * 1,31是一个质数,质数是能被1和自己本身整除的数
                         * 2,31这个数既不大也不小
                         * 3,31这个数好算,2的五次方-1,2向左移动4位
                         */
                        @Override
                        public int hashCode() {
                                final int prime = 31;
                                int result = 1;
                                result = prime * result + age;
                                result = prime * result + ((name == null) ? 0 : name.hashCode());
                                return result;
                        }
                        @Override
                        public boolean equals(Object obj) {
                                if (this == obj)                                //调用的对象和传入的对象是同一个对象
                                        return true;                                //直接返回true
                                if (obj == null)                                //传入的对象为null
                                        return false;                                //返回false
                                if (getClass() != obj.getClass())                //判断两个对象对应的字节码文件是否是同一个字节码
                                        return false;                                //如果不是直接返回false
                                Person other = (Person) obj;                        //向下转型
                                if (age != other.age)                                //调用对象的年龄不等于传入对象的年龄
                                        return false;                                //返回false
                                if (name == null) {                                //调用对象的姓名为null
                                        if (other.name != null)                        //传入对象的姓名不为null
                                                return false;                        //返回false
                                } else if (!name.equals(other.name))                //调用对象的姓名不等于传入对象的姓名
                                        return false;                                //返回false
                                return true;                                        //返回true
                        }               
                }


        二:LinkedHashSet(☆☆☆):直接父类是 HashSet
                特点:存取有序  存储的元素不能重复
               
                代码演示:
                LinkedHashSet<String> lhs = new LinkedHashSet<>();
                lhs.add("a");
                lhs.add("a");
                lhs.add("a");
                lhs.add("a");
                lhs.add("b");
                lhs.add("c");
                lhs.add("d");
               
                System.out.println(lhs);//[a,b,c,d]  去除了重复的元素 同时又保证了存取有序







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