• java基础笔记(10)----集合之set集合


    1. set接口特点:
      1. 存储任意Object元素
      2. 无序,无下标,元素内容不可以重
    2. 方法:
      1. 继承父接口Collection中的所有方法
    3. 遍历:
      1. 有两种遍历方法,foreach遍历和迭代遍历

        forEach遍历

    Set<Object> set = new HashSet<Object>();

    for (Object obj: set) {

    if(obj instanceof Integer){

    int aa= (Integer)obj;

    }else if(obj instanceof String){

    String aa = (String)obj

    }

    }

     

    迭代遍历

     

    Set<String> set = new HashSet<String>();  
    
    Iterator<String> it = set.iterator();  
    
    while (it.hasNext()) {  
    
      String str = it.next();  
    
      System.out.println(str);  
    
    }  
    

     

    1. 实现类:
      1. HashSet

        为了保证hashset中自定义类型的对象,内容相同 拒绝加入集合,解决方案:

        第一步:覆盖hashCode方法

        确保相同的对象 返回 相同的hashCode值。

        为了提高效率 尽量保证只有相同的对象 才拿到相同的hashCode值。

        通常,所有属性进行拼接形成int值,如果是引用类型 则调用其hashCode方法。

        @Override

        public int hashCode() {

            final int prime = 31;

            int result = 1;

            result = prime * result + age;

            result = prime * result + ((clazz == null) ? 0 : clazz.hashCode());

            result = prime * result + ((name == null) ? 0 : name.hashCode());

            return result;

        }

     

    第二步:覆盖equals方法

    对象的hashCode值相同时,才会调用equals方法,如果内容相同返回true,代表当前对象是重复对象,应该 被拒绝加入集合。

     

        @Override

        public boolean equals(Object obj) {

            if (this == obj)

                return true;

            if (obj == null)

                return false;

            if (getClass() != obj.getClass())

                return false;

            Student other = (Student) obj;

            if (age != other.age)

                return false;

            if (clazz == null) {

                if (other.clazz != null)

                    return false;

            } else if (!clazz.equals(other.clazz))

                return false;

            if (name == null) {

                if (other.name != null)

                    return false;

            } else if (!name.equals(other.name))

                return false;

            return true;

        }

     

    1. hashset的特点:
      1. 底层使用数据结构的hash算法实现的,因此具有很好的存取,查找的性能。
      2. hashSet是线程不安全,所以它相对于线程安全的更快一些。 
      3. hashSet值可以为null。
      4. 不存在顺序
    2. TreeSet

      实现了SortedSet接口(是Set的子接口)

      注意:集合元素如果是自定义类型,该类型必须实现java.lang.Comparable接口。

    3. TreeSet的特点:
      1. 底层使用数据结构红黑树算法进行维护的,因此它的性能相对hashset来说,更差一些,因为它内部会自动进行排序操作。
      2. TreeSet也是线程不安全
      3. 排序分为自然排序和定制排序,自然排序是treeset内部会对add进来的值进行自动排序,定制排序可以对排序的条件进行限制。
    1. 总结:
      1. 以上写了一些set集合的基本用法,以及set集合的常用实现类
      2. 注意 hashset, treeset都是线程不安全的,所以要保证线程安全,要使用collections下面的syschronizedSet来进行同步操作。
  • 相关阅读:
    线性dp
    Python3.6.5编译报错 configure: error: no acceptable C compiler found in $PATH
    hadoop伪分布式安装流程
    hadoop需要修改的配置文件
    Linux 免密登录和配置环境变量
    虚拟机修改主机名
    Netty自定义解码器
    Java 操作KafKa API
    Mysql分表:Merge
    CentOS7虚拟机配置ip地址
  • 原文地址:https://www.cnblogs.com/lvsling/p/8470801.html
Copyright © 2020-2023  润新知