Java集合体系结构面试题

Java集合体系结构面试题

基本概念

Q1: Java集合框架的整体架构是怎样的?

Java集合框架主要包含两个大类:

  1. Collection接口体系

    • List:有序集合
    • Set:不重复集合
    • Queue:队列集合
  2. Map接口体系

    • 键值对映射集合
java 复制代码
public class CollectionHierarchyExample {
    public void collectionTypes() {
        // List示例
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("a");  // 允许重复
        
        // Set示例
        Set<String> set = new HashSet<>();
        set.add("a");
        set.add("b");
        set.add("a");  // 不允许重复,第二个"a"不会被添加
        
        // Queue示例
        Queue<String> queue = new LinkedList<>();
        queue.offer("a");
        queue.offer("b");
        queue.poll();  // 按照FIFO原则获取元素
        
        // Map示例
        Map<String, Integer> map = new HashMap<>();
        map.put("a", 1);
        map.put("b", 2);
    }
}

Q2: 集合框架中的主要接口有哪些?它们有什么特点?

java 复制代码
public class CollectionInterfacesExample {
    public void interfaceFeatures() {
        // 1. Collection接口
        Collection<String> collection = new ArrayList<>();
        collection.add("a");
        collection.remove("a");
        collection.contains("a");
        
        // 2. List接口
        List<String> list = new ArrayList<>();
        list.add(0, "a");     // 支持按索引操作
        list.get(0);
        list.set(0, "b");
        
        // 3. Set接口
        Set<String> set = new HashSet<>();
        set.add("a");         // 不允许重复元素
        set.add("a");         // 返回false
        
        // 4. Queue接口
        Queue<String> queue = new LinkedList<>();
        queue.offer("a");     // 添加元素
        queue.peek();         // 查看头部元素
        queue.poll();         // 移除并返回头部元素
        
        // 5. Map接口
        Map<String, Integer> map = new HashMap<>();
        map.put("a", 1);      // 键值对操作
        map.get("a");
        map.containsKey("a");
        map.containsValue(1);
    }
}

集合特性

Q3: 集合框架中的顶层接口定义了哪些通用操作?

java 复制代码
public class CommonOperationsExample {
    public void demonstrateOperations() {
        Collection<String> collection = new ArrayList<>();
        
        // 1. 添加操作
        collection.add("a");           // 添加单个元素
        collection.addAll(Arrays.asList("b", "c")); // 添加多个元素
        
        // 2. 删除操作
        collection.remove("a");        // 删除单个元素
        collection.removeAll(Arrays.asList("b", "c")); // 删除多个元素
        collection.clear();            // 清空集合
        
        // 3. 查询操作
        collection.contains("a");      // 检查是否包含元素
        collection.containsAll(Arrays.asList("a", "b")); // 检查是否包含所有元素
        collection.isEmpty();          // 检查是否为空
        collection.size();             // 获取大小
        
        // 4. 迭代操作
        Iterator<String> iterator = collection.iterator();
        while (iterator.hasNext()) {
            String element = iterator.next();
            // 处理元素
        }
    }
}

Q4: 如何正确使用迭代器?

java 复制代码
public class IteratorExample {
    // 1. 基本迭代
    public void basicIteration() {
        List<String> list = new ArrayList<>();
        Iterator<String> iterator = list.iterator();
        
        while (iterator.hasNext()) {
            String element = iterator.next();
            System.out.println(element);
        }
    }
    
    // 2. 安全删除元素
    public void safeRemoval() {
        List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
        
        // 错误方式:直接使用集合的remove方法
        for (String element : list) {
            if ("a".equals(element)) {
                list.remove(element);  // ConcurrentModificationException
            }
        }
        
        // 正确方式:使用迭代器的remove方法
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            String element = iterator.next();
            if ("a".equals(element)) {
                iterator.remove();
            }
        }
    }
    
    // 3. 并发修改问题
    public void concurrentModification() {
        List<String> list = new ArrayList<>();
        list.add("a");
        
        // 错误示例
        try {
            for (String element : list) {
                list.add("b");  // ConcurrentModificationException
            }
        } catch (ConcurrentModificationException e) {
            System.out.println("并发修改异常");
        }
        
        // 正确示例:使用迭代器的方式修改
        ListIterator<String> listIterator = list.listIterator();
        while (listIterator.hasNext()) {
            String element = listIterator.next();
            listIterator.add("b");  // 使用ListIterator的add方法
        }
    }
}

