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才会把它们当成一个对象
//可以看到的是,Set中之存在一个C对象,因为C的equals方法返回true和hashCode方法返回值固定,所有Set会把所有的C对象都当作是一样的。

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]
  1. 介绍一下LinkedHashSet类,LinkedHashSet类就是使用链表来维护集合元素的顺序~~也没啥好特殊的
  2. 以下为代码实例
//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]
    }
}
  1. 接下来介绍TreeSet类,TreeSet类最大的特点就是TreeSet集合中的元素排列不是无序的,它将输入的元素按照从小到大的顺序排列(字符类型的按照其Unicode值排序,字符串类型的按照字符串中的字符的Unicode值排序,Boolean类型的按照True大于False,数值型的按照数值大小排序),所以,TreeSet中元素的类型必须是相同的,因为只有相同类型的变量才可以比较。
  2. 以下是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]
  1. 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);



    }
}