21xrx.com
2025-03-22 07:43:44 Saturday
文章检索 我的文章 写文章
Java中set的使用和注意事项
2023-06-19 02:53:17 深夜i     9     0
Java set 去重

我在学习使用Java中的集合框架,近来遇到了set这个类。它是一种不重复元素的集合,非常适合要求去重的应用场景。下面我来给大家介绍一下关于Java中set的知识点。

首先,在使用set的时候我们需要考虑到元素的比较。Java中的set默认使用对象的hashCode和equals方法进行元素的比较,所以在进行元素的插入和查询操作时需要保证对象的这两个方法正确实现。下面是一个使用自定义类的set使用示例代码:

public class MyClass {
  private String name;
  private int age;
  // 省略构造函数和getter/setter方法
  @Override
  public int hashCode() {
    return Objects.hash(name, age);
  }
  @Override
  public boolean equals(Object obj) {
    if (this == obj) return true;
    if (obj == null || getClass() != obj.getClass()) return false;
    MyClass myClass = (MyClass) obj;
    return age == myClass.age &&
        Objects.equals(name, myClass.name);
  }
}
Set
  set = new HashSet<>();
 
MyClass mc1 = new MyClass("张三", 18);
MyClass mc2 = new MyClass("李四", 20);
MyClass mc3 = new MyClass("张三", 18);
set.add(mc1);
set.add(mc2);
set.add(mc3);
System.out.println(set.size());// output: 2

这段代码中,我们自定义了MyClass类,并重写了hashCode和equals方法。然后我们通过HashSet集合来存放这个自定义类的对象,其中mc1和mc3的属性值相同,所以只能有其中一个对象加入到集合中。

其次,Java中的set有多个实现类,包括HashSet、LinkedHashSet和TreeSet,它们在元素的存储和遍历方式上有所差异。其中,HashSet是基于哈希表的实现方式,元素的遍历顺序是不确定的;LinkedHashSet是基于哈希表和双向链表的实现方式,元素的遍历顺序和插入的顺序相同;TreeSet是基于红黑树的实现方式,元素将按照自然排序或者指定的Comparator排序。下面是示例代码:

Set
  set1 = new HashSet<>();
 
set1.add("Apple");
set1.add("Orange");
set1.add("Banana");
Set
  set2 = new LinkedHashSet<>();
 
set2.add("Apple");
set2.add("Orange");
set2.add("Banana");
Set
  set3 = new TreeSet<>();
 
set3.add("Apple");
set3.add("Orange");
set3.add("Banana");
System.out.println(set1);// output: [Orange, Apple, Banana]
System.out.println(set2);// output: [Apple, Orange, Banana]
System.out.println(set3);// output: [Apple, Banana, Orange]

最后,需要注意的是,如果要在多线程环境下使用set,需要进行线程安全的处理。可以考虑使用Collections.synchronizedSet方法或者使用ConcurrentHashMap实现类。

综上,Java中的set是一种非常常用的集合类,适用于去重等应用场景。学会其使用方法和注意事项,可以更好地应用于实际开发中。

  
  

评论区