java集合(3) Set

  1. Set和Collection相比并没有提供更多处理数据的方法,Set中的对象是无序的,可以说Set就是Collection
  2. 需要指出的是Set中不允许有相同的元素(说明:Set中不是 == 来判断两个元素是否相等的(以前的博文有说明过 == 是比较物理地址的),Set是通过equals()方法和hashCode()来判断的,即equals()返回true,同时hashCode()返回值相同时将两个对象判定为同一个对象)
  3. HashSet是Set类的主要实现类,以下代码说明了Set如何判定两个对象是否相同
    //当向HashSet中存入A,B对象时,只有这连个对象的equals返回为true
    // 和hashCode一样的时候,HashCode才会把它们当成一个对象
    
    
    package Set;
    
    
    import java.util.HashSet;
    
    class A{
        public boolean equals(Object obj){
            return true;
        }
    }
    
    
    class B{
        public int hashCode(){
            return 2;
        }
    }
    
    class C{
    
        public int hashCode(){
            return 3;
        }
    
        public boolean equals(Object obj){
            return true;
        }
    
    }
    
    public class HashSetTest {
    
        public static void main(String args[]){
    
            HashSet books = new HashSet();
    
            books.add(new A());
            books.add(new A());
    
            books.add(new B());
            books.add(new B());
    
            books.add(new C());
            books.add(new C());
    
            System.out.println(books);
    
         }
    
    }
    //输出结果为
    //        [Set.B@2, Set.B@2, Set.C@3, Set.A@13b6d03, Set.A@f5f2bb7]
  4. 介绍一下LinkedHashSet类,LinkedHashSet类就是使用链表来维护集合元素的顺序~~也没啥好特殊的

  5. 以下为代码实例

    //LinkedHashSet就是普通的hashset加上链式结构存储
    
    package Set;
    
    import java.util.LinkedHashSet;
    
    public class LinkedHashSetTest {
        public static void main(String args[]){
            LinkedHashSet books = new LinkedHashSet();
            books.add("java1");
            books.add("java2");
            System.out.println(books);
    //      输出 [java1, java2]
            books.remove("java1");
            books.add("java1");
            System.out.println(books);
    //      输出 [java2, java1]
        }
    }
    
  6. 接下来介绍TreeSet类,TreeSet类最大的特点就是TreeSet集合中的元素排列不是无序的,它将输入的元素按照从小到大的顺序排列(字符类型的按照其Unicode值排序,字符串类型的按照字符串中的字符的Unicode值排序,Boolean类型的按照True大于False,数值型的按照数值大小排序),所以,TreeSet中元素的类型必须是相同的,因为只有相同类型的变量才可以比较。

  7. 以下是TreeSet类一些方法使用的实例

    package Set;
    
    import java.util.TreeSet;
    
    public class TreeSetTest {
    
        public static void main(String args[]){
            TreeSet nums = new TreeSet();
            nums.add(1);
            nums.add(2);
            nums.add(3);
            nums.add(4);
    //      这里需要特别指出的是,add()方法中的变量类型应该是一致的,具体的原因是:
    //      TreeSet会对集合里面的每一个元素进行比较,以决定其顺序,这样子的话就需要
    //      大部分类在时间comparedTo()(也就是比较的时候),都需要把被比较的对象
    //       强制转换为相同的类型,因为只有相同的类的实例才可以比较大小
    
    
            System.out.println(nums);
    //      这里需要特别指出:TreeSet并不是通过元素加入TreeSet的顺序来保存元素数据的
    //      而是通过元素的大小来保存数据的
    
            System.out.println(nums.first());
    //      first()方法返回TreeSet里的第一个元素
    
            System.out.println(nums.last());
    //      last()方法返回TreeSet里的最后一个元素
    
            System.out.println(nums.headSet(4));
    //      headSet()返回TreeSet中所有不大于参数里的数
    
            System.out.println(nums.subSet(-3,4));
    //      subSet(arg1,arg2)返回TreeSet中大于大于等于arg1但小于arg2的数
        }
    }
    
    //输出结果:
    //        [1, 2, 3, 4]
    //        1
    //        4
    //        [1, 2, 3]
    //        [1, 2, 3]
    
  8. TreeSet是可以定制排序的,实现方法是在实例化TreeSet的时候提供一个Comparator对象与其相关联,由该Cpmparator管理TreeSet的排列顺序,以下为代码实例

    package Set;
    
    
    import java.util.Comparator;
    import java.util.TreeSet;
    
    class M{
    
        int age;
        public M(int age){
            this.age = age;
        }
    
    
        public String toString(){
            return "M[age:" + age + "]";
        }
    
    }
    
    
    public class TreeSetTest4 {
    
        public static void main(String args[]){
    
            TreeSet treeSet = new TreeSet(new Comparator() {
                @Override
                public int compare(Object o1, Object o2) {
                    M m1 = (M)o1;
                    M m2 = (M)o2;
    
                    return m1.age > m2.age ? -1
                            :m1.age < m2.age ? 1 : 0;
    
    //                相当于下面的语句(来自幕后大佬)
    //                if(m1.age > m2.age){
    //                    return -1;
    //                }else if (m1.age < m2.age){
    //                    return 1;
    //                }else {
    //                    return 0;
    //                }
    
    
                }
            });
    
            treeSet.add(new M(5));
            treeSet.add(new M(-3));
            treeSet.add(new M(9));
            System.out.println(treeSet);
    
    
    
        }
    }
    

猜你喜欢

转载自blog.csdn.net/weixin_39452731/article/details/81332009