Set:元素不可以重复,是无序。
Set接口中的方法和Collection一致。
|--HashSet: 内部数据结构是哈希表 ,是不同步的。
如何保证该集合的元素唯一性呢?
是通过对象的hashCode和equals方法来完成对象唯一性的。
如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。
如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。
如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。
记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。
一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。
建立对象判断是否相同的依据。
|--TreeSet:可以对Set集合中的元素进行排序。是不同步的。
判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。
TreeSet对元素进行排序的方式一:
让元素自身具备比较功能,元就需要实现Comparable接口。覆盖compareTo方法。
如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序。怎么办?
可以使用TreeSet集合第二种排序方式二:
让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。
将该类对象作为参数传递给TreeSet集合的构造函数。
if(this.hashCode()== obj.hashCode() && this.equals(obj))
哈希表确定元素是否相同
1,判断的是两个元素的哈希值是否相同。
如果相同,在判断两个对象的内容是否相同。
2,判断哈希值相同,其实判断的是对象的hashCode的方法。判断内容相同,用的是equals方法。
注意:如果哈希值不同,是不需要判断equals。
demo1:
package com.cwcec.test; import java.util.HashSet; import java.util.Iterator; class Apple { private String color; private int weight; public String getColor() { return color; } public void setColor(String color) { this.color = color; } public double getWeight() { return weight; } public void setWeight(int weight) { this.weight = weight; } public Apple(String color,int weight) { this.color = color; this.weight = weight; } @Override public int hashCode() { System.out.println("hashcode:....."); return color.hashCode() + weight * 27; } @Override public boolean equals(Object obj) { System.out.println("equals:....."); if(this == obj) return true; if(!(obj instanceof Apple)) { throw new ClassCastException("类型错误!"); } Apple e = (Apple)obj; return color == e.color && weight == e.weight; } } public class Person { public static void main(String[] args) { HashSet hs = new HashSet(); hs.add(new Apple("red", 25)); hs.add(new Apple("black", 75)); hs.add(new Apple("black", 75)); Iterator it = hs.iterator(); while(it.hasNext()) { Apple apple = (Apple)it.next(); System.out.println(apple.getColor() + "," + apple.getWeight()); } System.out.println("--------------------------"); System.out.println(hs.contains(new Apple("black", 75))); System.out.println("--------------------------"); System.out.println(new Apple("black", 75).equals(new Apple("black", 75))); } }
HashSet 中判断元素是否存在用到了hashCode和equals 方法;
而ArrayList中判断元素是否存在只用到了equals 方法;
demo2:
package com.cwcec.test; import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet; class Apple implements Comparable { private String color; private int weight; public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getWeight() { return weight; } public void setWeight(int weight) { this.weight = weight; } public Apple(String color,int weight) { this.color = color; this.weight = weight; } @Override public int hashCode() { System.out.println("hashcode:....."); return color.hashCode() + weight * 27; } @Override public boolean equals(Object obj) { System.out.println("equals:....."); if(this == obj) return true; if(!(obj instanceof Apple)) { throw new ClassCastException("类型错误!"); } Apple e = (Apple)obj; return color == e.color && weight == e.weight; } @Override public int compareTo(Object o) { //让元素自身具备比较功能 if(!(o instanceof Apple)) { throw new ClassCastException("类型错误!"); } Apple e = (Apple)o; int temp = this.getColor().compareTo(e.getColor()); return temp == 0 ? this.getWeight() - e.getWeight() : temp; // return 1; } } class CompareByColor implements Comparator //让集合自身具备比较功能,比较器 { @Override public int compare(Object o1, Object o2) { Apple a1 = (Apple)o1; Apple a2 = (Apple)o2; int temp = a1.getColor().compareTo(a2.getColor()); return temp == 0 ? a1.getWeight() - a2.getWeight() : temp; } } public class Person { public static void main(String[] args) { TreeSet hs = new TreeSet(new CompareByColor()); hs.add(new Apple("red", 25)); hs.add(new Apple("black", 55)); hs.add(new Apple("red", 25)); hs.add(new Apple("white", 75)); Iterator it = hs.iterator(); while(it.hasNext()) { Apple a = (Apple)it.next(); System.out.println(a.getColor() + ":" + a.getWeight()); } } }