java学习之高级语法 --- Set 集合
Set 集合
▶ java.util.Set 接口 extends Collection 接口
Set 接口的特点:
(1)不允许存储重复的元素
(2)没有索引,没有带索引的方法,也不能使用普通的for循环遍历
▶ java.util.HashSet 集合 implements Set接口
HashSet 接口的特点:
(1)不允许存储重复的元素
(2)没有索引,没有带索引的方法,也不能使用普通的for循环遍历
(3)是一个无序集合,存储元素和取出元素的顺序可能不一致
(4)底层是一个哈希表结构,特点是 “ 查询速度快 ”
▶ 哈希值是一个十进制的整数,由系统随机给出
(就是对象的地址值,是一个逻辑地址,是模拟出来得到的地址,不是数据实际存储的物理地址)
在Object类有一个方法可以获取对象的Hash值:int hashCode() ; --- 该方法返回调用这个方法的对象的哈希码值
hasCode方法的源码: public native int hashCode() ;
native:代表该方法调用的是本地操作系统的方法
public class Person extends Object {
}
public class DemoHahCode {
public static void main(String[] args) {
// Person类继承了Object类,所以可以使用Object类的hashCode方法
Person p1 = new Person() ;
int h1 = p1.hashCode();
System.out.println(h1);
Person p2 = new Person() ;
int h2 = p2.hashCode();
System.out.println(h2);
}
}
▶ HashSet集合存储数据的结构 --- 哈希表(哈希表的特点:速度快)
jdk1.8版本之前 : 哈希表 = 数组+链表
jdk1.8版本之后 : 哈希表 = 数组+链表
哈希表 = 数组+红黑树(提高查询速度)
【 什么时候用红黑树呢?如果链表的长度超过了8位,则会把链表转换为红黑树以提高查询速度 】
数组结构:把元素进行分组(相同哈希值的元素一组)
链表 / 红黑树结构:把相同哈希值的元素连接到一起
▶ Set集合存储元素不重复的原理
前提:存储的元素必须重写hashCode方法和equals方法
具体说明:
Set集合在调用add方法的时候,add方法会调用元素的hashCode方法和equals方法,判断元素是否重复
---> add方法会调用s1的hashCode方法,计算字符串“abc”的哈希值,哈希值是96354,在集合中找有没有96354这个哈希值的元素,发现没有,就会把s1存储到集合中。
---> add方法会调用s2的hashCode方法计算字符串“abc”的哈希值,哈希值是96354,在集合中找有没有96354这个哈希值的元素,发现有(哈希冲突),则s2会调用equals方法和哈希值相同的元素进行比较,s2.equals(s1)返回true,两个元素的哈希值相同,equals方法返回true则说明两个元素相同,这样就不会把s2存储到集合中。
---> add方法会调用“重地”的hashCode方法计算字符串的哈希值,哈希值是1179395,在集合中找有没有1179395这个哈希值的元素,发现没有,就会把“重地”存储到集合中。
---> add方法会调用“通话”的hashCode方法计算字符串的哈希值,哈希值是1179395,在集合中找有没有1179395这个哈希值的元素,发现有(哈希冲突),“通话”会调用equals方法和哈希值相同的元素进行比较,“通话”.equals(“重地”)返回false,两个元素的哈希值相同,equals方法返回false则说明两个元素不同,就会把“通话”存储到集合中。
▶ HashSet 存储自定义类型元素
set集合报错元素唯一:存储的元素(String,Integer,...,Student,Person,...)必须重写hashCode方法和equals方法
要求:同名同年龄的人视为同一个人,只能存储一次
▶ LinkedHashSet 集合
java.util.LinkedHashSet集合 extends HashSet集合
LinkedHashSet集合特点:底层是一个哈希表(数组+链表/红黑树)+链表 ----- 多了一条链表(记录元素的存储顺序,保证元素有序)
▶ 可变参数
可变参数是 jdk1.5 之后出现的新特性
可变参数使用前提:当方法的参数列表数据类型已经确定,但是参数的个数不确定就可以使用可变参数
使用格式:定义方法时使用
修饰符 返回值类型 方法名(数据类型...变量名){ }
可变参数的原理:可变参数的底层就是一个数组,根据传递参数个数不同,会创建不同长度的数组,来存储这些参数,传递的参数的个数可以是 0个(不传递)、1、2、...、多个
可变参数的注意事项:
(1)一个方法的参数列表只能有一个可变参数
(2)如果方法的参数有多个,那么可变参数必须写在参数列表的末尾
本文地址:https://blog.csdn.net/Learning_xzj/article/details/109608564
推荐阅读