java 集合Set_List_Map

java 集合主要有三类:set、list、map
在这里插入图片描述
set:只是简单地将不相同元素添加到集合中,没有顺序可言。对象相同的本质是对象的 hashCode值是否相等。

  • HashSet
    HashSet 按 hash 算法来存储集合中的元素,因此具有很好的存取和查找性能;HashSet 不能保证元素的排列顺序,并且元素的顺序可能与添加的顺序是不一样的。因为元素的存取是通过计算 hash 值来处理的。如果 hashCode 相同且 equals 相等,那么 HashSet 就会认为该元素是同一个元素。
    HashSet 通过 hashCode 来确定元素在集合中的位置,一个 hashCode 上可以存放多个元素。

  • TreeSet
    TreeSet 使用二叉树的原理对新添加的对象按照指定的顺序进行排序,每次添加一个元素,都会进行排序,将新元素添加到指定的位置。
    而自定义的对象必须实现 Comparable 接口,复写 compareTo 函数,才能正常的使用 TreeSet。
    比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整
    数、零或正整数

list:代表一个元素有序、元素可重复的集合。

  • ArrayList
    ArrayList 内部是通过数组来实现的,它可以对元素进行快速的随机访问。动态插入与删除时需要对数组中的元素进行复制、移动,代价比较大。当添加的元素超过了数组的长度时,就要将已有的数据复制到新的存储空间中。因此 ArrayList 适合随机查找而不适合插入和删除。

  • Vector
    Vector 与 ArrayList 都是依靠数组来实现的,它们之间的区别仅仅是 ArrayList 是非线程安全的,Vector 是线程安全的。

  • LinkedList
    LinkedList 采用的是链表结构存储数据,适合动态的插入与删除。但是随机访问的速度比较慢。一般是当做堆栈、队列和双向队列使用。

因此在需要频繁读取集合中的元素时,推荐使用 ArrayList,如果是插入和删除较多时,推荐是用 LinkedList。
在这里插入图片描述
map:用于保存具有映射关系的数据。<key,value>

  • HashMap
    HashMap 根据键的 hashCode 值存储数据,大部分可以直接定位到它的元素值,因而具有很快的访问速度,但是遍历元素却不确定。HashMap 最多只允许一条记录 <key,value> 的 key 为 null。 HashMap 是非线程安全的,如果多线程同时写 HashMap,将会导致数据不一致。
    在 java8 中,HashMap 进行了部分修改,最大的不同就是利用了红黑树,所有在 Java8 中 HashMap 由 “数组+链表+红黑树” 组成。在 java8 中,当链表的元素超过了 8 个,那么链表就会转化成红黑树。

如图是 HashMap 的结构,横着的每一个实心方块组成了一个 table 数组,每个实心方块代表了一个Entry。Map 进行 put 操作时,会先进行 hash(key),如果 Map 中有与之相等的 hash(key),就将其以链表的方式添加到 map 中;如果不存在相等 hash(key),那么需要在 tbale 数组中添加一个新的 Entry。 也就是说:hash(key) 不存在相同的,就在 table 数组中新增 Entry。如果 hash(key) 存在相等的,那么就在相同 hash(key) 的数组后面添加 Entry,这个添加是以链表的形式存在的。就是 “数组+链表”。

在 java8 中,当链表的元素超过 8 个,那么就将链表转化为红黑树来进行存储。形成了 “数组+红黑树”

如果 hash(key) 中都是相同的 key,那么就需要 value 覆盖原始值。

Map.put -> hash(key).equals ? ( key.equals?overwrite value : add LinkedList) : add Array数组;
在这里插入图片描述

  • ConcurrentHashMap
    ConcurrentHashMap 与 HashMap 的区别是 HashMap 是非线程安全的,ConcurrentHashMap 是线程安全的。

  • TreeMap
    TreeMap 是实现了 SortedMap 接口,能够把它保存的记录根据键排序,默认是按键值的升序排列。如果使用排序的映射,建议使用 TreeMap。

猜你喜欢

转载自blog.csdn.net/dec_sun/article/details/92783640