Java Collections工具类面试题

Java Collections工具类面试题

基本操作

Q1: Collections工具类提供了哪些常用的集合操作方法?

java 复制代码
public class CollectionsBasicExample {
    public void demonstrateBasicOperations() {
        List<Integer> list = new ArrayList<>();
        
        // 1. 添加元素
        Collections.addAll(list, 1, 2, 3, 4, 5);
        
        // 2. 排序操作
        Collections.sort(list);                     // 自然排序
        Collections.sort(list, Collections.reverseOrder()); // 反向排序
        Collections.reverse(list);                  // 反转
        Collections.shuffle(list);                  // 随机排序
        Collections.rotate(list, 2);               // 旋转
        
        // 3. 查找和替换
        int max = Collections.max(list);           // 最大值
        int min = Collections.min(list);           // 最小值
        int frequency = Collections.frequency(list, 1); // 元素出现次数
        Collections.replaceAll(list, 1, 10);       // 替换所有指定元素
        Collections.fill(list, 0);                 // 填充
        
        // 4. 二分查找
        Collections.sort(list);  // 二分查找前需要排序
        int index = Collections.binarySearch(list, 3);
    }
}

Q2: Collections工具类如何实现集合的线程安全?

java 复制代码
public class CollectionsSynchronizationExample {
    public void demonstrateSynchronization() {
        // 1. 线程安全的List
        List<String> list = new ArrayList<>();
        List<String> syncList = Collections.synchronizedList(list);
        
        // 2. 线程安全的Set
        Set<String> set = new HashSet<>();
        Set<String> syncSet = Collections.synchronizedSet(set);
        
        // 3. 线程安全的Map
        Map<String, String> map = new HashMap<>();
        Map<String, String> syncMap = Collections.synchronizedMap(map);
        
        // 4. 正确的遍历方式
        synchronized (syncList) {
            Iterator<String> i = syncList.iterator();
            while (i.hasNext())
                System.out.println(i.next());
        }
        
        // 5. 并发修改示例
        List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
        synchronizedList.add("one");
        synchronizedList.add("two");
        
        // 错误的方式:可能抛出ConcurrentModificationException
        try {
            for (String element : synchronizedList) {
                synchronizedList.remove(element);
            }
        } catch (ConcurrentModificationException e) {
            System.out.println("并发修改异常");
        }
        
        // 正确的方式:使用迭代器的remove方法
        synchronized (synchronizedList) {
            Iterator<String> iterator = synchronizedList.iterator();
            while (iterator.hasNext()) {
                iterator.next();
                iterator.remove();
            }
        }
    }
}

不可变集合

Q3: Collections如何创建不可变集合?

java 复制代码
public class ImmutableCollectionsExample {
    public void demonstrateImmutableCollections() {
        // 1. 空集合
        List<String> emptyList = Collections.emptyList();
        Set<String> emptySet = Collections.emptySet();
        Map<String, String> emptyMap = Collections.emptyMap();
        
        // 2. 单元素集合
        Set<String> singleton = Collections.singleton("one");
        Map<String, String> singletonMap = 
            Collections.singletonMap("key", "value");
        
        // 3. 不可修改的集合
        List<String> list = new ArrayList<>();
        list.add("one");
        list.add("two");
        List<String> unmodifiableList = 
            Collections.unmodifiableList(list);
        
        Set<String> set = new HashSet<>();
        set.add("one");
        Set<String> unmodifiableSet = 
            Collections.unmodifiableSet(set);
        
        Map<String, String> map = new HashMap<>();
        map.put("key", "value");
        Map<String, String> unmodifiableMap = 
            Collections.unmodifiableMap(map);
        
        // 4. 尝试修改不可变集合
        try {
            unmodifiableList.add("three"); // 抛出UnsupportedOperationException
        } catch (UnsupportedOperationException e) {
            System.out.println("不能修改不可变集合");
        }
    }
}

特殊集合

Q4: Collections提供了哪些特殊的集合实现?

