集合【4】--- Set

59 篇文章 2 订阅

集合相关知识总结:

集合【1】 — 综述与ArrayList

集合【2】 — LinkedList

集合【3】 — ArrayList和LinkedList区别与联系(面试题)

集合【4】— Set

集合【5】— Map集合

集合【6】— HashSet存储机制

集合【7】— 遍历ArrayList集合三种方法

集合【8】— 去掉List集合重复的元素


集合【4】— Set

1. Set集合

集合中的元素不能①重复,②无序(按照自己的方式进行排序,排序方式比较复杂,所以很多人认为它是无序的)

1.1 HashSet

HashSet实现了Set接口,使用哈希算法对集合进行排序

  • 特征:集合中的元素不能重复, List集合可以重复
1.1.1 HashSet创建
Set set = new HashSet();
1.1.2 放入HashSet容器(集合)

集合内部元素不可以重复

HashSet元素与元素之间没有关联,所以不能进行get(). --》 直接用 System.out.println(set); ,可以输出所有元素但是是无序的,和存入的顺序一点关系都没有。

【示例】

场景:创建一个Student类型的对象有id和name属性,创建5个Student类型对象,将其放入HashSet中,观察会发生什么情况。

小结:HashSet判断元素是否相同的规则是:hashCode相同并且equals相等就是相同元素

1 新元素(对象)放入集合之前会检查新对象的HashCode在集合中是否存在(有相同的),如果有

2 在调用equals()方法,判断新元素是否和集合中存在的元素相等

3 如果新元素的hashCode在集合中存在,并且equals判断也相等,就是重复的元素不会加入到集合

Studeng类型由于没有覆盖Object的hashCode()方法和equals()方法,所以hashCode是不相同的,就会放入集合

如何解决?一旦定义实体类必须重写覆盖Object类型的toString()、hashCode()、equals()方法,因为你的实体类有可能放入HashSet集合。

HashSet判断元素是否相同的规则是:hashCode相同并且equals相等就是相同元素

重写覆盖Object类型的toString()、hashCode()、equals()方法

1.2 LinkedHashSet

HashSet前缀加了个Linked,变成了有序的,add()方法放入的顺序和取出的顺序是一样一样的。

2. 使用HashSet解决实际问题

2.1 对ArrayList去重

将ArrayList重复的元素去掉?

步骤:1 创建HashSet对象,然后将ArrayList的数据放入HashSet集合中

​ 2 ArrayList数据清空 clear() 7—>0

​ 3 将HashSet的元素放入(加入)ArrayList

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 去掉ArrayList重复的元素,Tom重复
 */
public class TestHashSet {
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("Tom");
		list.add("Tomson");
		list.add("Tomas");
		list.add("Tom");
		list.add("Jerry");
		/*
		 * 重构:重新组织你的代码结构
		 1选中要提取的代码
		 2反键Refactor-->Exract Method(提取方法)
		 3为要提取的方法命名
		 */		
		distinct(list);
		System.out.println(list);
	}

	public static void distinct(List<String> list) {
		Set<String> set = new HashSet<>();
		set.addAll(list);
		list.clear();
		list.addAll(set);
	}	
}
2.2 白名单
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

/**
 * 白名单是一个HashSet集合,里面存储了若干个手机号码
 * 从控制台输入一个手机号码,判断是否在白名单中,如果不在,执行操
 */
public class TestHashSet3 {
	
	/**
	 *  白名单集合只加载一次,所以使用final static 
	 */
	private final static Set<String> MOBILE_SET = new HashSet<>();
	static{
		MOBILE_SET.add("15689678943");
		MOBILE_SET.add("15689678948");
		MOBILE_SET.add("15689678947");
		MOBILE_SET.add("15689678946");
		MOBILE_SET.add("15689678941");
	}
	
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.println("请输入手机号码");
		String mobile = input.next();
		//条件成立:表示输入的手机号码不在白名单中,执行下面操作
		if(!MOBILE_SET.contains(mobile)){
			System.out.println("执行操作");
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樂小伍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值