zoukankan      html  css  js  c++  java
  • Java集合

    Java的集合类是一种特别强大的工具类,它可以用于存储数量不等的多个对象,并可以实现常用的数据结构,栈、队列等。Java集合还可以用于保存具有映射关系的关联数组。Java集合大致可分为:Set,List和Map三种体系,其中Set代表无序、不可重复的集合;List代表有序,重复的集合;而Map则代表具有映射关系的集合。从JDK1.5以后,Java又增加了Queue体系集合,代表一种队列集合。Java集合就像一种容器,可以把多个对象放在容器里。集合类和数组不一样,数组元素既可以是基本类型,也可以是对象,而集合里只能保存对象。Java的集合类主要由两个接口派生:Collection和Map. 

    Iterator也是Java集合框架的成员,主要用于遍历(迭代访问)Collection集合中的元素,Iterator对象也被称为迭代器。遍历Collection中的元素还可以用foreach循环。

    一、Set接口不允许包含相同的元素,Set判断两个对象相同使用equals方法。除了这一点,几乎和Collection本身是一样的。

      1,HashSet类

      HashSet是Set接口的典型实现,大多数时候使用Set集合时是使用这个实现类。HashSet按Hash算法储存集合中的元素,因此具有很好的存取和查找性能。当向HashSet存入一个元素,HashSet会调用该对象的hashCode()方法来得到该对象的存放位置(hashCode值)。因此HashSet判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。因此,要把一个元素放入HashSet中,如果重写equals()方法,也应重写hashCode()方法。

      重写hashCode()的规则:当两个对象通过equals方法比较返回true时,这两个对象的hashCode应该相等;对象中用作equals比较标准的属性,都应该用来计算hashCode值。

    boolean hashCode=(?0:1)
    整形(byte,short,char,int)   hashCode=(int)f
    long hashCode=(int)(f^(f>>>32))
    float hashCode=Float.floatToIntBit(f)
    double

    hashCode=Double.doubleToLongBits(f)

    hashCode=(int(f^(f>>>32))

    普通引用类型 hashCode=f.hashCode()

      HashSet具有以下的特点:

        不能保证元素的排列顺序

        HashSet不是同步的,如果多个线程同时访问一个HashSet,如果有2条或2条以上的线程同时修改了HashSet集合时,必须通过代码来保证其同步。

        元素集合值可以是null

      当向HashSet中添加可变对象时,如果修改HashSet集合的对象,有可能导致该对象与集合中其他对象相等,导致HashSet无法准确访问该对象。  

      2,LinkedHashSet是HashSet的一个子类,也是根据hashCode值来决定元素的储存位置,但它同时使用链表维护元素的次序。

      3,TreeSet类

        TreeSet是SortedSet接口的唯一实现,可以保证集合元素处于排序状态。TreeSet支持两种排序,自然排序和定制排序,默认情况采用自然排序。

        自然排序:TreeSet会调用集合元素的compareTo(Object obj)方法来比较,然后将集合元素升序排列。

        如果试图把一个对象添加进TreeSet,则该对象必须实现Comparable接口,否则会抛出ClassCastException。而且向TreeSet中添加的应该是同一个类的对象,否则也会引发ClassCastException。

        定制排序,实现Comparator接口

      推荐HashSet和TreeSet放不可变对象。

    二、List与ListIterator接口

      List是有序的集合。ArrayList和Vector作为List类的两个经典实现。

      ArrayList是线程不安全的,Vector是线程安全的,因此Vector的性能比ArraList要低。

      

    stay hungry,stay foolish.
  • 相关阅读:
    php7与其他版本共存
    centos源码安装mysql5.7
    禁用composer update命令
    lumen怎么得到当前Uri的控制器、Action、路由规则
    配置lumen的log为daily模式
    laravel如何打印orm封装的sql语句
    nginx 重写URL尾部斜杠
    Laravel的Nginx重写规则--让路由支持末尾加斜线
    laravel redis存数组并设置过期时间
    openresty
  • 原文地址:https://www.cnblogs.com/ifree-x/p/5378844.html
Copyright © 2011-2022 走看看