Java--集合(set集合、map集合)

set集合

特点:无序,唯一,无索引

HashSet

底层数据结构是哈希表。
哈希表依赖两个方法:hashCode()和equals()
(一般规则:对象equals 是true的话,hashCode需要相同,但是hashCode相同的对象不一定equals,这就是所谓的冲突现象,但是有不同的冲突解决方法。你的hashCode()设计的好的话冲突也就小了。比如楼上给出的超出int范围之后这种hashCode()实现,对象肯定是无数的,但是hash实现是有限的呢,所以冲突了。)
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals(),看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
最终:
自动生成hashCode()和equals()即可

LinkedHashSet

底层数据结构由链表和哈希表组成。
由链表保证元素有序。
由哈希表保证元素唯一

TreeSet

底层数据结构是红黑树。(是一种自平衡的二叉树)
如何保证元素唯一性呢?
根据比较的返回值是否是0来决定
如何保证元素的排序呢?
两种方式
自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
比较器排序(集合具备比较性)
让集合接收一个Comparator的实现类对象

set集合案例

public static void main(String[] args) {
	
	//创建学生
	Student stu1 =new Student("dada1", "s01", "11", "男");
	Student stu2 =new Student("dada2", "s02", "12", "男");
	Student stu3 =new Student("dada3", "s03", "13", "男");
	
	//创建一个set集合,student类的类型
	Set<Student> set =new HashSet<>();
	set.add(stu1);
	set.add(stu2);
	set.add(stu3);
	
	set.forEach(s->System.out.println(s));
	
}

是无序的
在这里插入图片描述

map集合

特点:map(A,B);
A:Map集合的数据结构仅仅针对键有效,与值无关。
B:存储的是键值对形式的元素,键唯一,值可重复。

HashMap

底层数据结构是哈希表(散列表)。线程不安全,效率高
哈希表依赖两个方法:hashCode()和equals()
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals(),看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
最终:
自动生成hashCode()和equals()即可

LinkedHashMap

底层数据结构由链表和哈希表组成。
由链表保证元素有序。
由哈希表保证元素唯一。

Hashtable

底层数据结构与HashMap相同,都是用的Hash表,和Vector的命一样,都是ArrayList和HashMap的安全与不安全
HashMap–>允许key和value都可以为null
Hashtable–>不能为null
层数据结构是哈希表。线程安全,效率低
哈希表依赖两个方法:hashCode()和equals()
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals(),看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
最终:
自动生成hashCode()和equals()即可

TreeMap

底层数据结构是红黑树。(是一种自平衡的二叉树)
如何保证元素唯一性呢?
根据比较的返回值是否是0来决定
如何保证元素的排序呢?
两种方式
自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
比较器排序(集合具备比较性)
让集合接收一个Comparator的实现类对象

案例

public static void main(String[] args) {
		
		//创建学生
		Student stu1 =new Student("dada1", "s01", "11", "男");
		Student stu2 =new Student("dada2", "s02", "12", "男");
		Student stu3 =new Student("dada3", "s03", "13", "男");
		
		//创建map集合
		Map<String, Student> map =new HashMap<>();
		map.put(stu1.getNumber(), stu1);
		map.put(stu2.getNumber(), stu2);
		map.put(stu3.getNumber(), stu3);
		
		//遍历集合
		map.forEach((k,v)->System.out.println(k+" "+v));
	}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

pedro的程序时刻

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

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

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

打赏作者

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

抵扣说明:

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

余额充值