首页后端开发JAVAHashMap、TreeMap的特点、实现、优缺点比较

HashMap、TreeMap的特点、实现、优缺点比较

时间2023-04-05 16:58:01发布访客分类JAVA浏览1668
导读:HashMap和TreeMap都是Java中常用的Map接口的实现类,它们都可以存储键值对,并提供快速的查找、插入、删除操作。HashMap的特点:基于哈希表实现,查找、插入、删除的时间复杂度为O(1 ;可以存储null值和null键;内部...

HashMap和TreeMap都是Java中常用的Map接口的实现类,它们都可以存储键值对,并提供快速的查找、插入、删除操作。

HashMap的特点:

  1. 基于哈希表实现,查找、插入、删除的时间复杂度为O(1);
  2. 可以存储null值和null键;
  3. 内部无序,不能保证元素的顺序;
  4. 迭代HashMap的顺序是不确定的。

HashMap的实现:

HashMap的内部实现是由数组和链表(或红黑树)组成的。数组的每个元素都是一个链表(或红黑树),链表(或红黑树)中存储的是键值对。当发生哈希冲突时,新的键值对会被添加到链表(或红黑树)的尾部。当链表(或红黑树)中元素的个数超过了一个阈值时,链表(或红黑树)就会被转换成红黑树。这样可以保证HashMap的性能在最坏情况下也能达到O(log n)。

HashMap的优点:

  1. 查找、插入、删除的时间复杂度为O(1);
  2. 可以存储null值和null键;
  3. 内存占用比较小;
  4. 适合于快速查找、插入、删除元素的场景。

HashMap的缺点:

  1. 迭代HashMap的顺序是不确定的;
  2. 当哈希冲突比较严重时,性能会下降;
  3. 不支持按照键值对的键或值进行排序。

示例代码:

import java.util.HashMap;
    
import java.util.Map;


public class HashMapExample {

  public static void main(String[] args) {
    
    MapString, Integer>
     map = new HashMap>
    ();
    

    // 添加键值对
    map.put("apple", 3);
    
    map.put("orange", 2);
    
    map.put("banana", 1);
    

    // 遍历键值对
    for (Map.EntryString, Integer>
 entry : map.entrySet()) {
    
      System.out.println(entry.getKey() + " = " + entry.getValue());

    }
    

    // 删除键值对
    map.remove("orange");
    

    // 判断是否包含某个键
    System.out.println(map.containsKey("apple"));

  }

}
    

TreeMap的特点:

  1. 基于红黑树实现,查找、插入、删除的时间复杂度为O(log n);
  2. 可以按照键值对的键进行排序;
  3. 不能存储null键;
  4. 内部有序,可以保证元素的顺序;
  5. 迭代TreeMap的顺序是按照键值对的键的顺序输出的。

TreeMap的实现:

TreeMap的内部实现是由红黑树组成的。红黑树是一种自平衡的二叉搜索树,可以保证插入、删除、查找操作的时间复杂度都是O(log n)。在插入键值对时,TreeMap会按照键进行排序,这样可以保证遍历TreeMap时的顺序是按照键的顺序输出的。

TreeMap的优点:

  1. 可以按照键值对的键进行排序;
  2. 内部有序,可以保证元素的顺序;
  3. 性能比HashMap更稳定,不会因为哈希冲突而导致性能下降。

TreeMap的缺点:

  1. 查找、插入、删除的时间复杂度为O(log n),相比于HashMap稍微慢一些;
  2. 不能存储null键;
  3. 内存占用比较大;
  4. 不支持按照键值对的值进行排序。

示例代码:

import java.util.Map;
    
import java.util.TreeMap;


public class TreeMapExample {

  public static void main(String[] args) {
    
    MapString, Integer>
     map = new TreeMap>
    ();
    

    // 添加键值对
    map.put("apple", 3);
    
    map.put("orange", 2);
    
    map.put("banana", 1);
    

    // 遍历键值对
    for (Map.EntryString, Integer>
 entry : map.entrySet()) {
    
      System.out.println(entry.getKey() + " = " + entry.getValue());

    }
    

    // 删除键值对
    map.remove("orange");
    

    // 判断是否包含某个键
    System.out.println(map.containsKey("apple"));

  }

}
    

在上面的示例代码中,我们先创建了一个TreeMap对象,然后添加了几个键值对。遍历键值对时,我们可以看到输出的顺序是按照键的顺序输出的。接着我们删除了一个键值对,然后判断是否包含某个键。可以看到,即使删除了一个键值对,TreeMap的内部仍然保持着有序状态。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

java

若转载请注明出处: HashMap、TreeMap的特点、实现、优缺点比较
本文地址: https://pptw.com/jishu/1880.html
java线程和进程(一) HashSet、TreeSet的特点

游客 回复需填写必要信息