资讯动态

一、集合概述(前置基础)

发布时间:2026/8/21 7:06:51 来源:尧图企业网站定制
一、集合概述前置基础集合是Java中用于存储多个数据的容器区别于数组固定长度、只能存储同一种基本类型/引用类型集合长度可变可存储不同类型的对象本质存储对象引用核心接口是CollectionList和Set是Collection的两大核心子接口。核心特点集合只存储对象不存储基本数据类型需使用包装类如int→Integer长度可动态增减提供了丰富的方法添加、删除、遍历、查找等简化数据操作。Collection核心通用方法List和Set均适用add(E e)添加单个元素返回boolean添加成功为trueremove(Object o)删除指定元素返回booleansize()返回集合中元素的个数isEmpty()判断集合是否为空clear()清空集合中所有元素contains(Object o)判断集合中是否包含指定元素。二、List集合1. 核心定义与特点List是Collection的子接口代表有序、可重复的集合元素有明确的索引类似数组的下标可通过索引快速访问、插入、删除元素适合需要“有序存储、可重复、按索引操作”的场景。核心特点有序元素存入顺序与取出顺序一致、可重复允许存储多个相同的元素、有索引从0开始依次递增。2. List接口的常用实现类3个核心1ArrayList最常用底层基于数组实现查询效率高通过索引直接访问时间复杂度O(1)增删效率低需移动数组元素时间复杂度O(n)线程不安全效率高适合“查询频繁、增删较少”的场景如展示列表数据。// ArrayList示例 ListString list new ArrayList(); // 添加元素 list.add(Java); list.add(Python); list.add(Java); // 允许重复 // 按索引插入元素指定位置插入 list.add(1, C); // 插入后[Java, C, Python, Java] // 按索引访问元素 String element list.get(0); // 结果Java // 按索引修改元素 list.set(2, JavaScript); // 修改后[Java, C, JavaScript, Java] // 按索引删除元素 list.remove(3); // 删除索引3的元素返回删除的元素 // 遍历集合三种方式 // 1. 普通for循环利用索引最常用 for (int i 0; i list.size(); i) { System.out.println(list.get(i)); } // 2. 增强for循环foreach无需索引 for (String str : list) { System.out.println(str); } // 3. 迭代器遍历安全遍历可在遍历中删除元素 IteratorString iterator list.iterator(); while (iterator.hasNext()) { String str iterator.next(); if (C.equals(str)) { iterator.remove(); // 迭代器删除避免并发修改异常 } }2LinkedList底层基于双向链表实现查询效率低需从头/尾遍历查找时间复杂度O(n)增删效率高只需修改链表节点的指针时间复杂度O(1)线程不安全适合“增删频繁、查询较少”的场景如队列、栈的实现。额外特性LinkedList还实现了Deque接口可作为队列先进先出、栈先进后出使用提供了poll()、push()、pop()等方法。3Vector底层基于数组实现与ArrayList功能基本一致但线程安全方法加了synchronized锁效率低目前已基本被ArrayList替代仅在多线程场景下偶尔使用。3. List集合的特有方法区别于Set因List有索引所以拥有Set没有的、基于索引的操作方法get(int index)获取指定索引的元素set(int index, E e)修改指定索引的元素返回被修改的旧元素add(int index, E e)在指定索引插入元素后续元素后移remove(int index)删除指定索引的元素返回被删除的元素indexOf(Object o)返回指定元素在集合中第一次出现的索引没有则返回-1lastIndexOf(Object o)返回指定元素在集合中最后一次出现的索引没有则返回-1。4. List集合的注意事项ArrayList和LinkedList均线程不安全多线程环境下需手动加锁或使用Collections.synchronizedList()包装遍历ArrayList时优先使用普通for循环效率高遍历LinkedList时优先使用增强for或迭代器避免频繁通过索引查找避免在增强for循环中修改集合添加/删除元素会抛出ConcurrentModificationException并发修改异常需使用迭代器删除。三、Set集合1. 核心定义与特点Set是Collection的子接口代表无序、不可重复的集合元素没有索引无法通过索引访问元素适合需要“去重存储、无需按顺序访问”的场景如存储唯一标识、去重数据。核心特点无序元素存入顺序与取出顺序不一定一致底层存储无序、不可重复不允许存储两个相等的元素equals()方法判断相等、无索引无法通过下标访问。补充Set判断元素是否重复的规则先通过hashCode()方法判断哈希值若哈希值不同则元素不同若哈希值相同再通过equals()方法判断若equals()返回true则元素重复不添加若返回false则添加。2. Set接口的常用实现类3个核心1HashSet最常用底层基于哈希表HashMap实现无序、不可重复查询和增删效率都很高时间复杂度O(1)线程不安全适合“去重、高效操作”的常规场景。// HashSet示例 SetString set new HashSet(); // 添加元素不可重复重复元素添加失败 set.add(Java); set.add(Python); set.add(Java); // 重复元素添加失败集合中仍只有1个Java // 删除元素 set.remove(Python); // 删除成功返回true不存在返回false // 遍历集合两种方式无索引无法用普通for循环 // 1. 增强for循环 for (String str : set) { System.out.println(str); // 输出顺序可能与添加顺序不一致 } // 2. 迭代器遍历 IteratorString iterator set.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } // 判断元素是否存在 boolean hasJava set.contains(Java); // 结果true2LinkedHashSet底层基于哈希表双向链表实现是HashSet的子类特点有序、不可重复有序指“存入顺序与取出顺序一致”查询和增删效率略低于HashSet线程不安全适合“去重且需要保持插入顺序”的场景。3TreeSet底层基于红黑树实现无序不保证插入顺序、不可重复但会对元素进行自然排序默认升序也可自定义排序规则查询和增删效率中等时间复杂度O(log n)线程不安全适合“去重且需要排序”的场景。// TreeSet示例自然排序String类型默认按字典序升序 SetString treeSet new TreeSet(); treeSet.add(Banana); treeSet.add(Apple); treeSet.add(Cherry); // 遍历输出Apple、Banana、Cherry自然排序后 for (String str : treeSet) { System.out.println(str); } ​ // 自定义排序如整数降序 SetInteger numSet new TreeSet(new ComparatorInteger() { Override public int compare(Integer o1, Integer o2) { return o2 - o1; // 降序排序 } }); numSet.add(3); numSet.add(1); numSet.add(2); // 遍历输出3、2、13. Set集合的注意事项HashSet、LinkedHashSet、TreeSet均线程不安全多线程环境下需使用Collections.synchronizedSet()包装HashSet存储自定义对象时需重写hashCode()和equals()方法否则无法实现去重默认使用Object类的方法判断地址是否相同TreeSet存储自定义对象时需让对象实现Comparable接口重写compareTo()方法或创建TreeSet时传入Comparator否则会抛出ClassCastException类型转换异常Set无索引无法使用普通for循环遍历只能用增强for、迭代器遍历。四、List集合与Set集合的核心区别重点对比维度List集合Set集合有序性有序存入与取出顺序一致无序HashSet、TreeSetLinkedHashSet有序可重复性可重复不可重复索引有索引可通过索引操作无索引无法通过索引操作底层实现ArrayList数组、LinkedList链表HashSet哈希表、TreeSet红黑树适用场景需有序、可重复、按索引操作如列表展示需去重、无需索引如唯一标识存储五、核心总结List和Set均继承自Collection拥有Collection的所有通用方法List核心有序、可重复、有索引重点掌握ArrayList和LinkedList的区别Set核心不可重复、无索引重点掌握HashSet常规去重、TreeSet排序去重的使用选型原则需有序/按索引操作→用List需去重→用Set需排序去重→TreeSet需保持插入顺序去重→LinkedHashSet。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价