zoukankan      html  css  js  c++  java
  • 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来进行同步操作。
  • 相关阅读:
    linux环境下时区无法设置(UTC无法更改为CST)的问题解决
    SUSE12 网卡配置、SSH远程配置、解决CRT密钥交换失败,没有兼容的加密程序
    SUSE12 操作系统安装
    Unity技术支持团队性能优化经验分享
    基于unity3d游戏的android版本逆向初探
    Unity手游引擎安全解析及实践
    盛大游戏技术总监徐峥:Unity引擎使用的三种方式
    基于Unity 5的次世代卡通渲染技术 -- Unite 2017 米哈游总监贺甲分享实录
    欢乐互娱庞池海:《龙之谷》项目性能优化经验分享
    ue4 htcvivi简单配置
  • 原文地址:https://www.cnblogs.com/lvsling/p/8470801.html
Copyright © 2011-2022 走看看