HashSet集合、哈希值
HashSet集合
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
HashSet集合继承了C ollection接口
set接口的特点:
不允许重复元素,
没有索引,没有带索引的方法,也不能使用普通的for循环
HashSet集合的特点:
不允许有重复的元素
没有索引,没有带索引的方法,也不能使用普通的for循环
是一个无序集合,存储元素和取出元素可能不一致
底层是一个hash表结构(查询快)
案例:
public static void main(String[] args) {
HashSet<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
// 迭代器遍历集合
Iterator<Integer> iterator = set.iterator();
while (iterator.hasNext()){
Integer next = iterator.next();
System.out.println(next);
}
// 使用增强for循环
for (Integer integer : set) {
System.out.println(integer);
}
}
}
哈希值
哈希值:是一个十进制的整数,有系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来的地址,不是数据实际储存地址)
在Object类中有一个方法,可以来获取对象的哈希值
int hashCode()返回对象的哈希码值
hashCode()方法的源码:
public native int hashCode();
native:代表方法调用是本地操作系统的方法
案例:
public class HaSh {
public static void main(String[] args) {
HashSet1 hashSet1 = new HashSet1();
int i = hashSet1.hashCode();
// 打印地址值
System.out.println(i);
// 我们前面学到的 toString 其实也是HashCode的方法 我来看看源码
// public int hashCode() {
// return Integer.hashCode(value);
// }
}
}
如果我们重写hashCode方法
public class HashSet1 {
@Override
public int hashCode() {
return 111;
}
然后在来看返回值