java集合框架之Collection的子接口Set和它的实现类

求关注啊求关注
复习java基础,最近会持续更新有关java集合框架的系列,和java基础的其他文章

Set是Collection的子接口

Set是Collection的子接口,所以collection的所有方法,set都可以使用.
Set集合注重独一无二的特性,所以Set集合存储的元素是不重复,且无序(注:这里的无序指的是存入的顺序和取出的顺序可能不相同).

HashSet(哈希表)

哈希表存放的是哈希值,是按照哈希值来存储的,不是想List一样按照顺序存储的,所以取数据时也是按照哈希值来取元素的,元素的哈希值通过hashcode方法来获取

HashSet中怎么判断两个元素相同?

1.比较两个元素的哈希值,如果两个元素的哈希值不同,则这两个元素是不同的两个元素
2.如果两个元素的哈希值相同,则比较两个元素的equals方法,如果equals的结果是true,则两个元素是同一个元素,否则,两个元素不是同一个元素.

注:两个元素的哈希值相同,equals方法的比较结果也为true,元素是怎么存储的?
当发生这种情况时,就在同一哈希值下顺延(哈希桶),也就是哈希值一样的存在一列.

	@Test
	public void test1() {
		Set<String> set = new  HashSet<String>();
		set.add("张三");
		set.add("李四");
		set.add("王五");
		//set集合不重复
		set.add("张三");
		set.add("李四");
		set.add("王五");	
		for (String object : set) {
			System.out.println(object);
		}

	}

因为Set存储的元素不重复,重复的元素只会存储一份

TreeSet(二叉树)

1.TreeSet应用了二叉树的原理对add()的对象按照指定的顺序进行升序降序排列,加每个对象都会进行排序.
2.TreeSet的输出顺序为字典序,但是对象要进行TreeSet排序必须实现comparable接口,并重写compareTo()方法.
3.Integer和String的对象可以进行默认的TreeSet排序,已经实现了comparable接口
关于重写compare函数

  • 要返回相应的值才能使TreeSet进行相应的排序
  • 比较此对象和彼对象的顺序,大于,小于或者等于,分别返回正整数,负整数和零
//Integer和String的对象可以进行默认的TreeSet排序
	@Test
	public void test2() {
		Set<String> set = new  TreeSet<String>();
		set.add("zhangsan");
		set.add("lisi");
		set.add("wangwu");	
		for (String object : set) {
			System.out.println(object);
		}
	@Test
	public void test3() {
		Set set = new TreeSet();
		
		set.add(new Student(1,"张三",0));
		set.add(new Student(3,"李四",100));
		set.add(new Student(2,"王五",30));
		set.add(new Student(4,"赵六",50));
		
		
		for (Object object : set) {
			System.out.println(object);
		}
	}
//类实现了Compareable接口
class Student implements Comparable{
	private int id;
	private String name;
	private int score;
	/**
	 * @param id
	 * @param name
	 * @param score
	 */
	public Student(int id, String name, int score) {
		super();
		this.id = id;
		this.name = name;
		this.score = score;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", score=" + score + "]";
	}
	//这里重写了compareTo方法
	@Override
	public int compareTo(Object o) {
		Student stu = (Student)o;
		return this.id-stu.id;
	}

LinkedHashSet(HashSet+LinkedHashMap)

底层用LinkedHashMap实现但是又继承了HashSet和HashSet对元素的操作方法完全一致.
比HashSet多维护了一个添加顺序,但是存储顺序和添加顺序无关.

	@Test
	public void test4() {
		Set set = new LinkedHashSet();
		
		set.add(new Student(1,"张三",0));
		set.add(new Student(3,"李四",100));
		set.add(new Student(2,"王五",30));
		set.add(new Student(4,"赵六",20));
		
		for (Object object : set) {
			System.out.println(object);
		}
	}

class Student {
	private int id;
	private String name;
	private int score;
	/**
	 * @param id
	 * @param name
	 * @param score
	 */
	public Student(int id, String name, int score) {
		super();
		this.id = id;
		this.name = name;
		this.score = score;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", score=" + score + "]";
	}
发布了82 篇原创文章 · 获赞 26 · 访问量 3985

猜你喜欢

转载自blog.csdn.net/qq_40742223/article/details/105116795