set 集合与 map集合

HashSet与TreeSet详解

一、Set(集合是不能放重复的元素,无序。)
这是转载别人的
主要介绍HashSet与TreeSet
Set是一个接口,而HashSet与TreeSet实现了Set的接口,
/**
为什么不写HashSet set = new HashSet();
而写Set set = new HashSet();
这样就只能调用Set接口里面定义好的方法,而不能使用HashSet里的方法,
方便转化为TerrSet ,面向接口编程的思想,
便于程序代码的重构. 这就是面向接口编程的好处
通过接口很大限度上规范开发人员的实现规则,因为你现在只能调用接口的方法
*/
注意<>里的内容(String)是泛型,是指定你的集合里面能放什么东西。现在这个集合里面只能放String。

HashSet:
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
多线程访问HashSet,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。
当你在HashSet中存入一个元素时,HashSet会调用hashCode()来获得元素的哈希码值,跟已存在的元素相比较,如果哈希码一样,则返回false。
HashSet需要同时通过equals和HashCode来判断两个元素是否相等,具体规则是,如果两个元素通过equals为true,并且两个元素的hashCode相等,则这两个元素相等(即重复)。
如果存入的是一个可变的对象
所以如果要重写保存在HashSet中的对象的equals方法,也要重写hashCode方法,重写前后hashCode返回的结果相等(即保证保存在同一个位置)。所有参与计算 hashCode() 返回值的关键属性,都应该用于作为 equals() 比较的标准。

试想如果重写了equals方法但不重写hashCode方法,即相同equals结果的两个对象将会被HashSet当作两个元素保存起来,这与我们设计HashSet的初衷不符(元素不重复)。

另外如果两个元素哈市Code相等但equals结果不为true,HashSet会将这两个元素保存在同一个位置,并将超过一个的元素以链表方式保存,这将影响HashSet的效率。

如果重写了equals方法但没有重写hashCode方法,则HashSet可能无法正常工作,比如下面的例子。
解释存对象时的操作

set集合取数方式:
迭代器:
foreach循环:(加强版for循环,遍历(从第一个位置到最后一个位置))
语法:
for(每一次遍历接收的对象声明: 需要被遍历的集合或数组){
代码块;
}
常用方法:
add();//添加尚未存在的元素
addAll();//添加所有
clear();//移除当前集合所有元素
contains();//查找当前集合中是否有指定元素
hashCode();//返回集合的哈希码值
iterator();//迭代器,就是把当前集合中的元素循环出来,一般建议不使用,用foreach循环遍历。
remove();//删除指定元素
size();//返回集合中元素的数量

TreeSet:
有序(大小排序)
是根据二叉树的结构进行自然顺序排序;
排序规则定义有:
自定义规则 :自己独立写一个排序规则,Comparator
本身需要排序的对象,实现接口,完成排序规则; Comparable

二、Map集合(映射关系)
接口Map

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值