Java基础之Set接口

Set接口:

Set'接口与List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。

Set集合有多个子类,这里我们介绍其中的java.util.HashSetjava.util.LinkedHashSet这两个集合。

 

HashSet集合:

HashSet是Set接口的一个实现类,他存储的元素是不可重复的,并且元素都是无序的。

演示:

public class HashSetDemo {
    public static void main(String[] args) {
        //创建 Set集合
        HashSet<String>  set = new HashSet<String>();
​
        //添加元素
        set.add(new String("cba"));
        set.add("abc");
        set.add("bac"); 
        set.add("cba");  
        //遍历
        for (String name : set) {
            System.out.println(name);
        }
    }
}

输出结果:

cba
abc
bac

由此可说明,Set集合中不能存储重复的元素。

用HashSet存储自定义类型元素

给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一

两个自定义的对象,在set集合中判断是否相同 必须重写equals和hashCode方法

创建自定义Student类


public class Student {
	private String name;
	private int age;
	public Student() {
		
	}
	public Student(String name, int age) {
		
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@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 (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
	
	
	
}
import java.util.HashSet;

public class HashSetDemo02 {
	public static void main(String[] args) {
		HashSet<Student> stuSet = new HashSet<Student>();
		stuSet.add(new Student("血小板",10));
		stuSet.add(new Student("红细胞",20));
		stuSet.add(new Student("白细胞",23));
		stuSet.add(new Student("血小板",10));
		
		for(Student stu01 : stuSet) {
			System.out.println(stu01);
		}	
		}
}

执行结果:

Student [name=白细胞, age=23]
Student [name=血小板, age=10]
Student [name=红细胞, age=20]

LinkHashSet

我们知道HashSet保证元素唯一,可是元素存放进去是没有顺序的,那么我们要保证有序,怎么办呢?

在HashSet下面有一个子类java.util.LinkedHashSet,它是链表和哈希表组合的一个数据存储结构。

演示代码如下:

import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;

public class LinkedHashSetDemo01 {

	public static void main(String[] args) {
		Set<String> set = new LinkedHashSet<String>();
		set.add("血小板");
		set.add("红细胞");
		set.add("白细胞");
		set.add("B细胞");
		System.out.println(set);
		
		Iterator<String> it = set.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
			
		}

	}

}


结果: [血小板, 红细胞, 白细胞, B细胞]
血小板
红细胞
白细胞
B细胞

猜你喜欢

转载自blog.csdn.net/XianYuZong/article/details/82113184
今日推荐