Set接口的常见实现:HashSet TreeSet LinkedHashSet

Set
特点:
元素是不能重复的 (只能有一个null 判断元素是否重复的标准 equals)
元素是无序的
Set接口的常用方法:
使用同Collection
Set接口的常见实现:HashSet TreeSet LinkedHashSet

public static void main(String[] args) {
     
    //创建一个Set集合
    Set set = new HashSet();
    //存入元素
    set.add("java");
    set.add("html");
    set.add("mysql");
    set.add("oracle");
    //遍历集合
    //使用增强for来遍历
    for(Object  obj : set){
     
        System.out.println(obj);
    }
}


遍历的结果
Set接口的常见实现:HashSet TreeSet LinkedHashSet_第1张图片
Set接口的常见实现:HashSet TreeSet LinkedHashSet_第2张图片
使用迭代器迭代

  //使用迭代器遍历
Iterator iter =  set.iterator();
  while(iter.hasNext()){
     
      Object obj = iter.next();
      System.out.println(obj);
  }

Set集合的典型实行:
HashSet
特点: 1.底层数据结构的实现:哈希表
2.线程不同步
3.不保证元素的迭代顺序和存入顺序的一致性。
4.元素不能重复
哈希表:
哈希值:是jdk根据对象的 地址或者字符串或者数字计算得出的int类型的数值
获取对象的哈希值的方法:Object类提供

哈希值的特点:
1 同一对象多次获取的hashCode值总是相同的
2 不同对象的hashCode值肯定是不同的。
3 在自定义类中 需要重写hashCode方法 来保证每一个对象的hash值是独有的

public static void main(String[] args) {
     
    // 同一对象的hashCode值 是相同的 ,不同对象的hashCode值是不同的
    //在特殊情况下, 可以通过重写hashCode来实现不同对象返回相同的哈希值
    Student stu = new Student("张三",22);
    System.out.println(stu.hashCode());
    System.out.println(stu.hashCode());
    Student stu1 = new Student("李四",23);
    System.out.println(stu1.hashCode());
    //特殊情况
    System.out.println("---------------------------");
    System.out.println("hello".hashCode());
    System.out.println("world".hashCode());
    System.out.println("java".hashCode());
    System.out.println("hello".hashCode());
    System.out.println("---------------------------");
    System.out.println("通话".hashCode());//1179395
    System.out.println("重地".hashCode());//1179395 在计算hashCode值的时候 有可能不同的对象返回相同的hanshCode
    System.out.println("通话".equals("重地"));
    //不同对象的equals返回false  但是他们的hashCode值 有可能相同
}


HashSet的底层是借助于HashMap(hash表)实现
HashSet 的初始容量是16 默认的负载因子是0.75
1 HashSet是如何保证元素是不可重复的
Set接口的常见实现:HashSet TreeSet LinkedHashSet_第3张图片
1 存储在hashSet中的对象 在hashSet中具体的存储位置是由对象的hashCode值计算所得
2.存储方式的模拟解释
Set接口的常见实现:HashSet TreeSet LinkedHashSet_第4张图片
3. 判断元素是否重复 :是hashCode值相同且equals方法返回true 此时才会认定这两个对象重复

HashSet集合存储元素,元素不能重复的保障:
元素的唯一性:重写对象类的equals和hashCode 同时当hashCode方法返回相同的hash值 且equals返回true 此时才会认定这两个元素是重复的。
LinkedHashSet
特点:底层实现是哈希表和链表的实现。具有可预知的迭代次序
元素是有序的 (有序是由链表保障的)
元素也是不可重复的(哈希表保障了唯一性)
此实现不同步

public static void main(String[] args) {
     
    LinkedHashSet lhs = new LinkedHashSet();
    lhs.add("hello");
    lhs.add("world");
    lhs.add("java");
    lhs.add("world");
    lhs.add(null);
    for(Object obj : lhs){
     
        System.out.println(obj);
    }
}


Set接口的常见实现:HashSet TreeSet LinkedHashSet_第5张图片

你可能感兴趣的:(java,set)