Day 3:Java 集合框架(高级集合)

目标:掌握高级集合的使用场景。

Set:HashSet 与 TreeSet

特性HashSet

TreeSet

底层实现基于HashMap实现,元素存储在哈希表中基于红黑树实现,元素按照自然顺序排序
元素顺序无序按自然顺序或指定比较器排序
时间复杂度插入、删除、查找操作时间复杂度为 O(1)插入、删除、查找操作时间复杂度为 O(log n)
是否允许为null允许存储一个null元素不允许存储null元素
适用场景快速查找,判断元素是否存在需要有序存储元素或按自定义顺序访问元素

无序和不重复实现原理 :

  1. HashSet:依赖 hashCode()equals() 方法,确保元素唯一性和高效查找。
  2. TreeSet:通过红黑树结构和比较器(ComparableComparator)保证元素唯一性和排序。
import java.util.HashSet;
import java.util.Set;

public class HashSetDemo {
    public static void main(String[] args) {
        Set<String> hashSet = new HashSet<>();
        
        // 添加元素
        hashSet.add("Apple");
        hashSet.add("Banana");
        hashSet.add("Cherry");
        hashSet.add("Apple"); // 重复元素不会被添加

        // 遍历
        System.out.println("HashSet Elements:");
        for (String item : hashSet) {
            System.out.println(item);
        }
    }
}
import java.util.Set;
import java.util.TreeSet;

public class TreeSetDemo {
    public static void main(String[] args) {
        Set<String> treeSet = new TreeSet<>();
        
        // 添加元素
        treeSet.add("Dog");
        treeSet.add("Cat");
        treeSet.add("Elephant");
        treeSet.add("Dog"); // 重复元素不会被添加

        // 遍历
        System.out.println("TreeSet Elements (Sorted):");
        for (String item : treeSet) {
            System.out.println(item);
        }
    }
}

线程安全集合

  • ConcurrentHashMap 的特点。
    • 高并发环境下的性能优化
      • 基于分段锁机制(Java 8之前),提高并发访问性能。
      • Java 8起采用 CAS(无锁操作)和红黑树,提高查询和插入效率。
    • 线程安全
      • 允许多个线程并发访问,不需要外部同步。
    • 对比:
特性HashMapConcurrentHashMap
线程安全
性能(单线程)
性能(多线程)
允许null键和值允许一个null键不允许
import java.util.concurrent.ConcurrentHashMap;
import java.util.Map;

public class ConcurrentHashMapDemo {
    public static void main(String[] args) {
        Map<String, Integer> concurrentMap = new ConcurrentHashMap<>();
        
        // 添加元素
        concurrentMap.put("Key1", 1);
        concurrentMap.put("Key2", 2);
        concurrentMap.put("Key3", 3);
        
        // 遍历
        System.out.println("ConcurrentHashMap Elements:");
        concurrentMap.forEach((key, value) -> 
            System.out.println("Key: " + key + ", Value: " + value)
        );
        
        // 并发操作示例
        Runnable task = () -> concurrentMap.merge("Key1", 1, Integer::sum);
        Thread thread1 = new Thread(task);
        Thread thread2 = new Thread(task);
        thread1.start();
        thread2.start();
    }
}

使用建议 

选择合适集合
  1. Set

    • 使用 HashSet 进行快速查重。
    • 需要排序时使用 TreeSet
  2. Map

    • 单线程环境下可以使用 HashMap
    • 多线程环境下优先使用 ConcurrentHashMap
    • 需要有序输出时使用 TreeMap
性能优化
  • 在处理大数据量时,为集合设置初始容量,减少扩容带来的性能损耗。
  • 在多线程环境中,避免使用全局锁,通过分段锁或无锁操作优化性能。

总结

本文讲解了 Java 高级集合的特性与使用场景:

  • HashSet:基于哈希表,元素无序,允许一个 null,操作复杂度 O(1)
  • TreeSet:基于红黑树,元素有序,不允许 null,操作复杂度 O(log n)
  • ConcurrentHashMap:多线程安全,采用分段锁或无锁操作,不允许 null 键和值。

建议

  • 快速查重用 HashSet,需要有序用 TreeSet。
  • 单线程用 HashMap,多线程用 ConcurrentHashMap。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值