第8篇 Java中的集合(Set)

Java 集合的 Set 接口

Set类型与List类型的区别

  • Set: 无序、不可重复
  • List: 有序、可重复

1、HashSet

HashSet的存储结构:HashMap

特点:

  • HashSet通过比较存放的哈希码(hashCode)来确定对象存放的位置
  • 当两个对象的哈希值相等时,HashSet通过对象的equals方法来判断两个对象是否相同,如果相同则丢弃该对象

由于判断元素是否存在的依据是hashCode和equals方法,所以我们在使用时通常重写类的这两个方法,来达到自定义对象比较规则的目的。

该比较只实现判断两个对象是否相同,从而达到存放不重复的效果,并无排序功能。

重写hashCode()和equals(Object obj)方法实现对象比较

/**
 * 重写hashCode方法
 */
@Override
public int hashCode() {        
    return ID;
}

/**
 * 重写equals方法,必须在执行hashCode方法得到相同哈希值之后才进入该方法
 */
@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 (ID != other.ID)
        return false;
    return true;
}

习题:已知ArrayList集合s1, 现要实现将s1中重复的元素移除

方法1:

HashSet<String> s2 = new HashSet<String>(s1);

方法2:

HashSet<String> s2 = new HashSet<String>();
s2.addAll(s1);

方法3:

HashSet<String> s2 = new HashSet<String>();
for (String string : s1) {
    s2.add(string);
}

2、TreeSet

TreeSet使用元素的自然顺序对元素进行排序,或者根据创建set时提供的Comparator进行排序。

构造方法

TreeSet(Collection<? extends E> c)

构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序。

TreeSet(Comparator<? super E> comparator)

构造一个新的空 TreeSet,它根据指定比较器进行排序。该比较器为实现了Comparator接口的类的实体对象。

自然顺序的规则

TreeSet使用的元素的自然顺序由元素自己提供比较规则。

通常这个比较规则有两种实现方法:

  • 元素对象实现Comparable接口,并实现接口的CompareTo方法
  • TreeSet在实例化的时候传入一个该元素对象的比较器,该比较器实现了Comparator接口,并实现接口的compare方法

实现Comparable接口:

public class Student implements Comparable<Student>{

...
/** * 重写Comparable接口的compareTo方法,将o的name属性与本对象的name属性对比 */ @Override public int compareTo(Student o) { return name.compareTo(o.name); }

传入比较器:

比较器类

public class MyComparator implements Comparator<Student>{

    @Override
    public int compare(Student o1, Student o2) {        
        return o1.getAge() - o2.getAge();
    }

}

构造方法

HashSet<Student> stuList = new HashSet<Student>(new MyComparator());

练习:使用TreeSet对存储字符串并根据字符串长度排序

代码实现:

public static void main(String[] args) {
    //实例化TreeSet,并通过匿名类传入比较器
    TreeSet<String> tSet = new TreeSet<String>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {                
                return o2.length() - o1.length();
            }                
        }
    );
    
    tSet.add("asd");
    tSet.add("asd1");
    tSet.add("asd111");
    tSet.add("asd11");
    
    System.out.println(tSet);

}

打印结果:

[asd111, asd11, asd1, asd]

 

posted @ 2018-07-17 23:49  Zero_Yi  阅读(525)  评论(0编辑  收藏  举报