精华内容
下载资源
问答
  • hashMap和treeMap区别

    2021-03-28 14:51:29
    hashMap和treeMap区别 参考网址: https://mp.weixin.qq.com/s/tHaw9w8h8buyjRx21XzB8g 提出问题 如何决定使用 HashMap 还是 TreeMap? hashMap和treeMap简介 TreeMap<K,V>的Key值是要求实现java.lang....

    hashMap和treeMap区别

    参考网址:

    https://mp.weixin.qq.com/s/tHaw9w8h8buyjRx21XzB8g

    提出问题

    如何决定使用 HashMap 还是 TreeMap?

    hashMap和treeMap简介

    TreeMap<K,V>的Key值是要求实现java.lang.Comparable,所以迭代的时候TreeMap默认是按照Key值升序排序的;TreeMap的实现是基于红黑树结构。适用于按自然顺序或自定义顺序遍历键(key)。

    HashMap<K,V>的Key值实现散列hashCode(),分布是散列的、均匀的,不支持排序;数据结构主要是桶(数组),链表或红黑树。适用于在Map中插入、删除和定位元素。

    HashMap 和 TreeMap 的实现

    **HashMap:**基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()equals()[可以重写hashCode()equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。

    • HashMap(): 构建一个空的哈希映像
    • HashMap(Map m): 构建一个哈希映像,并且添加映像m的所有映射
    • HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映像
    • HashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的哈希映像

    **TreeMap:**基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。

    • TreeMap():构建一个空的映像树
    • TreeMap(Map m): 构建一个映像树,并且添加映像m中所有元素
    • TreeMap(Comparator c): 构建一个映像树,并且使用特定的比较器对关键字进行排序
    • TreeMap(SortedMap s): 构建一个映像树,添加映像树s中所有映射,并且使用与有序映像s相同的比较器排序

    HashMap 和 TreeMap 都是非线程安全

    HashMap继承AbstractMap抽象类,TreeMap继承自SortedMap接口。

    **AbstractMap抽象类:**覆盖了equals()和hashCode()方法以确保两个相等映射返回相同的哈希码。如果两个映射大小相等、包含同样的键且每个键在这两个映射中对应的值都相同,则这两个映射相等。映射的哈希码是映射元素哈希码的总和,其中每个元素是Map.Entry接口的一个实现。因此,不论映射内部顺序如何,两个相等映射会报告相同的哈希码。

    **SortedMap接口:**它用来保持键的有序顺序。SortedMap接口为映像的视图(子集),包括两个端点提供了访问方法。除了排序是作用于映射的键以外,处理SortedMap和处理SortedSet一样。添加到SortedMap实现类的元素必须实现Comparable接口,否则您必须给它的构造函数提供一个Comparator接口的实现。TreeMap类是它的唯一一个实现。

    TreeMap中默认是按照升序进行排序的,如何让他降序

    通过自定义的比较器来实现

    定义一个比较器类,实现Comparator接口,重写compare方法,有两个参数,这两个参数通过调用compareTo进行比较,而compareTo默认规则是:

    • 如果参数字符串等于此字符串,则返回 0 值;
    • 如果此字符串小于字符串参数,则返回一个小于 0 的值;
    • 如果此字符串大于字符串参数,则返回一个大于 0 的值。

    自定义比较器时,在返回时多添加了个负号,就将比较的结果以相反的形式返回,代码如下:

    static class MyComparator implements Comparator{
        @Override
        public int compare(Object o1, Object o2) {
            // TODO Auto-generated method stub
            String param1 = (String)o1;
            String param2 = (String)o2;
            return -param1.compareTo(param2);
        }   
    }
    

    之后,通过MyComparator类初始化一个比较器实例,将其作为参数传进TreeMap的构造方法中:

    MyComparator comparator = new MyComparator();
    
    Map<String,String> map = new TreeMap<String,String>(comparator);
    

    这样,我们就可以使用自定义的比较器实现降序了

    public class MapTest {
    
        public static void main(String[] args) {
            //初始化自定义比较器
            MyComparator comparator = new MyComparator();
            //初始化一个map集合
            Map<String,String> map = new TreeMap<String,String>(comparator);
            //存入数据
            map.put("a", "a");
            map.put("b", "b");
            map.put("f", "f");
            map.put("d", "d");
            map.put("c", "c");
            map.put("g", "g");
            //遍历输出
            Iterator iterator = map.keySet().iterator();
            while(iterator.hasNext()){
                String key = (String)iterator.next();
                System.out.println(map.get(key));
            }
        }
    
        static class MyComparator implements Comparator{
    
            @Override
            public int compare(Object o1, Object o2) {
                // TODO Auto-generated method stub
                String param1 = (String)o1;
                String param2 = (String)o2;
                return -param1.compareTo(param2);
            }
    
        }
    
    }
    

    结论

    如果你需要得到一个有序的结果时就应该使用TreeMap(因为HashMap中元素的排列顺序是不固定的)。除此之外,由于HashMap有更好的性能,所以大多不需要排序的时候我们会使用HashMap。

    展开全文
  • HashMap和TreeMap区别

    2018-03-13 15:59:19
    HashMap:数组方式存储key/value,线程非安全,允许null作为keyvalue,key不可以重复,value允许重复,不保证元素迭代顺序是按照插入时的顺序,key的hash值是先计算key的hashcode值,然后再进行计算,每次容量扩容...
    HashMap:数组方式存储key/value,线程非安全,允许null作为key和value,key不可以重复,value允许重复,不保证元素迭代顺序是按照插入时的顺序,key的hash值是先计算key的hashcode值,然后再进行计算,每次容量扩容会重新计算所以key的hash值,会消耗资源,要求key必须重写equals和hashcode方法

    默认初始容量16,加载因子0.75,扩容为旧容量乘2,查找元素快,如果key一样则比较value,如果value不一样,则按照链表结构存储value,就是一个key后面有多个value;

    TreeMap:基于红黑二叉树的NavigableMap的实现,线程非安全,不允许null,key不可以重复,value允许重复,存入TreeMap的元素应当实现Comparable接口或者实现Comparator接口,会按照排序后的顺序迭代元素,两个相比较的key不得抛出classCastException。主要用于存入元素的时候对元素进行自动排序,迭代输出的时候就按排序顺序输出
    展开全文
  • Hashtable、HashMap和TreeMap Java集合框架中,有两个主要接口:  ~Collection接口:含List和Set子接口;  ~Map接口。 Collection和Map接口之间主要区别是:Collection中存储一组对象,而Map存储键/值对。 ...

    Hashtable、HashMap和TreeMap

    Java集合框架中,有两个主要接口:
          ~Collection接口:含List和Set子接口;
          ~Map接口。
    Collection和Map接口之间主要区别是:Collection中存储一组对象,而Map存储键/值对。
    Hashtable对象把键对象映射到值对象,提供基于键搜索值得快速查找方法。
    HashMap提供优于Hashtable的性能,可以进行同步化。
    Hashtable和HashMap区别:
          ~Hashtable是Dictionary的子类,HashMap是Map的实现类。
          ~Hashtable中的方法是同步的,而HashMap中的方法默认情况下是非同步的,在多线程应用程序中,不用专门的操作就可以安全的使用Hashtable;而对于HashMap,则需要额外的同步机制。但HashMap的同步问题可以通过Collections的一个静态方法得到解决:Map Collections.synchronizedMap(Map m)。
          ~在HashMap中,可以将null作为键值,但只能有一个,可以有一个或者多个键所对应的值为null。当用get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此在HashMap中应该用containsKey()方法来判断。

           TreeMap实现了Map接口,并把元素存储在树中,在操作上需要比HashMap更多一些开销,但它能够返回排序的值。如果没有按照键顺序提取Map元素的需求,那么HashMap是更实用的结构。


    展开全文
  • JDK1.8 HashMap和TreeMap区别,读懂这一篇就够了

    千次阅读 多人点赞 2019-06-18 11:45:24
    刚刚被问到HashMap和TreeMap 有什么区别,想了想,就整理一下吧. 1.数据结构 HashMap: 数组+列表+红黑树 TreeMap: 红黑树 2. 因为数据结构,导致节点的实体类不一样 HashMap: 两种 Node 和 TreeNode (支持...

     

    刚刚被问到HashMap和TreeMap 有什么区别,想了想,就整理一下吧.

     

    1.数据结构

    HashMap: 数组+列表+红黑树

    TreeMap: 红黑树

     

    2. 因为数据结构,导致节点的实体类不一样

    HashMap: 两种 Node 和 TreeNode (支持链表)

    static class Node<K,V> implements Map.Entry<K,V> {
            final int hash;
            final K key;
            V value;
            Node<K,V> next;
    }

     

     static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> {
            TreeNode<K,V> parent;  // red-black tree links
            TreeNode<K,V> left;
            TreeNode<K,V> right;
            TreeNode<K,V> prev;    // needed to unlink next upon deletion
            boolean red;
            TreeNode(int hash, K key, V val, Node<K,V> next) {
                super(hash, key, val, next);
            }
    
     }

     

     

     

    TreeMap: (只是红黑树,不支持链表操作)

    static final class Entry<K,V> implements Map.Entry<K,V> {
            K key;
            V value;
            Entry<K,V> left;
            Entry<K,V> right;
            Entry<K,V> parent;
            boolean color = BLACK;
    }

     

    3.数据范围

    数据结构不一样,所以数据结构的范围,完全没有可比性

    HashMap:

    默认数组长度: 16

    数组最大长度: 2^30

    扩容因子: 0.75f

    列表转红黑树阈值: 8

    红黑树转列表阈值: 6

    列表转红黑树最小数组长度: 64

    TreeMap:

    没发现有范围控制

     

    4. 线程安全

    都不是线程安全的

     

     

    5. KEY 和 Value 限制

     

    HashMap: Key和 Value 都可以为 null      ( 如果key 为 null 的话, hashCode = 0   )

    TreeMap: Key 不能为 null , Value 可以为 null

    HashTable: Key 不能为 null , Value 不能为 null

    LinkedHashMap: 由 HashMap实现, 同HashMap

     

    6.实现接口

     

    HashMap:

                  

    public class HashMap<K,V> extends AbstractMap<K,V>
        implements Map<K,V>, Cloneable, Serializable {

    TreeMap:  (多实现 NavigableMap 接口)

    public class TreeMap<K,V>
        extends AbstractMap<K,V>
        implements NavigableMap<K,V>, Cloneable, java.io.Serializable

     

    7. 定位

    HashMap:

          通过 hash 算法定位, 针对 hash 冲突的值, 采用列表和红黑树的方式存储, 一定条件下可以相互转换. 红黑树中, 如果 hash 值一样,是通过 key 的 比较方法(可自定义)来计算红黑树所处的位置. 比如 String 类型的Key 是通过 String 类里的 compareTo 方法,直接返回 第一个不同字符的差值.来进行红黑树定位.

    TreeMap:

    红黑树存储结构, 通过自定义 key 比较器或者默认的比较算法来进行定位红黑树节点的存储位置.
     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • ConcurrentHashMap集合了hashmap和hashtable 这两张表的优势: hashtable 每次操作都会锁住真个结构 ConcurrentHashMap 锁的方式是稍微细粒度 把数据分为了16个桶,每次get put remove 等操作,只需要对对应的桶...
  • HashMap和TreeMap区别详解以及底层实现

    千次阅读 2018-10-24 14:23:48
    前言 首先介绍一下什么是Map....HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMapHashMap中元素的排列顺序...
  • 在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象...HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定...
  • 如ArrayList和Vector,HashMap和Hashtable (后者每个方法前都有synchronized关键字)。如果你在interator一个List对象时,其它线程remove一个element,问题就出现了。 2、每个线程都有自己的字段,而不会在...
  • java容器:5、如何决定使用HashMap还是TreeMap?HashMap和TreeMap区别
  • 深入理解HashMap和TreeMap区别

    千次阅读 2020-05-02 07:39:16
    文章目录简介HashMap和TreeMap本质区别排序区别Null值的区别性能区别共同点 深入理解HashMap和TreeMap区别 简介 HashMap和TreeMap是Map家族中非常常用的两个类,两个类在使用上和本质上有什么区别呢?本文将从这两...
  • 首先介绍一下什么是Map。...HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)...
  • HashMap通过hashcode对其内容进行快速查找,而 TreeMap...HashMap 非线程安全 TreeMap 非线程安全线程安全在Java里,线程安全一般体现在两个方面:1、多个thread对同一个java实例的访问(readmodify)不会相互干扰,...
  • HashMapTreeMap区别

    2020-10-12 13:05:31
    Map: 在数组中是通过数组下标来对 其内容进行索引的,而Map是通过对象来对 对象进行索引的,用来 索引的对象叫键...2、HashMap和TreeMap都不是线程安全的; 3、HashMap继承AbstractMap类;覆盖了hashcode() 和equals()
  • 总结HashMap和TreeMap区别

    万次阅读 2020-07-29 17:38:35
    Map:在数组中是通过数组下标来对 其内容进行索引的,而Map是通过对象来对 对象进行索引的,用来 索引的对象叫键...2、HashMap和TreeMap都不是线程安全的; 3、HashMap继承AbstractMap类;覆盖了hashcode() 和equals()
  • HashMap和TreeMap区别

    2019-04-23 23:15:00
    HashMap和TreeMap区别 转载于:https://www.cnblogs.com/bobi1234/p/10759779.html
  • 简介HashMap和TreeMap是Map家族中非常常用的两个类,两个类在使用上和本质上有什么区别呢?本文将从这两个方面进行深入的探讨,希望能揭露其本质。HashMap和TreeMap本质区别先看HashMap的定义:public class HashMap...
  • HashTable、HashMapTreeMap都实现了Map接口,是以键值对的形式存储操作数据的容器类型。 HashTable: 是同步的,不支持null键值,因为同步导致的性能开销,不推荐使用。扩展Dictionary类的。 HashMap: 与...
  • Hashtable、HashMapTreeMap都实现了Map接口,使用键值对的形式存储数据操作数据。 Hashtable是java早期提供的,方法是同步的(加了synchronized)。keyvalue都不能是null值。 HashMap的方法不是同步的,支持...
  • java为数据结构中的映射定义了一个接口java.util.Map,而HashMap Hashtable和TreeMap就是它的实现类。Map是将键映射到值的对象,一个映射不能包含重复的键;每个键最多只能映射一个一个值。  Hashmap 是一个最...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,420
精华内容 568
关键字:

hashmap和treemap区别