2026/1/1 20:51:41
网站建设
项目流程
哪里可以找人做网站,阿里网站官网入口,焦作网站建设,深圳服装网站建设1. 集合框架概述
1.1 什么是集合框架#xff1f;
集合框架是一个统一的架构#xff0c;用于表示和操作集合#xff0c;使集合能够独立于其实现细节进行操作。Java集合框架提供了一系列接口和类#xff0c;用于存储、检索、操作和传输数据对象。
1.2 为什么需要集合框架集合框架是一个统一的架构用于表示和操作集合使集合能够独立于其实现细节进行操作。Java集合框架提供了一系列接口和类用于存储、检索、操作和传输数据对象。1.2 为什么需要集合框架在Java早期版本中Java提供了有限的几个类用于数据存储和操作如Vector、Hashtable等但这些类缺乏统一的设计理念。Java 1.2引入集合框架目的是提供高性能、高质量的数据结构和算法实现减少编程工作量通过提供现成的数据结构提供接口和实现分离的设计使代码更具可重用性和互操作性建立通用语言方便开发者交流算法和数据结构1.3 集合框架的组成部分Java集合框架主要由三部分组成接口Interfaces表示集合的抽象数据类型。允许集合独立于其实现细节进行操作。实现类Implementations接口的具体实现即可重用的数据结构。算法Algorithms对实现了集合接口的对象进行操作的方法如搜索和排序。2. 核心接口Java集合框架的核心接口构成了框架的基础。以下是最重要的接口2.1 Collection接口Collection是集合层次结构的根接口所有集合类都实现了这个接口。它提供了适用于所有集合的基本操作。主要方法boolean add(E e)- 添加元素boolean remove(Object o)- 移除元素boolean contains(Object o)- 检查是否包含指定元素int size()- 返回集合中的元素数量boolean isEmpty()- 检查集合是否为空IteratorE iterator()- 返回迭代器void clear()- 清空集合boolean containsAll(Collection? c)- 检查是否包含另一个集合的所有元素boolean addAll(Collection? extends E c)- 添加另一个集合的所有元素boolean removeAll(Collection? c)- 移除同时存在于指定集合中的所有元素boolean retainAll(Collection? c)- 仅保留同时存在于指定集合中的元素Object[] toArray()- 返回包含集合中所有元素的数组2.2 List接口List是一个有序的Collection用户可以通过索引访问元素并且允许重复元素。特点有序插入顺序允许重复元素可以通过索引访问元素额外的主要方法E get(int index)- 获取指定位置的元素E set(int index, E element)- 替换指定位置的元素void add(int index, E element)- 在指定位置插入元素E remove(int index)- 移除指定位置的元素int indexOf(Object o)- 返回指定元素第一次出现的索引int lastIndexOf(Object o)- 返回指定元素最后一次出现的索引ListE subList(int fromIndex, int toIndex)- 返回指定范围内的子列表2.3 Set接口Set是一个不包含重复元素的Collection。特点不允许重复元素大多数实现类不保证元素的顺序有些实现类可能保证特定的顺序如LinkedHashSet维护插入顺序Set接口没有在Collection接口之外添加新方法只是改变了一些方法的行为语义。例如add方法对于已存在的元素将返回false。2.4 Queue接口Queue代表了先进先出FIFO的数据结构除了基本的Collection操作外还提供了额外的插入、提取和检查操作。主要方法boolean offer(E e)- 将元素添加到队列不抛出异常E poll()- 获取并移除队首元素如果队列为空则返回nullE peek()- 获取但不移除队首元素如果队列为空则返回nullE element()- 获取但不移除队首元素如果队列为空则抛出异常E remove()- 获取并移除队首元素如果队列为空则抛出异常2.5 Deque接口Deque双端队列是Queue的子接口允许在两端进行插入和删除操作。主要方法void addFirst(E e)/void addLast(E e)- 在队列前端/后端添加元素E removeFirst()/E removeLast()- 移除并返回队列前端/后端的元素E getFirst()/E getLast()- 获取但不移除队列前端/后端的元素boolean offerFirst(E e)/boolean offerLast(E e)- 在队列前端/后端添加元素不抛出异常E pollFirst()/E pollLast()- 获取并移除队列前端/后端的元素如果队列为空则返回nullE peekFirst()/E peekLast()- 获取但不移除队列前端/后端的元素如果队列为空则返回null2.6 Map接口Map虽然不是Collection的子接口但也是集合框架的一部分。Map将键映射到值不能包含重复的键每个键最多映射到一个值。主要方法V put(K key, V value)- 添加键值对V get(Object key)- 获取指定键对应的值V remove(Object key)- 移除指定键对应的值boolean containsKey(Object key)- 检查是否包含指定键boolean containsValue(Object value)- 检查是否包含指定值SetK keySet()- 返回包含所有键的SetCollectionV values()- 返回包含所有值的CollectionSetMap.EntryK, V entrySet()- 返回包含所有键值对的Setint size()- 返回键值对的数量boolean isEmpty()- 检查Map是否为空void clear()- 清空Map3. 实现类Java集合框架提供了许多实现类每个类都有其特定的特性和适用场景。3.1 List实现3.1.1 ArrayListArrayList是基于数组实现的List提供了快速的随机访问但插入和删除元素的速度较慢。特点基于动态数组实现随机访问元素的时间复杂度为O(1)在末尾添加元素的平均时间复杂度为O(1)在中间插入/删除元素的时间复杂度为O(n)非同步线程不安全示例ListString arrayList new ArrayList(); arrayList.add(Java); arrayList.add(Python); arrayList.add(C); System.out.println(arrayList.get(1)); // 输出: Python3.1.2 LinkedListLinkedList是基于双向链表实现的List提供了快速的插入和删除操作但随机访问元素的速度较慢。特点基于双向链表实现随机访问元素的时间复杂度为O(n)插入/删除元素的时间复杂度为O(1)假设已知位置同时实现了List和Deque接口非同步线程不安全示例LinkedListString linkedList new LinkedList(); linkedList.add(Java); linkedList.add(Python); linkedList.addFirst(C); // 在开头添加元素 linkedList.addLast(JavaScript); // 在末尾添加元素 System.out.println(linkedList); // 输出: [C, Java, Python, JavaScript]3.1.3 VectorVector是早期Java版本中的集合类现在已经被重新设计为实现List接口。它类似于ArrayList但所有方法都是同步的。特点基于动态数组实现所有方法都是同步的线程安全性能比ArrayList稍差现在一般不推荐使用除非需要线程安全示例VectorString vector new Vector(); vector.add(Java); vector.add(Python); vector.add(C); System.out.println(vector.elementAt(1)); // 输出: Python3.1.4 StackStack继承自Vector实现了标准的后进先出LIFO栈。特点继承自Vector所以是线程安全的表示后进先出LIFO的数据结构现在通常推荐使用Deque接口的实现类代替Stack主要方法E push(E item)- 将元素压入栈顶E pop()- 移除并返回栈顶元素E peek()- 获取但不移除栈顶元素boolean empty()- 检查栈是否为空int search(Object o)- 返回元素在栈中的位置示例StackString stack new Stack(); stack.push(Java); stack.push(Python); stack.push(C); System.out.println(stack.pop()); // 输出: C System.out.println(stack.peek()); // 输出: Python3.2 Set实现3.2.1 HashSetHashSet是基于哈希表实现的Set它不保证集合的迭代顺序允许使用null元素。特点基于HashMap实现不保证元素的顺序允许null元素提供最佳的性能非同步线程不安全示例SetString hashSet new HashSet(); hashSet.add(Java); hashSet.add(Python); hashSet.add(Java); // 重复元素不会被添加 System.out.println(hashSet); // 输出顺序可能不同3.2.2 LinkedHashSetLinkedHashSet是HashSet的子类它维护了一个双向链表记录了元素的插入顺序。特点基于LinkedHashMap实现维护元素的插入顺序允许null元素性能略低于HashSet非同步线程不安全示例SetString linkedHashSet new LinkedHashSet(); linkedHashSet.add(Java); linkedHashSet.add(Python); linkedHashSet.add(C); System.out.println(linkedHashSet); // 输出: [Java, Python, C]3.2.3 TreeSetTreeSet是基于红黑树实现的NavigableSet它按照元素的自然顺序或者指定的比较器排序。特点基于TreeMap实现元素按照自然顺序或指定的比较器排序不允许null元素提供了很多额外的方法来处理有序集合性能比HashSet和LinkedHashSet差非同步线程不安全示例TreeSetString treeSet new TreeSet(); treeSet.add(Java); treeSet.add(Python); treeSet.add(C); System.out.println(treeSet); // 输出: [C, Java, Python]按字母顺序 // 使用比较器 TreeSetString customTreeSet new TreeSet(Comparator.reverseOrder()); customTreeSet.add(Java); customTreeSet.add(Python); customTreeSet.add(C); System.out.println(customTreeSet); // 输出: [Python, Java, C]按字母逆序3.3 Queue实现3.3.1 PriorityQueuePriorityQueue是基于优先级堆实现的队列元素按照自然顺序或者指定的比较器排序。特点基于优先级堆通常是二叉堆实现元素按照自然顺序或指定的比较器排序不允许null元素非同步线程不安全示例PriorityQueueInteger priorityQueue new PriorityQueue(); priorityQueue.add(5); priorityQueue.add(1); priorityQueue.add(3); System.out.println(priorityQueue.poll()); // 输出: 1 System.out.println(priorityQueue.poll()); // 输出: 33.3.2 ArrayDequeArrayDeque是基于可调整大小的数组实现的双端队列它作为栈和队列都比Stack和LinkedList更高效。特点基于循环数组实现没有容量限制不允许null元素作为栈使用时比Stack更快作为队列使用时比LinkedList更快非同步线程不安全示例// 作为队列使用 QueueString queue new ArrayDeque(); queue.offer(Java); queue.offer(Python); queue.offer(C); System.out.println(queue.poll()); // 输出: Java // 作为栈使用 DequeString stack new ArrayDeque(); stack.push(Java); stack.push(Python); stack.push(C); System.out.println(stack.pop()); // 输出: C3.4 Map实现3.4.1 HashMapHashMap是基于哈希表实现的Map它不保证映射的顺序允许使用null键和null值。特点基于哈希表实现不保证映射的顺序允许一个null键和多个null值提供最佳的性能非同步线程不安全示例MapString, Integer hashMap new HashMap(); hashMap.put(Java, 1995); hashMap.put(Python, 1991); hashMap.put(C, 1983); System.out.println(hashMap.get(Java)); // 输出: 19953.4.2 LinkedHashMapLinkedHashMap是HashMap的子类它维护了一个双向链表可以记录元素的插入顺序或访问顺序。特点基于HashMap和双向链表实现维护元素的插入顺序或访问顺序可配置允许一个null键和多个null值性能略低于HashMap非同步线程不安全示例// 按插入顺序 MapString, Integer linkedHashMap new LinkedHashMap(); linkedHashMap.put(Java, 1995); linkedHashMap.put(Python, 1991); linkedHashMap.put(C, 1983); System.out.println(linkedHashMap); // 输出保持插入顺序 // 按访问顺序LRU缓存 MapString, Integer lruCache new LinkedHashMap(16, 0.75f, true); lruCache.put(Java, 1995); lruCache.put(Python, 1991); lruCache.put(C, 1983); lruCache.get(Java); // 访问Java System.out.println(lruCache); // Java将移到最后最近访问3.4.3 TreeMapTreeMap是基于红黑树实现的NavigableMap它按照键的自然顺序或者指定的比较器排序。特点基于红黑树实现键按照自然顺序或指定的比较器排序不允许null键但允许多个null值提供了很多额外的方法来处理有序映射性能比HashMap和LinkedHashMap差非同步线程不安全示例TreeMapString, Integer treeMap new TreeMap(); treeMap.put(Java, 1995); treeMap.put(Python, 1991); treeMap.put(C, 1983); System.out.println(treeMap); // 输出按键的字母顺序排序 // 使用比较器 TreeMapString, Integer customTreeMap new TreeMap(Comparator.reverseOrder()); customTreeMap.put(Java, 1995); customTreeMap.put(Python, 1991); customTreeMap.put(C, 1983); System.out.println(customTreeMap); // 输出按键的字母逆序排序3.4.4 HashtableHashtable是早期Java版本中的类现在已经被重新设计为实现Map接口。它类似于HashMap但所有方法都是同步的并且不允许null键或值。特点基于哈希表实现所有方法都是同步的线程安全不允许null键或值性能比HashMap差现在一般不推荐使用除非需要线程安全示例HashtableString, Integer hashtable new Hashtable(); hashtable.put(Java, 1995); hashtable.put(Python, 1991); hashtable.put(C, 1983); System.out.println(hashtable.get(Java)); // 输出: 19953.4.5 PropertiesProperties是Hashtable的子类用于存储字符串键值对。它通常用于读取和写入配置文件。特点继承自Hashtable所以是线程安全的键和值都是字符串可以从流中加载和保存提供了默认值的功能示例Properties properties new Properties(); properties.setProperty(username, admin); properties.setProperty(password, 123456); System.out.println(properties.getProperty(username)); // 输出: admin System.out.println(properties.getProperty(email, defaultexample.com)); // 输出默认值: defaultexample.com // 保存到文件 try (FileOutputStream out new FileOutputStream(config.properties)) { properties.store(out, Configuration); } catch (IOException e) { e.printStackTrace(); } // 从文件加载 Properties loadedProps new Properties(); try (FileInputStream in new FileInputStream(config.properties)) { loadedProps.load(in); System.out.println(loadedProps.getProperty(username)); // 输出: admin } catch (IOException e) { e.printStackTrace(); }4. 工具类Java集合框架提供了两个主要的工具类用于对集合和数组进行操作。4.1 Collections类Collections类提供了一系列静态方法用于操作和返回集合。主要方法排序sort(ListT list)- 使用自然顺序对列表进行排序sort(ListT list, Comparator? super T c)- 使用比较器对列表进行排序查找binarySearch(List? extends Comparable? super T list, T key)- 使用二分查找算法查找元素max(Collection? extends T coll)- 返回最大元素min(Collection? extends T coll)- 返回最小元素frequency(Collection? c, Object o)- 返回指定元素在集合中出现的次数修改reverse(List? list)- 反转列表shuffle(List? list)- 随机打乱列表swap(List? list, int i, int j)- 交换列表中的两个元素fill(List? super T list, T obj)- 用指定元素替换列表中的所有元素copy(List? super T dest, List? extends T src)- 复制列表rotate(List? list, int distance)- 旋转列表replaceAll(ListT list, T oldVal, T newVal)- 替换列表中所有的指定元素特殊集合unmodifiableXXX(XXX? extends T c)- 返回不可修改的视图synchronizedXXX(XXXT c)- 返回同步的视图checkedXXX(XXXE c, ClassE type)- 返回类型检查的视图emptyXXX()- 返回空集合singletonXXX(T o)- 返回只包含一个元素的集合示例ListInteger numbers new ArrayList(); numbers.add(3); numbers.add(1); numbers.add(2); // 排序 Collections.sort(numbers); System.out.println(numbers); // 输出: [1, 2, 3] // 二分查找 int index Collections.binarySearch(numbers, 2); System.out.println(index); // 输出: 1 // 反转 Collections.reverse(numbers); System.out.println(numbers); // 输出: [3, 2, 1] // 打乱 Collections.shuffle(numbers); System.out.println(numbers); // 输出随机顺序 // 不可修改的集合 ListInteger unmodifiableList Collections.unmodifiableList(numbers); try { unmodifiableList.add(4); // 抛出UnsupportedOperationException } catch (UnsupportedOperationException e) { System.out.println(Cannot modify unmodifiable list); } // 同步集合 ListInteger synchronizedList Collections.synchronizedList(numbers); // 单例集合 SetInteger singletonSet Collections.singleton(1);4.2 Arrays类Arrays类提供了一系列静态方法用于操作数组。主要方法排序sort(T[] a)- 使用自然顺序对数组进行排序sort(T[] a, Comparator? super T c)- 使用比较器对数组进行排序parallelSort(T[] a)- 使用并行排序算法对数组进行排序查找binarySearch(T[] a, T key)- 使用二分查找算法查找元素比较和填充equals(T[] a, T[] a2)- 比较两个数组是否相等fill(T[] a, T val)- 用指定值填充数组copyOf(T[] original, int newLength)- 复制数组copyOfRange(T[] original, int from, int to)- 复制数组的指定范围转换asList(T... a)- 返回由指定数组支持的固定大小的列表stream(T[] array)- 返回由数组支持的顺序Stream其他toString(T[] a)- 返回数组的字符串表示形式deepToString(Object[] a)- 返回多维数组的字符串表示形式hashCode(T[] a)- 返回数组的哈希码deepHashCode(Object[] a)- 返回多维数组的哈希码setAll(T[] array, IntFunction? extends T generator)- 使用生成器函数设置数组的所有元素示例Integer[] numbers {3, 1, 2}; // 排序 Arrays.sort(numbers); System.out.println(Arrays.toString(numbers)); // 输出: [1, 2, 3] // 二分查找 int index Arrays.binarySearch(numbers, 2); System.out.println(index); // 输出: 1 // 填充 Arrays.fill(numbers, 0); System.out.println(Arrays.toString(numbers)); // 输出: [0, 0, 0] // 复制 Integer[] original {1, 2, 3}; Integer[] copy Arrays.copyOf(original, 5); System.out.println(Arrays.toString(copy)); // 输出: [1, 2, 3, null, null] // 转换为List ListInteger list Arrays.asList(1, 2, 3); System.out.println(list); // 输出: [1, 2, 3] // 注意: 返回的列表是固定大小的不能添加或删除元素 // 多维数组 Integer[][] matrix {{1, 2}, {3, 4}}; System.out.println(Arrays.deepToString(matrix)); // 输出: [[1, 2], [3, 4]]5. 特殊集合5.1 Legacy集合Legacy集合是Java 1.2之前就存在的集合类它们已经被重新设计为适应集合框架。包括Vector- 线程安全的动态数组Stack- 继承自Vector的LIFO栈Hashtable- 线程安全的哈希表Properties- 继承自Hashtable的字符串键值对存储EnumerationE- 元素枚举接口类似于Iterator尽管这些类现在都是集合框架的一部分但它们的设计与框架中的其他部分不太协调。一般情况下应该使用它们的替代品ArrayList、HashMap等。5.2 并发集合Java提供了许多线程安全的集合实现它们位于java.util.concurrent包中。主要类ConcurrentHashMap- 高并发、高性能的线程安全HashMapCopyOnWriteArrayList- 线程安全的ArrayList适用于读多写少的场景CopyOnWriteArraySet- 使用CopyOnWriteArrayList实现的线程安全SetConcurrentLinkedQueue- 线程安全的非阻塞队列ConcurrentLinkedDeque- 线程安全的非阻塞双端队列ConcurrentSkipListMap- 线程安全的NavigableMapConcurrentSkipListSet- 线程安全的NavigableSetArrayBlockingQueue- 基于数组的有界阻塞队列LinkedBlockingQueue- 基于链表的可选有界阻塞队列PriorityBlockingQueue- 支持优先级的无界阻塞队列DelayQueue- 延迟元素的无界阻塞队列LinkedTransferQueue- 基于链表的无界传输队列LinkedBlockingDeque- 基于链表的可选有界阻塞双端队列SynchronousQueue- 没有内部容量的阻塞队列示例// ConcurrentHashMap MapString, Integer concurrentMap new ConcurrentHashMap(); concurrentMap.put(Java, 1995); concurrentMap.put(Python, 1991); System.out.println(concurrentMap.get(Java)); // 输出: 1995 // CopyOnWriteArrayList ListString copyOnWriteList new CopyOnWriteArrayList(); copyOnWriteList.add(Java); copyOnWriteList.add(Python); // 适合多线程读操作多写操作少的场景 // ArrayBlockingQueue BlockingQueueString blockingQueue new ArrayBlockingQueue(10); // 容量为10 blockingQueue.put(Java); // 如果队列已满put方法会阻塞 String item blockingQueue.take(); // 如果队列为空take方法会阻塞 System.out.println(item); // 输出: Java5.3 不可变集合不可变集合是指创建后不能修改的集合。Java提供了几种方式来创建不可变集合Collections工具类Collections.unmodifiableXXX(XXXT c)- 返回不可修改的视图List.of()、Set.of()和Map.of()方法Java 9创建不可变的集合Guava库的ImmutableXXX类提供了更丰富的不可变集合操作示例// 使用Collections ListString modifiableList new ArrayList(); modifiableList.add(Java); modifiableList.add(Python); ListString unmodifiableList Collections.unmodifiableList(modifiableList); // 使用Java 9的工厂方法 ListString immutableList List.of(Java, Python, C); SetString immutableSet Set.of(Java, Python, C); MapString, Integer immutableMap Map.of(Java, 1995, Python, 1991, C, 1983); // 尝试修改不可变集合会抛出UnsupportedOperationException try { immutableList.add(Go); } catch (UnsupportedOperationException e) { System.out.println(Cannot modify immutable list); }6. 集合操作6.1 遍历集合Java提供了多种方式来遍历集合使用IteratorListString list new ArrayList(); list.add(Java); list.add(Python); list.add(C); IteratorString iterator list.iterator(); while (iterator.hasNext()) { String element iterator.next(); System.out.println(element); // 安全地删除元素 if (element.equals(Python)) { iterator.remove(); } }使用for-each循环for (String element : list) { System.out.println(element); // 注意: 在for-each循环中不能安全地修改集合 }使用索引仅适用于Listfor (int i 0; i list.size(); i) { System.out.println(list.get(i)); }使用forEach方法Java 8list.forEach(element - System.out.println(element)); // 或使用方法引用 list.forEach(System.out::println);使用Stream APIJava 8list.stream() .filter(element - element.startsWith(J)) .forEach(System.out::println);6.2 排序集合使用Collections.sort()ListString list new ArrayList(); list.add(C); list.add(Python); list.add(Java); // 自然顺序排序 Collections.sort(list); System.out.println(list); // 输出: [C, Java, Python] // 使用比较器排序 Collections.sort(list, Comparator.reverseOrder()); System.out.println(list); // 输出: [Python, Java, C]使用List.sort()Java 8// 自然顺序排序 list.sort(null); System.out.println(list); // 输出: [C, Java, Python] // 使用比较器排序 list.sort(Comparator.reverseOrder()); System.out.println(list); // 输出: [Python, Java, C]使用TreeSet或TreeMap自动排序SetString treeSet new TreeSet(); treeSet.add(C); treeSet.add(Python); treeSet.add(Java); System.out.println(treeSet); // 输出: [C, Java, Python]使用Stream API排序Java 8ListString sortedList list.stream() .sorted() .collect(Collectors.toList()); System.out.println(sortedList); // 输出: [C, Java, Python]6.3 集合间的转换Collection转数组ListString list new ArrayList(); list.add(Java); list.add(Python); // 转换为Object数组 Object[] objectArray list.toArray(); // 转换为指定类型的数组 String[] stringArray list.toArray(new String[0]); // 或使用Java 11的新方法 String[] stringArray2 list.toArray(String[]::new);数组转CollectionString[] array {Java, Python, C}; // 使用Arrays.asList() - 返回固定大小的List ListString list Arrays.asList(array); // 使用new ArrayList(Arrays.asList()) - 返回可调整大小的List ListString modifiableList new ArrayList(Arrays.asList(array)); // 使用List.of() - 返回不可变ListJava 9 ListString immutableList List.of(array); // 使用Stream APIJava 8 ListString streamList Arrays.stream(array).collect(Collectors.toList()); SetString streamSet Arrays.stream(array).collect(Collectors.toSet());Collection之间的转换ListString list new ArrayList(); list.add(Java); list.add(Python); list.add(Java); // 重复元素 // List转Set移除重复元素 SetString set new HashSet(list); System.out.println(set); // 输出: [Java, Python] // Set转List ListString newList new ArrayList(set); // 使用Stream API ListString streamList set.stream().collect(Collectors.toList()); SetString streamSet list.stream().collect(Collectors.toSet());Map与Collection的转换MapString, Integer map new HashMap(); map.put(Java, 1995); map.put(Python, 1991); // 获取键的集合 SetString keys map.keySet(); // 获取值的集合 CollectionInteger values map.values(); // 获取键值对的集合 SetMap.EntryString, Integer entries map.entrySet(); // Collection转Map使用Stream API ListString list Arrays.asList(Java, Python, C); MapString, Integer lengthMap list.stream() .collect(Collectors.toMap( s - s, // 键映射函数 String::length // 值映射函数 )); System.out.println(lengthMap); // 输出: {Java4, C3, Python6}7. 高级主题7.1 泛型与集合Java泛型允许在编译时提供类型安全性使集合更加类型安全。示例// 不使用泛型Java 5之前 List list new ArrayList(); list.add(Java); list.add(1); // 可以添加任何类型的对象 String s (String) list.get(0); // 需要强制类型转换 Integer i (Integer) list.get(1); // 需要强制类型转换 // 使用泛型Java 5 ListString stringList new ArrayList(); stringList.add(Java); // stringList.add(1); // 编译错误只能添加String类型 String s2 stringList.get(0); // 不需要强制类型转换泛型通配符?- 无界通配符表示任何类型? extends T- 上界通配符表示T或T的子类型? super T- 下界通配符表示T或T的超类型示例// 使用上界通配符 List? extends Number numbers new ArrayListInteger(); // 合法 // numbers.add(1); // 不合法不能添加元素 Number n numbers.get(0); // 合法可以获取元素 // 使用下界通配符 List? super Integer integers new ArrayListNumber(); // 合法 integers.add(1); // 合法可以添加Integer // Integer i integers.get(0); // 不合法不能直接获取 Object o integers.get(0); // 合法可以获取为ObjectPECS原则Producer Extends, Consumer Super如果你只需要从集合中获取元素生产者使用? extends T如果你只需要向集合中添加元素消费者使用? super T7.2.1 Comparable接口Comparable接口允许类的对象进行自然排序。实现这个接口的类必须提供compareTo方法。public class Student implements ComparableStudent { private String name; private int age; public Student(String name, int age) { this.name name; this.age age; } Override public int compareTo(Student other) { // 按年龄升序排序 return this.age - other.age; } Override public String toString() { return name ( age ); } } // 使用 ListStudent students new ArrayList(); students.add(new Student(Alice, 22)); students.add(new Student(Bob, 20)); students.add(new Student(Charlie, 25)); Collections.sort(students); // 使用自然顺序排序 System.out.println(students); // 按年龄升序输出7.2.2 Comparator接口Comparator接口提供了一种外部比较策略允许在不修改类的情况下定义多种排序方式。public class Student { private String name; private int age; public Student(String name, int age) { this.name name; this.age age; } public String getName() { return name; } public int getAge() { return age; } Override public String toString() { return name ( age ); } } // 使用Comparator ListStudent students new ArrayList(); students.add(new Student(Alice, 22)); students.add(new Student(Bob, 20)); students.add(new Student(Charlie, 25)); // 按年龄排序 Collections.sort(students, new ComparatorStudent() { Override public int compare(Student s1, Student s2) { return s1.getAge() - s2.getAge(); } }); System.out.println(students); // 按年龄升序输出 // 使用Lambda表达式Java 8 Collections.sort(students, (s1, s2) - s1.getAge() - s2.getAge()); // 使用Comparator静态方法Java 8 Collections.sort(students, Comparator.comparingInt(Student::getAge)); // 按姓名排序 Collections.sort(students, Comparator.comparing(Student::getName)); System.out.println(students); // 按姓名升序输出 // 组合比较器 ComparatorStudent byAgeDesc Comparator.comparingInt(Student::getAge).reversed(); ComparatorStudent byNameThenAgeDesc Comparator.comparing(Student::getName) .thenComparing(byAgeDesc); students.sort(byNameThenAgeDesc);7.3 自定义集合实现尽管Java集合框架提供了丰富的实现但有时您可能需要创建自定义的集合类。创建自定义集合的方式扩展现有集合类public class LoggingArrayListE extends ArrayListE { private static final long serialVersionUID 1L; Override public boolean add(E e) { System.out.println(Adding element: e); return super.add(e); } Override public E remove(int index) { E element super.remove(index); System.out.println(Removed element at index index : element); return element; } }实现集合接口public class SimpleArrayListE implements ListE { private Object[] elements; private int size; public SimpleArrayList() { elements new Object[10]; size 0; } Override public boolean add(E e) { ensureCapacity(); elements[size] e; return true; } SuppressWarnings(unchecked) Override public E get(int index) { checkIndex(index); return (E) elements[index]; } Override public int size() { return size; } // 省略其他必要的方法实现... private void ensureCapacity() { if (size elements.length) { elements Arrays.copyOf(elements, size * 2); } } private void checkIndex(int index) { if (index 0 || index size) { throw new IndexOutOfBoundsException(Index: index , Size: size); } } }使用组合而非继承public class CountingSetE implements SetE { private final SetE delegate; private int addCount 0; public CountingSet(SetE delegate) { this.delegate delegate; } Override public boolean add(E e) { addCount; return delegate.add(e); } Override public boolean addAll(Collection? extends E c) { addCount c.size(); return delegate.addAll(c); } public int getAddCount() { return addCount; } // 委托其他方法到delegate Override public int size() { return delegate.size(); } // 省略其他委托方法... }8. 最佳实践与常见陷阱8.1 选择合适的集合选择集合时应考虑的因素需要存储的元素类型访问模式随机访问 vs. 顺序访问是否需要保持顺序是否允许重复元素是否需要线程安全性能需求常见集合的选择指南需要快速随机访问ArrayList频繁在中间插入/删除元素LinkedList不允许重复元素没有特定顺序要求HashSet不允许重复元素需要维护插入顺序LinkedHashSet不允许重复元素需要元素保持排序TreeSet需要键值对映射没有特定顺序要求HashMap需要键值对映射需要维护插入顺序LinkedHashMap需要键值对映射需要键保持排序TreeMap需要FIFO队列LinkedList或ArrayDeque需要LIFO栈ArrayDeque需要优先级队列PriorityQueue需要线程安全考虑java.util.concurrent包中的集合8.2 性能考虑各种集合操作的时间复杂度集合类型添加删除获取包含迭代ArrayListO(1)*O(n)O(1)O(n)O(n)LinkedListO(1)O(1)*O(n)O(n)O(n)HashSetO(1)O(1)N/AO(1)O(n)LinkedHashSetO(1)O(1)N/AO(1)O(n)TreeSetO(log n)O(log n)N/AO(log n)O(n)HashMapO(1)O(1)O(1)O(1)O(n)LinkedHashMapO(1)O(1)O(1)O(1)O(n)TreeMapO(log n)O(log n)O(log n)O(log n)O(n)*平均情况最坏情况可能是O(n)性能优化技巧为集合预分配容量避免频繁扩容使用适当的初始容量和负载因子优先使用批量操作如addAll避免在for-each循环中删除元素在合适的场景使用并行流8.3 常见陷阱并发修改异常在迭代过程中修改集合可能会导致ConcurrentModificationExceptionListString list new ArrayList(); list.add(Java); list.add(Python); list.add(C); // 错误方式可能抛出ConcurrentModificationException for (String language : list) { if (language.equals(Python)) { list.remove(language); } } // 正确方式1使用Iterator的remove方法 IteratorString iterator list.iterator(); while (iterator.hasNext()) { String language iterator.next(); if (language.equals(Python)) { iterator.remove(); } } // 正确方式2使用removeIf方法Java 8 list.removeIf(language - language.equals(Python));Arrays.asList()的固定大小Arrays.asList()返回的列表是固定大小的不能添加或删除元素String[] array {Java, Python, C}; ListString list Arrays.asList(array); try { list.add(Go); // 抛出UnsupportedOperationException } catch (UnsupportedOperationException e) { System.out.println(Cannot add to fixed-size list); } // 解决方案转换为ArrayList ListString modifiableList new ArrayList(Arrays.asList(array)); modifiableList.add(Go); // 正常工作Map.keySet()和values()返回的视图Map.keySet()和values()返回的集合是Map的视图修改这些集合会影响原始MapMapString, Integer map new HashMap(); map.put(Java, 1995); map.put(Python, 1991); SetString keys map.keySet(); keys.remove(Java); // 同时从map中移除Java键值对 System.out.println(map); // 输出: {Python1991}HashSet和HashMap的hashCode()和equals()合约当使用自定义类作为HashSet的元素或HashMap的键时必须正确实现hashCode()和equals()方法public class Person { private String name; private int age; // 构造函数、getter和setter省略 Override public boolean equals(Object o) { if (this o) return true; if (o null || getClass() ! o.getClass()) return false; Person person (Person) o; return age person.age Objects.equals(name, person.name); } Override public int hashCode() { return Objects.hash(name, age); } }线程安全问题大多数集合类都不是线程安全的在多线程环境中使用时需要同步// 方式1使用Collections的同步包装器 ListString synchronizedList Collections.synchronizedList(new ArrayList()); MapString, Integer synchronizedMap Collections.synchronizedMap(new HashMap()); // 方式2使用并发集合 ListString concurrentList new CopyOnWriteArrayList(); MapString, Integer concurrentMap new ConcurrentHashMap();比较器的一致性当使用自定义比较器时确保符合一致性要求// 不一致的比较器违反了传递性 ComparatorInteger inconsistentComparator new ComparatorInteger() { Override public int compare(Integer a, Integer b) { return (a % 2) - (b % 2); // 只比较奇偶性 } };9. 总结与进阶学习9.1 总结Java集合框架提供了一组丰富的接口和实现类用于存储和操作数据核心接口Collection, List, Set, Queue, Deque, Map主要实现ArrayList, LinkedList, HashSet, LinkedHashSet, TreeSet, HashMap, LinkedHashMap, TreeMap特殊集合并发集合ConcurrentHashMap等、不可变集合Collections.unmodifiableXXX等工具类Collections, Arrays选择合适的集合类型取决于多种因素包括访问模式、排序要求、性能需求等。9.2 进阶学习路径要深入学习Java集合框架可以考虑以下进阶主题Java 8 Stream API更加函数式的集合操作方式并发集合和原子操作java.util.concurrent包中的类第三方集合库如Apache Commons Collections, Google Guava集合性能优化如何优化集合操作的性能数据结构原理学习集合类背后的数据结构9.3 学习资源书籍“Java核心技术”Horstmann Cornell“Effective Java”Joshua Bloch“Java编程思想”Bruce Eckel在线资源Java官方文档https://docs.oracle.com/en/java/javase/Java Tutorials: https://docs.oracle.com/javase/tutorial/collections/Baeldung关于Java集合的文章https://www.baeldung.com/java-collections说真的这两年看着身边一个个搞Java、C、前端、数据、架构的开始卷大模型挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis稳稳当当过日子。结果GPT、DeepSeek火了之后整条线上的人都开始有点慌了大家都在想“我是不是要学大模型不然这饭碗还能保多久”先给出最直接的答案一定要把现有的技术和大模型结合起来而不是抛弃你们现有技术掌握AI能力的Java工程师比纯Java岗要吃香的多。即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇如何学习AGI大模型作为一名热心肠的互联网老兵我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。因篇幅有限仅展示部分资料需要点击下方链接即可前往获取2025最新版CSDN大礼包《AGI大模型学习资源包》免费分享**一、2025最新大模型学习路线一个明确的学习路线可以帮助新人了解从哪里开始按照什么顺序学习以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛没有明确的学习路线可能会导致新人感到迷茫不知道应该专注于哪些内容。我们把学习路线分成L1到L4四个阶段一步步带你从入门到进阶从理论到实战。L1级别:AI大模型时代的华丽登场L1阶段我们会去了解大模型的基础知识以及大模型在各个行业的应用和分析学习理解大模型的核心原理关键技术以及大模型应用场景通过理论原理结合多个项目实战从提示工程基础到提示工程进阶掌握Prompt提示工程。L2级别AI大模型RAG应用开发工程L2阶段是我们的AI大模型RAG应用开发工程我们会去学习RAG检索增强生成包括Naive RAG、Advanced-RAG以及RAG性能评估还有GraphRAG在内的多个RAG热门项目的分析。L3级别大模型Agent应用架构进阶实践L3阶段大模型Agent应用架构进阶实现我们会去学习LangChain、 LIamaIndex框架也会学习到AutoGPT、 MetaGPT等多Agent系统打造我们自己的Agent智能体同时还可以学习到包括Coze、Dify在内的可视化工具的使用。L4级别大模型微调与私有化部署L4阶段大模型的微调和私有化部署我们会更加深入的探讨Transformer架构学习大模型的微调技术利用DeepSpeed、Lamam Factory等工具快速进行模型微调并通过Ollama、vLLM等推理部署框架实现模型的快速部署。整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握而L3 L4更多的是通过项目实战来掌握大模型的应用开发针对以上大模型的学习路线我们也整理了对应的学习视频教程和配套的学习资料。二、大模型经典PDF书籍书籍和学习文档资料是学习大模型过程中必不可少的我们精选了一系列深入探讨大模型技术的书籍和学习文档它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。书籍含电子版PDF三、大模型视频教程对于很多自学或者没有基础的同学来说书籍这些纯文字类的学习教材会觉得比较晦涩难以理解因此我们提供了丰富的大模型视频教程以动态、形象的方式展示技术概念帮助你更快、更轻松地掌握核心知识。四、大模型项目实战学以致用当你的理论知识积累到一定程度就需要通过项目实战在实际操作中检验和巩固你所学到的知识同时为你找工作和职业发展打下坚实的基础。五、大模型面试题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我们将提供精心整理的大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。因篇幅有限仅展示部分资料需要点击下方链接即可前往获取2025最新版CSDN大礼包《AGI大模型学习资源包》免费分享