源码来源:OpenJDK 10
解读对象
- synchronizedCollection(Collection<T> c)
- synchronizedList(List<T> list)
- synchronizedSet(Set<T> s)
- synchronizedSortedSet(SortedSet<T> s)
- synchronizedNavigableSet(NavigableSet<T> s)
- synchronizedMap(Map<K, V> m)
- synchronizedSortedMap(SortedMap<K,V> m)
- synchronizedNavigableMap(NavigableMap<K,V> m)
Collections.synchronizedCollection(Collection<E> c)
该方法可以将一个Collection包装为同步(线程安全)的List。但是通过Iterator、Spliterator或Stream遍历这个新List时,需要在外部做好同步
Collection c = Collections.synchronizedCollection(myCollection); synchronized (c) { Iterator i = c.iterator(); // Must be in the synchronized block while (i.hasNext()) foo(i.next()); }
SynchronizedCollection
构造方法
SynchronizedCollection(Collection<E> c)
创建一个SynchronizedCollection,并将指定的集合c作为内部集合
此方法会将SynchronizedCollection实例本身作为互斥体(mutex)
SynchronizedCollection(Collection<E> c, Object mutex)
创建一个SynchronizedCollection,并将指定的集合作为内部集合,将指定的对象作为互斥体(mutex)
其它方法
SynchronizedCollection的以下方法都是对互斥体进行同步,再调用内部list实例上的相应方法:
size()
isEmpty()
contains(Object o)
toArray()
toArray(T[] a)
add(E e)
remove(Object o)
containsAll(Collection<?> coll)
addAll(Collection<? extends E> coll)
removeAll(Collection<?> coll)
retainAll(Collection<?> coll)
clear()
toString()
forEach(Consumer<? super E> consumer)
removeIf(Predicate<? super E> filter)
因为对ListIterator的线程安全式使用需要在外部额外的同步,所以以下3个方法没有同步的必要:
spliterator()
stream()
parallelStream()
Collections.synchronizedList(List<T> list)
- 该方法可以将一个List包装为同步(线程安全)的List。但是通过Iterator、Spliterator或Stream遍历这个新List时,需要在外部做好同步(参照Collections.synchronizedCollection(Collection<E> c))。
- 因为同步实现方式相同,所以包装后的List性能与Vector相当。
- 如果原List是RandomAccess,该方法会用Collections.SynchronizedRandomAccessList类包装;
- 否则就是用Collections.SynchronizedList类包装
- RandomAccess是一个空接口,不包含任何方法。它主要用于标记List接口的实现类支持快速随机获取(通常指时间复杂度为O(1))。ArrayList就是RandomAccess,而LinkedList不是
SynchronizedList
此类继承自SynchronizedCollection,并实现List接口
构造方法
SynchronizedList(List<E> list)
创建一个SynchronizedList,并将指定的list作为内部列表
此方法会将SynchronizedList实例本身作为同步互斥体(mutex)
Collections.synchronizedList方法内部调用的就是此方法
SynchronizedList(List<E> list, Object mutex)
创建一个SynchronizedList,并将指定的list作为内部列表,将指定的对象作为同步互斥体(mutex)
其它方法
SynchronizedList的以下方法都是对互斥体进行同步,再调用内部list实例上的相应方法:
equals(Object o)
hashCode()
get(int index)
set(int index, E element)
add(int index, E element)
remove(int index)
indexOf(Object o)
lastIndexOf(Object o)
addAll(int index, Collection<? extends E> c)
replaceAll(UnaryOperator<E> operator)
sort(Comparator<? super E> c)
因为对ListIterator的线程安全式使用需要在外部额外的同步,所以以下2个方法没有同步的必要:
listIterator()
listIterator(int index)
subList(int fromIndex, int toIndex)
该方法也对互斥体进行了同步,并将内部list的subList方法返回的实例封装为SynchronizedList,且指定互斥体为原SynchronizedList的互斥体
(subList这类方法使用场景少,实现复杂,真的有些吃力不讨好)
SynchronizedRandomAccessList
此类继承自SynchronizedList,并实现RandomAccess接口
与SynchronizedList不同之处:subList的返回值是被包装成SynchronizedRandomAccessList
构造方法
SynchronizedRandomAccessList(List<E> list)
创建一个SynchronizedRandomAccessList;内部就是调用SynchronizedList(List<E> list)
Collections.synchronizedList方法内部调用的就是此方法
SynchronizedRandomAccessList(List<E> list, Object mutex)
创建一个SynchronizedRandomAccessList;内部就是调用SynchronizedList(List<E> list, Object mutex)
相关推荐
在Java编程中,`List`接口是集合框架的重要组成部分,提供了有序的元素存储。...通过阅读和理解`Collections.sort()`的源码,开发者可以进一步提升自己的技能,同时也能更好地理解和运用其他Java集合框架的方法。
代码中两次使用了`Collections.frequency(list, "abc")`和`Collections.frequency(list, "123")`分别计算"abc"和"123"在列表中出现的次数。 通过这些例子,我们可以看到`Collections`类如何方便地对Java集合进行...
commons-collections-20040616.jar, ...commons-collections.jar, commons-collections3-3.2.1.jar, commons-collections4-4.1-javadoc.jar, commons-collections4-4.1-src.zip, commons-collections4-4.1.jar
例如,Collections.sort()方法可以对List进行排序,而Collections.synchronizedXXX()方法则可以帮助我们创建线程安全的集合。 在实际开发中,选择合适的集合类型和方法至关重要。例如,当我们需要保持元素插入顺序...
Java中Collections.sort排序详解 Java中的Collections.sort排序是Java.util.Collections类中的一个静态方法,用于对列表进行排序。下面将详细介绍Collections.sort排序的使用和实现机制。 Collections.sort()方法...
《iesi.collections.dll:C# .Net集合全版本解析》 iesi.collections.dll是一个与C#编程语言和.Net框架紧密相关的动态链接库文件,它包含了用于处理集合操作的一系列类和方法。在.NET环境中,集合是存储和管理对象...
例如,`Collections.sort()` 可用于对列表进行排序,`Map.merge()` 可以原子性地更新键值对。 通过深入学习《Java Generics and Collections》,开发者不仅可以掌握如何编写类型安全的代码,还能有效地组织和操作...
标题中的"Collections.synchronizedList"是指Java集合框架中的一个静态工厂方法,用于将任何List转换为线程安全的List。这个方法是Java中实现多线程环境下的集合操作的重要工具,确保在并发访问时数据的一致性和完整...
在Kotlin编程语言中,`kotlinx.collections.immutable`是一个重要的库,它提供了不可变集合的实现。不可变集合是一旦创建后就不能修改的集合,这种数据结构在多线程环境、函数式编程和构建安全的数据模型时非常有用...
Java Collections.sort()实现List排序的默认方法和自定义方法 Java Collections.sort()是Java语言中用于对List进行排序的方法,通过使用这个方法可以对List进行默认排序,也可以根据需要实现自定义的排序规则。 ...
在Java编程语言中,`Collections.sort()` 是一个非常重要的函数,它用于对集合中的元素进行排序。这个函数是 `java.util.Collections` 类的一个静态方法,适用于列表(List)类型的集合。`Collections.sort()` 可以...
在Java编程语言中,`Collections.shuffle()`方法是一个非常实用的工具,它用于对集合中的元素进行随机排序。这个方法在处理各种数据集时,比如游戏中打乱卡片顺序、抽奖程序或者任何需要随机化顺序的场景,都发挥着...
在Java编程语言中,`Collections.sort()` 方法是一个非常重要的工具,用于对List接口实现的集合进行排序。这个方法使得开发者能够方便地按照指定的顺序排列集合中的元素。本篇文章将详细探讨如何使用 `Collections....