zoukankan      html  css  js  c++  java
  • Set集合HashSet,TreeSet

    1.Set是Collection子接口,Set无法记住元素添加顺序,不允许重复元素,最多包含 一个 null 元素,当试图添加两个相同元素进Set集合,添加操作失败,add()方法会返回false。(无序,不重复)
    2.Set判断两个对象是否相等用equals比较,而不是==。
    3.常用子类:hashSet(散列存放),treeSet(有序存放)


    HashSet类(不同步)
    当想HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,判断已经存储在集合中的对象的hashCode值是否与添加对象的hashCode值一致:若不一致,直接添加;若一致,在进行equals方法比较,equals方法如果返回True,表明对象已经添加进去了,不会再添加新的对象,否则添加进去;
    注意:
    1.如果重写了equals方法,那么也必须重写hashCode方法,反之亦然。
    2.如果需要某个类的对象保存到HashCode集合中,重写该类的equals()hashCode()方法,应该尽量保证两个对象通过equals比较返回true时,他们的hashCode返回也相等。

    package com.wql;
    
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;
    
    /**
     * HashSet演示
     * 
     * @author wql
     *
     */
    class Person {
        private String name;
    
        public Person(String name) {
            super();
            this.name = name;
        }
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((name == null) ? 0 : name.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;
            Person other = (Person) obj;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
        }
    
        @Override
        public String toString() {
            return name;
        }
    
    }
    
    public class HashSetDemo {
    
        public static void main(String[] args) {
            // TODO 自动生成的方法存根
            Set s=new HashSet();
    
            s.add(new Person("张三"));//如果不重写hashCode()和equals()方法,会输出三个张三
            s.add(new Person("张三"));
            s.add(new Person("张三"));
    
            for (Iterator it = s.iterator(); it.hasNext();) {
                Object obj = (Object) it.next();
                System.out.println(obj.toString());
            }
        }
    
    }
    

    运行结果:
    这里写图片描述
    如果没有重写hashCode()和equals()方法,或者只是重写两个方法其中一个,结果会输出三个 张三。


    TreeSet类(不同步)
    TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,因此,TreeSet类实现的Set集合在遍历集合时按照自然顺序递增排序,既TreeSet会调用元素的compareTo(Object o)方法来比较元素的大小关系,然后将集合里的元素按升序排列。此时需要排序的元素的类必须实现compareTo(Object o)方法。
    该方法用于比较对象,若:obj1.compareTo(obj2),返回0,表示两个对象相等,若返回一个正整数,表示obj1大于obj2,若返回一个负整数,表示obj1小于obj2。

    package com.wql;
    
    import java.util.Iterator;
    import java.util.Set;
    import java.util.TreeSet;
    
    /**
     * TreeSet演示
     * 
     * @author wql
     *
     */
    class Student implements Comparable{    //实现Comparable接口
        private String name;
        private int age;
    
        public Student(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
    
    
        @Override
        public int compareTo(Object o) {
            // TODO 自动生成的方法存根
            if(o instanceof Student){
                Student s=(Student)o;
                return this.age-s.age;
            }
            return 0;
        }
    
    
        @Override
        public String toString() {
            return "Student [name=" + name + ", age=" + age + "]";
        }
    
    
    }
    public class TreeSetDemo {
    
        public static void main(String[] args) {
            // TODO 自动生成的方法存根
            Set set=new TreeSet();
            set.add(new Student("张三",25));
            set.add(new Student("王五",28));
            set.add(new Student("李四",23));
            set.add(new Student("张三",25));//不会输出,Set集合不允许重复元素
    
            for (Iterator it = set.iterator(); it.hasNext();) {
                Object obj = (Object) it.next();
                System.out.println(obj.toString());
            }
        }
    
    }
    

    运行结果:
    这里写图片描述

  • 相关阅读:
    Android全局变量的定义与使用
    安卓4.0/4.1/4.2手机怎么打开USB调试模式
    Android中的DDMS进行调试
    Runtime.getRuntime().exec执行阻塞问题解决
    GC_EXTERNAL_ALLOC freed 与 GC_EXPLICIT freed 是什么?
    [基础]Android 应用的启动
    Android popupwindow 失去焦点或者点击空白区域时消失的解决方法
    [问题]Android listView item edittext 不能调用软键盘输入法
    Android greenDAO 数据库 简单学习之基本使用
    Java 找出四位数的所有吸血鬼数字 基础代码实例
  • 原文地址:https://www.cnblogs.com/wangqilong/p/9417569.html
Copyright © 2011-2022 走看看