首页后端开发JAVAHashSet、TreeSet的特点

HashSet、TreeSet的特点

时间2023-04-05 17:00:02发布访客分类JAVA浏览669
导读:HashSet和TreeSet都是Java中常见的集合框架,它们都实现了Set接口,并提供了存储无序、不可重复元素的功能。但是它们的实现方式、性能和适用场景有所不同。HashSetHashSet基于哈希表实现,它通过哈希函数将元素映射到哈希...

HashSet和TreeSet都是Java中常见的集合框架,它们都实现了Set接口,并提供了存储无序、不可重复元素的功能。但是它们的实现方式、性能和适用场景有所不同。

HashSet

HashSet基于哈希表实现,它通过哈希函数将元素映射到哈希表的不同位置。当我们想要添加一个元素时,HashSet会使用哈希函数计算出它应该存储的位置,然后将其存储在该位置上。如果该位置上已经存在元素,则HashSet会使用equals方法判断两个元素是否相等,如果相等则不存储,否则就将元素存储在另一个位置上。HashSet可以保证元素的唯一性,因为它内部使用了HashMap来存储元素,而HashMap又使用了键值对的形式存储元素,键值对中的键就是元素本身,而值则是一个固定的对象。HashSet的添加、删除、查找操作的时间复杂度都是O(1)。

HashSet的优点:

  1. 查找元素的时间复杂度为O(1);
  2. 添加、删除元素的时间复杂度为O(1);
  3. 内存占用比较少;
  4. 没有顺序限制。

HashSet的缺点:

  1. 迭代HashSet时的顺序是不确定的,因为HashSet不保证顺序;
  2. HashSet的性能与哈希函数的质量有关,如果哈希函数的质量不好,可能会导致冲突增多,影响性能;
  3. 存储元素的顺序与添加的顺序不一定相同。

示例代码:

import java.util.HashSet;
    
import java.util.Set;


public class HashSetExample {

  public static void main(String[] args) {
    
    SetString>
     set = new HashSet>
    ();
    

    // 添加元素
    set.add("element1");
    
    set.add("element2");
    
    set.add("element3");
    
    set.add("element4");
    
    set.add("element5");
    
    set.add("element1");
 // 添加重复元素,不会被存储

    // 遍历元素
    for (String s : set) {
    
      System.out.println(s);

    }
    

    // 删除元素
    set.remove("element3");
    

    // 判断是否包含某个元素
    System.out.println(set.contains("element2"));

  }

}
    

TreeSet

TreeSet基于红黑树实现,它将元素存储在一棵自平衡二叉搜索树中。每个节点包含一个元素和两个子节点,左子节点的元素比父节点的元素小,右子节点的元素比父节点的元素大。这样就可以通过比较节点的值来确定元素的位置。TreeSet可以保证元素的唯一性,并且可以按照自然顺序或自定义比较器的方式对元素进行排序。TreeSet的添加、删除、查找操作的时间复杂度都是O(log n)。

TreeSet的优点:

  1. 可以自动排序;
  2. 查找元素的时间复杂度为O(log n);
  3. 添加、删除元素的时间复杂度为O(log n);
  4. 内存占用比较少。

TreeSet的缺点:

  1. 不能存储null值;
  2. 迭代TreeSet的顺序是按照元素的顺序输出的;
  3. 比HashSet的性能差一些,因为需要维护红黑树的平衡;
  4. 自定义比较器时需要额外的开销。

示例代码:

import java.util.TreeSet;


public class TreeSetExample {

  public static void main(String[] args) {
    
    TreeSetInteger>
     set = new TreeSet>
    ();
    

    // 添加元素
    set.add(5);
    
    set.add(3);
    
    set.add(8);
    
    set.add(1);
    
    set.add(6);


    // 遍历元素
    for (int i : set) {
    
      System.out.println(i);

    }
    

    // 删除元素
    set.remove(3);
    

    // 判断是否包含某个元素
    System.out.println(set.contains(6));

  }

}
    

HashSet和TreeSet都是Set接口的实现类,它们都可以存储无序、不可重复的元素。HashSet是基于哈希表实现的,查找、添加、删除元素的时间复杂度都是O(1),内存占用比较少,但是不能保证元素的顺序;TreeSet是基于红黑树实现的,可以自动排序,并且查找、添加、删除元素的时间复杂度都是O(log n),但是不能存储null值,迭代的顺序是按照元素的顺序输出的,比HashSet的性能差一些。根据具体的需求,我们可以选择使用HashSet或TreeSet。

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

java

若转载请注明出处: HashSet、TreeSet的特点
本文地址: https://pptw.com/jishu/1881.html
HashMap、TreeMap的特点、实现、优缺点比较 ArrayList、LinkedList的特点、实现、优缺点比较

游客 回复需填写必要信息