概述
特点 :
- 没有索引,没有带有索引的方法,也不能使用普通for
- 不允许存储重复的元素
HashSet实现类
特点:
- 不允许存储重复的对象
- 没有索引,没有带有索引的方法,也不能使用普通for
- 是一个无序的集合,存储和取出顺序可能不一致
- 底层是一个哈希表结构(查询速度非常快)
public static void main(String[] args) {
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
//使用迭代器遍历
Iterator<Integer> itr = set.iterator();
while(itr.hasNext()){
Integer i = itr.next();
System.out.println(i);
}
System.out.println("-----------");
//增强for
for (Integer n : set) {
System.out.println(n);
}
}
哈希值
是一个十进制的整数,由系统随机给出(对象地址值,是一个逻辑地址)
Object类中有一个方法,可以获取对象的哈希值(HashCode方法)
HashSet存储方式是哈希表
jdk1.8之前 哈希表=数组+链表
jdk1.8之后 哈希表=数组+链表 | 哈希表=数组+红黑树(提高查询速度)
两个元素不同,哈希值相同,称为哈希冲突(重地 和 通话)
链表的长度超过8位 就会转换为红黑树
Set存储元素不重复原理
Set集合再调用add方法时候,add方法会调用元素的hashCode方法和equals方法 判断元素是否重复
例如:set.add(“abc”);
add方法会调用"abc"的hashCode方法。计算字符串的哈希值,哈希值是9354
在集合中找有没有96354这个哈希值元素,表现没有
就会把abc存储到集合中
如果出现哈希冲突 就会调用equals方法进行比较,就认定两元素相同
Set集合保存元素唯一:必须重写hashCode方法和equals方法
LinkedHashSet
底层:哈希表(数组+链表/红黑树)+链表实现,链表(记录元素的存储顺序)保证元素有序
public static void main(String[] args) {
LinkedHashSet linked = new LinkedHashSet();
linked.add("a");
linked.add("b");
linked.add("c");
linked.add("c");
System.out.println(linked);//a b c
}
可变参数
在JDK1.5之后出现的新特性
使用前提:
- 当方法的参数列表数据类型已经确定,参数个数不确定,就可以使用
使用格式:定义方法时使用
- 修饰符 返回值类型 方法名(数据类型…变量名)
原理:
- 底层是个数组 根据不同个数,创建不同长度数组 来传递值
- 传递参数个数 可以是0个(不传递) 1,2…多个
public static void main(String[] args) {
int i = add(0,1,2,3,4);
System.out.println(i);//10
}
public static int add(int...arr){
//记录累加
int sum = 0;
//遍历数组
for(int i : arr){
sum+=i;
}
return sum;
}
注意事项:
- 一个列表只能有一个可变参数
- 参数有多个的话,可变参数要在后面