一.4集合Set集合

一.4集合Set集合

6.Set集合

6.1HashSet集合介绍

java.util. Set接口extends Collection接口
Set接口的特点:
1.不允许存储重复的元素
2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
​
java. util. HashSet集合implements Set接口
HashSet特点:
1.不允许存储重复的元素
2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历(可以使用增强for和迭代器)
3.是一个无序的集合,存储元素和取出元素的顺序有可能不一致
4.底层是一个哈希表结构(查询的速度非常的快)

6.2哈希值

哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到地址,不是数据实际存储的物理地址)
在0bject类有一个方法,可以获取对象的哈希值
int hashCode() 返回该对象的哈希码值。
​
hashCode方法的源码:
public native int hashCode();
native :代表该方法调用的是本地操作系统的方法
​
使用:?.hashCode();
​
hashCode方法可被重写,在自定义的类(Demo02Person)里,重写hashCode方法可以让
Demo02Person per=new Demo02Person();
Demo02Person per2=new Demo02Person();
per.hashCode();的值等于per2.hashCode();
但是
System.out.println(per==per2);//false,即使重写hashcode方法后,实际物理意义上per和per2也不等。
​
​
//String类的哈希值
        // String类重写了object类的hashcode方法
        特殊:“重地” 和 “通话” 哈希值相等。

6.3HashSet集合存储数据结构(图库)

HashSet集合存储数据的结构*//*探究如何存储*/
/*HashSet慊合存儲数据的結枸(哈希表)
jdk1.8版本之前:哈希表=数蛆+鉦表
jdk.8版本之后
哈希表=数姐+链表
哈希表=数姐+紅黒树(提高査詢的速度)
哈希表的特点:速度快
​
数組结构把元素迸行了分組(相同哈希値的元素是一俎) 链表/红黑树把相同哈希値的元素链接一起
如果链表的长度超过了8位那么就会把链表换成红黑树(提高查询的速度);
​
哈希冲突:俩的哈希值相同。

6.4Set集合存储元素不重复的原理

HashSet如何存储
* Set集合在调用add方法的时候,add方法会调用元素的hashCode方法和equals方法,判断元素是否重复
​
例:HashSet<String> h=new HashSet<>();
        String s1=new String("aaa");
        String s2=new String("aaa");
        h.add(s1);
        h.add(s2);
*h. add(s1); .
add方法会调用s1的hashCode方法计算字符串"abc的哈希值,哈希值是96354
在集合中找有没有96354这个哈希值的元素,发现没有
就会把s1存储到集合中
​
h.add(s2);
add方法会调用s2的hashCode方法计算字符串"abc"的哈希值哈希值是96354在集合中找有没有96354这个哈希值的元素发现有(哈希冲突
s2会调用equals方法和哈希值相同的元素进行比较s2.equals(s1),返回true两个元素的哈希值相同,equals方法返回true,认定两个元素相同
就不会把s2存储到集合中
​
​
例: h.add("重地");
        h.add("通话");
* h.add(“重地");
add方法会调用"重地”的hashCode方法计算字符串"重地”的哈希值,哈希值是1179395
在集合中找有没有1179395这个哈希值的元素,发现没有
就会把“重地“存储到集合中
​
h. add("通话");
add方法会调用"通话"的hashCode方法计算字符串"通话"的哈希值,哈希值是1179395
在集合中找有没有1179395这个哈希值的元素,发现有(哈希冲突)
接着
"通话“会调用equals方法和哈希值相同的元素进行比较:“通话" .equals(重地),返回false
两个元素的哈希值相同,equals方法返@false,认定两个元素不同
就会把"通话"存储到集合中

6.5HashSet存储自定义类型元素

(在自定义的类中,除了重写toString方法让其输出内容,还需要重写HashCode方法和equals方法,以便为了HashSet方法的使用(使用HashSet方法必须重写HashCode方法和equals方法,不然就没有办法保证不在集合里保存不重复的项))

HashSet存储自定义类型元素
set集合报错元素唯一:
存储的元素 (String, Integer,. . . Student, Person...),必须重写hashCode和equals方法
例:要求:
同名同年龄的人,视为同一个人,只能存储一次

6..6LinkedHashSet集合

java.util. LinkedHashSetâ extends HashSetâ
​
LinkedHashSet集合特点:
底层是一个哈希表(数组+链表/红黑树)+链表:多了-条链表(记录元素的存储顺序),保证元素有序
LinkedHashSet<String(通配符)> linked = new LinkedHashSet<>();

6.7可变参数

可变参数:
是JDK1.5之后出现的新特性
​
使用前提:
当方法的参数列表数据类型已经确定,但是参数的个数不确定,就可以使用可变参数.
使用格式:定义方法时使用
​
修饰符 返回值类型 方法名(数据类型.. .变量名){}
​
可变参数的原理:
可变参数底层就是一个 数组,根据传递参数个数不同,会创建不同长度的数组,来存储这些参数传递的参数个数,可以是0个(不传递),1,2...多个
​
//可变参数的注意事项
    //1.一个方法的参数列表,只能有一个可变参数
    //2.如果方法的参数有多个,那么可变参数必须写在参数列表的末尾
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值