37-7Set集合

77 阅读2分钟
 Set接口中的方法和Collection中的方法一样
  特点: 1.无索引    2.不可重复   研究如何保证元素唯一的
 HashSet线程不安全,不同步,但是效率高 无序: 不保证存入和取出元素的顺序是一致的
 LinkedHashSet  有序: 保证存入和取出元素的顺序是一致的
  Set<Integer> set = new HashSet<>();
          System.out.println(set);//证明: 无序,不可重复(唯一)
        //set.get(0);//证明: 没有索引
 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方法