【Java】HashSet 和 TreeSet

一. HashSet

1. HashSet 数据结构哈希表。HashSet 中的元素是不能重复的,需要覆盖 hashcode 和 equals 方法来保证元素不会重复。

Java Platform SE 7 【Java】HashSet 和 TreeSethttps://docs.oracle.com/javase/7/docs/api/2.  HashSet 使用示例

// (1) 定义 HashSet
HashSet<String> hs = new HashSet<String>();

// (2) 添加元素	
hs.add("three");
hs.add("one");
hs.add("two");
hs.add("one");

// (3) for 遍历	
for(String e:hs){
	System.out.println(e);
}

// (4) 迭代器编译
Iterator<String> it = hs.iterator();
while(it.hasNext()){
	System.out.println(it.next());
}
		
// (5) 自定义的类需要重载实现 hashcode() 和 equals() 方法来保证 HashSet 中元素不重复
class Person implements Comparable<Person>{
	
    // 重载 equals() 方法,定义判断两个Person对象相等的规则 
	@Override
	public boolean equals(Object obj) {
		Person p1 = (Person)obj;
		return p1.pid == this.pid;
	}
	
    // 重载 hashCode() 方法,定义实现
	@Override
	public int hashCode() {
		return this.pid+this.name.hashCode();
	}

    private int pid;
	private String name;
	public Person(int pid, String name) {
		super();
		this.pid = pid;
		this.name = name;
	}
}

HashSet<Person> hs = new HashSet<Person>();
Person p1 = new Person(1,"tom");
Person p2 = new Person(2,"kite");
Person p3 = new Person(3,"rose");
Person p4 = new Person(1,"tom");
		
hs.add(p1);
hs.add(p2);
hs.add(p3);
hs.add(p4); // 根据 equals() 方法,pid相同的元素相等,所以 HashSet 中 p4 会覆盖 p1

for(Person e:hs){
	System.out.println(e);
}

二. TreeSet 

1. TreeSet 的数据结构是树。TreeSet 有自动排序的功能,自定义的对象除了需要重载 hashCode 和 equals 方法外,还需要重载 compareTo 方法自定义排序功能。

// 定义一个 TreeSet
TreeSet<Person> ts = new TreeSet<Person>();
		
// 自定义的对象
Person p1 = new Person(1,"tom");
Person p2 = new Person(2,"kite");
Person p3 = new Person(3,"rose");
Person p4 = new Person(1,"tom");

// 添加元素		
ts.add(p3);
ts.add(p1);
ts.add(p2);
ts.add(p4);

// 遍历
for(Person e:ts){
	System.out.println(e);
}

class Person implements Comparable<Person>{
	@Override
	public int hashCode() {
		return this.pid+this.name.hashCode();
	}

	@Override
	public boolean equals(Object obj) {
        Person p1 = (Person)obj;
		return p1.pid == this.pid;
	}

	@Override
	public String toString() {
		return pid+":"+name;
	}
	
	private int pid;
	private String name;
	public Person(int pid, String name) {
		super();
		this.pid = pid;
		this.name = name;
	}

    // 此 compareTo 实现 pid 降序排序
	@Override
	public int compareTo(Person o) {
		if(this.pid>o.pid){
			return -1;
		}else if(this.pid==o.pid){
			return 0;
		}else{
			return 1;
		}
	}
	
}

上一篇:集合


下一篇:2021-11-14