集合工具类

Q5: Collections工具类提供了哪些常用操作?

java 复制代码
public class CollectionsUtilExample {
    public void demonstrateUtils() {
        List<String> list = new ArrayList<>();
        
        // 1. 排序操作
        Collections.sort(list);                    // 自然排序
        Collections.sort(list, String::compareTo); // 自定义排序
        Collections.reverse(list);                 // 反转
        Collections.shuffle(list);                 // 随机排序
        
        // 2. 查找和替换
        Collections.binarySearch(list, "a");       // 二分查找
        Collections.fill(list, "a");              // 填充
        Collections.replaceAll(list, "a", "b");   // 替换所有
        
        // 3. 同步包装
        List<String> syncList = Collections.synchronizedList(list);
        Set<String> syncSet = Collections.synchronizedSet(new HashSet<>());
        Map<String, String> syncMap = Collections.synchronizedMap(new HashMap<>());
        
        // 4. 不可修改包装
        List<String> unmodifiableList = Collections.unmodifiableList(list);
        Set<String> unmodifiableSet = Collections.unmodifiableSet(new HashSet<>());
        Map<String, String> unmodifiableMap = Collections.unmodifiableMap(new HashMap<>());
    }
}

Q6: 如何选择合适的集合类?

java 复制代码
public class CollectionSelectionExample {
    public void selectionGuidelines() {
        // 1. 需要高效随机访问
        List<String> arrayList = new ArrayList<>();  // 选择ArrayList
        
        // 2. 需要频繁插入删除
        List<String> linkedList = new LinkedList<>();  // 选择LinkedList
        
        // 3. 需要去重
        Set<String> hashSet = new HashSet<>();  // 选择HashSet
        
        // 4. 需要排序
        Set<String> treeSet = new TreeSet<>();  // 选择TreeSet
        
        // 5. 需要键值对
        Map<String, String> hashMap = new HashMap<>();  // 选择HashMap
        
        // 6. 需要线程安全
        Map<String, String> concurrentMap = new ConcurrentHashMap<>();  // 选择ConcurrentHashMap
        
        // 7. 需要保证插入顺序
        Map<String, String> linkedHashMap = new LinkedHashMap<>();  // 选择LinkedHashMap
        
        // 8. 需要按键排序
        Map<String, String> treeMap = new TreeMap<>();  // 选择TreeMap
    }
}

面试关键点

  1. 理解集合框架的整体架构
  2. 掌握各种集合接口的特点
  3. 熟悉集合的基本操作
  4. 正确使用迭代器
  5. 了解Collections工具类
  6. 掌握集合类的选择原则
  7. 注意线程安全问题
  8. 理解集合的性能特点
相关推荐
kfepiza14 分钟前
JavaScript将String转为base64 笔记250802
开发语言·javascript·笔记
Warren9815 分钟前
Vue2博客项目笔记(第一天)
java·开发语言·javascript·vue.js·windows·笔记·ecmascript
Charles Wesley16 分钟前
11:java学习笔记:1D array(1维数组)
java·笔记·学习·eclipse
软件测试-阿涛1 小时前
【自动化测试】Python Selenium 自动化测试元素定位专业教程
开发语言·python·selenium·自动化
stillaliveQEJ2 小时前
【JavaEE】多线程(一)
java·java-ee
勇闯逆流河2 小时前
【C++】Stack and Queue and Functor
开发语言·c++
present--012 小时前
【JAVA EE初阶】多线程(下)
java·java-ee
来来走走3 小时前
Flutter开发 了解Scaffold
android·开发语言·flutter
Chan163 小时前
【智能协同云图库】第七期:基于AI调用阿里云百炼大模型,实现AI图片编辑功能
java·人工智能·spring boot·后端·spring·ai·ai作画
xiangweiqiang3 小时前
用phpstudy安装php8.2后报错:意思是找不到php_redis.dll拓展时
开发语言·php