Set接口中的方法和Collection中的方法一样
特点: 1.无索引 2.不可重复 研究如何保证元素唯一的
HashSet线程不安全,不同步,但是效率高 无序: 不保证存入和取出元素的顺序是一致的
LinkedHashSet 有序: 保证存入和取出元素的顺序是一致的
Set<Integer> set = new HashSet<>();
System.out.println(set);
hashCode(): 返回该对象的哈希码值,就是一个int数字
注意: 同一对象,多次调用hashCode方法,要保证获取到的哈希值是相同的
只要new创建对象,获取到的哈希值就是不同的
根据字符串内String覆盖重写了Object类中的hashCode方法 按照一定算法(存在漏洞)获取哈希值
1.哈希值不同,能否说明内容一定不同? 肯定的,必须的
2.哈希值相同,能否说明内容一定相同? 不能的
再继续调用equals方法 返回false: 内容不相同 返回true: 内容相同
public class Demo04HashCode {
public static void main(String[] args) {
Object obj1 = new Object();
int h1 = obj1.hashCode();
System.out.println(obj1.toString());
char[] chs = {'a','b','c'};
String s1 = new String(chs);
System.out.println(s1.hashCode());
}
}
HashSet集合存储对象所属的类要覆盖重写hashCode方法和equals方法
HashSet<String> set = new HashSet<>();
System.out.println("abc".hashCode());
HashSet存储自定义对象
HashSet集合存储元素的过程
1.计算哈希值,使用哈希值%数组长度,计算在数组中存储的索引
2.判断该索引下是否有元素
3.没有元素: 直接存储
4.如果有元素: 调用equals方法 true: 不存储 false: 存储
*/
LinkedHashSet集合-- 有序,无索引,不可重复
LinkedHashSet集合保证元素唯一: 依赖hashCode方法和equals方法
LinkedHashSet集合存储对象所属的类要覆盖重写hashCode方法和equals方法