集合框架之Set

嗨喽大家好,今天博主简单介绍一下常用的集合框架里的set集合框架

目录

1.特点

2.遍历方式

3.HashSet哈希表存储,重复元素底层探究

4.TreeSet(自然排序,比较器排序)

4.1自然排序:

4.2比较器排序:


1.特点

  • 不可重复
  • 无序

1.HashSet,特点:

  • 它不按照存储的顺序保存,具有不确定性,也就是说每一次遍历集合出的元素相同;排序不一定相同
  • 允许使用null元素

2.TreeSet,特点:

  • 及实现Set接口,也实现了SortedSet接口,具有排序功能
  • 存入TreeSet中的对象元素需要实现Comparable接口

set不可重复,并且是无序的,基本数据类型&String

跟着博主看看效果吧!

源代码:

package com.ps.set;

import java.util.HashSet;
import java.util.Iterator;

/**
 * set集合的特点
 * 不重复:基本数据类型&String="abc";
 * @author Ps
 *
 * @time 2022年6月8日 下午4:41:52
 */
public class Demo1 {
	public static void main(String[] args) {
		HashSet<Object> set =new HashSet<>();
		set.add("zs");
		set.add("ls");
		set.add("ww");
		set.add("老六");
		set.add("ls");
		System.out.println(set.size());
		
		System.out.println("---------------增强for--------------");
		for (Object obj : set) {
			System.out.println(obj);
		}
		
		System.out.println("---------------增强for--------------");
		Iterator<Object> it =set.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		
	}
}

    效果:

2.遍历方式

HashSet集合遍历方式有两种

foreach迭代器(Iterator)

 代码也在上面;

3.HashSet哈希表存储,重复元素底层探究

set底层去重原理

 1.set去重底层原理是与对象的hashcode以及equals方法相关
 2.判断重复元素的时候,是比较hashcode值,再调用equals比较内容

看代码吧!

package com.ps.set;

import java.util.HashSet;
/**
 * set底层去重原理
 * 1.set去重底层原理是与对象的hashcode以及equals方法相关
 * 2.判断重复元素的时候,是比较hashcode值,在调用equals比较内容
 * @author ps
 *
 * @time 2022年6月8日 下午5:09:11
 */
public class Demo2 {
	public static void main(String[] args) {
		HashSet<Object> set =new HashSet<>();
		set.add(new Person("zs",18));
		set.add(new Person("ls",14));
		set.add(new Person("ww",24));
		set.add(new Person("老六",22));
		set.add(new Person("zs",18));
		System.out.println(set.size());
	}
}
class Person /*implements Comparable<Person>*/{
	private String name;
	private int age;
	private int level;
	
	public int getLevel() {
		return level;
	}
	public void setLevel(int level) {
		this.level = level;
	}
	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;
	}
	public Person() {
		// TODO Auto-generated constructor stub
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	public Person(String name, int age, int level) {
		super();
		this.name = name;
		this.age = age;
		this.level = level;
	}
	
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", level=" + level + "]";
	}
	@Override
	public int hashCode() {
		System.out.println("-----------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) {
		System.out.println("-----------equals------------");
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) 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;
	}
	
}

效果如下:

4.TreeSet(自然排序,比较器排序)

4.1自然排序

 图上就是自然排序

但是当你需要用对象进行排序的时候,就会遇到问题:

就是下面这个类型转换异常:

Exception in thread "main" java.lang.ClassCastException:
com.ps.set.Person cannot be cast to java.lang.Comparable

这时候我们得把那个对象找一个接口:Comparable<Person>(person是博主写的对象类)

 实现方法后便可以排序了

 源代码:

package com.ps.set;

import java.util.TreeSet;

public class Demo4 {
	public static void main(String[] args) {
		TreeSet set =new TreeSet<>();
		set.add(new Person("aa",1,1));
		set.add(new Person("bb",2,2));
		set.add(new Person("cc",3,4));
		set.add(new Person("dd",4,5));
		set.add(new Person("ee",1,1));
		for (Object obj : set) {
			System.out.println(obj);
		}
	}
}

现象: 

  1. String默认是能够排序的
  2. 自定义的对象无法排序,报类型转换异常

结论:

 java.lang.Comparable:自然排序 排序的规则是单一的,不能够应对复杂的变化的需求

4.2比较器排序

需要implements  Comparator 也是实现比较器接口的意思

实现后不需要用到上面在实体类中实现Comparable接口了

效果如下:

 源代码:

package com.ps.set;

import java.util.Comparator;
import java.util.TreeSet;

public class Demo4 {
	public static void main(String[] args) {
		TreeSet set =new TreeSet<>(new levelCompartor1());
		set.add(new Person("aa",1,1));
		set.add(new Person("bb",2,2));
		set.add(new Person("cc",3,4));
		set.add(new Person("dd",4,5));
		set.add(new Person("ee",1,1));
		for (Object obj : set) {
			System.out.println(obj);
		}
	}
}

class levelCompartor1 implements Comparator<Person>{

	@Override
	public int compare(Person o1, Person o2) {
		int levelRes =o1.getLevel()-o2.getLevel();
		return levelRes == 0? o1.getAge()-o2.getAge():levelRes;
	}
	
}

好啦,到这里今天的分享也接近尾声了,如果喜欢的话记得点赞加收藏哦!我们下次再见!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值