java 复制代码
public class SpecialCollectionsExample {
    public void demonstrateSpecialCollections() {
        // 1. 检查型集合
        List<String> list = new ArrayList<>();
        List<String> checkedList = 
            Collections.checkedList(list, String.class);
        
        try {
            // 以下代码在编译时不会报错,但运行时会抛出ClassCastException
            List rawList = checkedList;
            rawList.add(new Integer(1));
        } catch (ClassCastException e) {
            System.out.println("类型检查失败");
        }
        
        // 2. 类型安全的枚举Set
        Set<RoundingMode> roundingModes = 
            Collections.newSetFromMap(new EnumMap<>(RoundingMode.class));
        
        // 3. 线程安全且不可修改的集合
        Set<String> set = Collections.singleton("one");
        Map<String, String> map = 
            Collections.singletonMap("key", "value");
    }
}

集合算法

Q5: Collections中的算法实现有哪些?

java 复制代码
public class CollectionsAlgorithmsExample {
    public void demonstrateAlgorithms() {
        List<Integer> list = new ArrayList<>();
        Collections.addAll(list, 3, 1, 4, 1, 5, 9, 2, 6, 5);
        
        // 1. 排序算法
        Collections.sort(list);  // 自然排序
        Collections.sort(list, (a, b) -> b - a);  // 自定义排序
        
        // 2. 查找算法
        int index = Collections.binarySearch(list, 4);
        
        // 3. 极值算法
        int min = Collections.min(list);
        int max = Collections.max(list);
        
        // 4. 随机算法
        Collections.shuffle(list);  // 随机打乱
        Collections.shuffle(list, new Random(47));  // 使用指定的随机源
        
        // 5. 子列表查找
        List<Integer> subList = Arrays.asList(4, 1, 5);
        int indexOfSubList = Collections.indexOfSubList(list, subList);
        int lastIndexOfSubList = 
            Collections.lastIndexOfSubList(list, subList);
    }
}

Q6: 如何正确使用Collections工具类?

java 复制代码
public class CollectionsUsageExample {
    // 1. 集合工厂方法
    public static <T> List<T> createSafeList() {
        return Collections.synchronizedList(new ArrayList<>());
    }
    
    // 2. 不可变集合包装
    public static <T> List<T> createImmutableList(List<T> list) {
        return Collections.unmodifiableList(new ArrayList<>(list));
    }
    
    // 3. 类型安全集合
    public static <T> List<T> createCheckedList(List<T> list, 
                                              Class<T> type) {
        return Collections.checkedList(list, type);
    }
    
    // 4. 最佳实践示例
    public void demonstrateBestPractices() {
        // 使用工厂方法创建集合
        List<String> threadSafeList = createSafeList();
        
        // 创建不可变视图
        List<String> sourceList = new ArrayList<>();
        sourceList.add("one");
        List<String> immutableList = createImmutableList(sourceList);
        
        // 使用类型安全的集合
        List<String> checkedList = createCheckedList(
            new ArrayList<>(), 
            String.class
        );
        
        // 正确的同步访问
        List<String> list = Collections.synchronizedList(
            new ArrayList<>()
        );
        synchronized (list) {
            Iterator<String> i = list.iterator();
            while (i.hasNext())
                System.out.println(i.next());
        }
    }
}

面试关键点

  1. 掌握Collections工具类的常用方法
  2. 理解线程安全包装器的使用
  3. 熟悉不可变集合的创建方式
  4. 了解特殊集合的应用场景
  5. 掌握集合算法的使用
  6. 注意线程安全问题
  7. 理解类型安全的重要性
  8. 掌握最佳实践和性能考虑
相关推荐
每次的天空2 分钟前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
苦夏木禾3 分钟前
js请求避免缓存的三种方式
开发语言·javascript·缓存
重庆小透明8 分钟前
力扣刷题记录【1】146.LRU缓存
java·后端·学习·算法·leetcode·缓存
超级土豆粉11 分钟前
Turndown.js: 优雅地将 HTML 转换为 Markdown
开发语言·javascript·html
lang2015092814 分钟前
Reactor操作符的共享与复用
java
TTc_24 分钟前
@Transactional事务注解的批量回滚机制
java·事务
你不知道我是谁?38 分钟前
AI 应用于进攻性安全
人工智能·安全
wei_shuo1 小时前
飞算 JavaAI 开发助手:深度学习驱动下的 Java 全链路智能开发新范式
java·开发语言·飞算javaai
熊猫钓鱼>_>1 小时前
用Python解锁图像处理之力:从基础到智能应用的深度探索
开发语言·图像处理·python
GO兔1 小时前
开篇:GORM入门——Go语言的ORM王者
开发语言·后端·golang·go