Set集合
中的子类:
java.util.HashSet
java.util.LinkedHashSet
Set集合
的特点:
不能存储重复的元素;
元素没有索引,没有带索引的方法也不能使用普通的for循环遍历。
tips:Set集合
元素的遍历取出方法是使用迭代器Iterator和增强for循环。
(一)HashSet类
存储元素:无序,不可重复;
底层是java.util.HashMap
根据对象的哈希值来确定元素在集合中的存储位置
(良好的存取与查找功能)
保证元素唯一性的方式依赖于:HashCode
与equals
方法。
哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,这是一个逻辑地址,是模拟出来的地址,不是数据直接存储的物理地址)。
在Object类
中有一方法可以获得对象的哈希值。
hashCode() int //返回对象的哈希值
hashCode()
方法的源码:
public native int hashCode();//native:代表该方法调用的是本地操作系统的方法
toString()
方法返回值源码:
return getClass().getName()+”@”+Integer.toHexString(hashCode());
String类
重写了Object类
的hashCode方法
;
” 重地”,”通话”
两个字符串的哈希值都是1179395,但两个字符串不同,这就是哈希冲突。
HashSet
存储数据的结构(哈希表):
jdk1.8
版本之前:
哈希表 = 数组 + 链表;
jdk1.8
版本之后:
哈希表 = 数组 + 链表;
哈希表 = 数组 + 红黑树(提高查询速度)。
Set
集合存储元素不会重复的原理:
Set
集合在调用add
方法时,add
方法会调用元素的hashCode
方法和equals
方法,判断元素是否重复。
HashSet
存储自定义类型的元素:必须重写对象中的hashCode
和equals
方法,建立自己的比较方法,才能保证HashSet
集合中的对象唯一(自动重写)。
(二)LinkedHashSet集合
该集合是继承了HashSet
集合;
底层是一个哈希表(数组+链表/红黑树)+链表(又加上一条链表,用来记录元素的存储顺序,保证元素有序)。
该集合存储和取出元素顺序是一样的。
(三)可变元素
jdk1.5之后的新特性;
使用前提:当方法的参数列表数据类型已经确定,但是参数的个数不确定,就可使用可变参数;
使用格式:定义方法时使用。
修饰符 返回值类型 方法名(数据类型…变量名){}
可变参数的原理:
可变参数底层是一个数组,根据传递参数的个数(0个到多个)不同,会创建不同长度的数组,来存储这些参数。(计算器计算几个数的和)。
注意:一个方法的参数列表,只能有一个可变参数;
如果方法的参数有多个,那么可变参数必须写在参数列表的末尾。
可变参数的特殊(终极)写法:
public static void method (Object…obj){};