//一个操作集合的工具类,里面全部都是静态方法。
//根据元素的自然顺序进行排序
public static <T extends Comparable<? super T>> void sort(List<T> list) {
//转为array
Object[] a = list.toArray();
//排序
Arrays.sort(a);
ListIterator<T> i = list.listIterator();
//设置值
for (int j=0; j<a.length; j++) {
i.next();
i.set((T)a[j]);
}
}
//根据传入的比较器对元素进行排序
public static <T> void sort(List<T> list, Comparator<? super T> c) {
Object[] a = list.toArray();
Arrays.sort(a, (Comparator)c);
ListIterator i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set(a[j]);
}
}
//使用二分查找法根据指定key查询对象
public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) {
//没有传入比较器
if (c==null)
return binarySearch((List) list, key);
if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
return Collections.indexedBinarySearch(list, key, c);
else
return Collections.iteratorBinarySearch(list, key, c);
}
public static <T>
int binarySearch(List<? extends Comparable<? super T>> list, T key) {
if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
return Collections.indexedBinarySearch(list, key);
else
return Collections.iteratorBinarySearch(list, key);
}
private static <T>
int indexedBinarySearch(List<? extends Comparable<? super T>> list, T key)
{
int low = 0;
int high = list.size()-1;
while (low <= high) {
int mid = (low + high) >>> 1;
Comparable<? super T> midVal = list.get(mid);
int cmp = midVal.compareTo(key);
//比他小往右边找
if (cmp < 0)
low = mid + 1;
//比他大往左边找
else if (cmp > 0)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found
}
//将指定元素添加到collection中
public static <T> boolean addAll(Collection<? super T> c, T... elements) {
boolean result = false;
for (T element : elements)
result |= c.add(element);
return result;
}
//以后进先出的形式返回某个deque视图
public static <T> Queue<T> asLifoQueue(Deque<T> deque) {
return new AsLIFOQueue<>(deque);
}
//返回一个动态类型安全的collection插入错误的类型会直接抛出ClassCastException异常
//其实现就是在添加元素的时候加入类型检查
public static <E> Collection<E> checkedCollection(Collection<E> c,
Class<E> type) {
return new CheckedCollection<>(c, type);
}
//返回一个动态类型安全的list插入错误的类型会直接抛出ClassCastException异常
//其实现就是在添加元素的时候加入类型检查
public static <E> List<E> checkedList(List<E> list, Class<E> type) {
return (list instanceof RandomAccess ?
new CheckedRandomAccessList<>(list, type) :
new CheckedList<>(list, type));
}
//返回一个动态类型安全的map插入错误的类型会直接抛出ClassCastException异常
//其实现就是在添加元素的时候加入类型检查
public static <K, V> Map<K, V> checkedMap(Map<K, V> m,
Class<K> keyType,
Class<V> valueType) {
return new CheckedMap<>(m, keyType, valueType);
}
//将元素从一个列表复制到另一个列表
public static <T> void copy(List<? super T> dest, List<? extends T> src) {
int srcSize = src.size();
if (srcSize > dest.size())
throw new IndexOutOfBoundsException("Source does not fit in dest");
if (srcSize < COPY_THRESHOLD ||
(src instanceof RandomAccess && dest instanceof RandomAccess)) {
for (int i=0; i<srcSize; i++)
dest.set(i, src.get(i));
} else {
ListIterator<? super T> di=dest.listIterator();
ListIterator<? extends T> si=src.listIterator();
for (int i=0; i<srcSize; i++) {
di.next();
di.set(si.next());
}
}
}
//如果两个集合中没有相同的元素则返回true
public static boolean disjoint(Collection<?> c1, Collection<?> c2) {
Collection<?> contains = c2;
Collection<?> iterate = c1;
//注释上写的这样效率更高
if (c1 instanceof Set) {
iterate = c2;
contains = c1;
} else if (!(c2 instanceof Set)) {
int c1size = c1.size();
int c2size = c2.size();
if (c1size == 0 || c2size == 0) {
return true;
}
//大的包含小的效率更高
if (c1size > c2size) {
iterate = c2;
contains = c1;
}
}
for (Object e : iterate) {
if (contains.contains(e)) {
// Found a common element. Collections are not disjoint.
return false;
}
}
return true;
}
//用指定的元素替换列表中的所有元素
public static <T> void fill(List<? super T> list, T obj) {
int size = list.size();
//小于25或者支持随机访问
if (size < FILL_THRESHOLD || list instanceof RandomAccess) {
for (int i=0; i<size; i++)
list.set(i, obj);
} else {
ListIterator<? super T> itr = list.listIterator();
for (int i=0; i<size; i++) {
itr.next();
itr.set(obj);
}
}
}
//返回集合中等于元素的个数
public static int frequency(Collection<?> c, Object o) {
int result = 0;
if (o == null) {
for (Object e : c)
if (e == null)
result++;
} else {
for (Object e : c)
if (o.equals(e))
result++;
}
return result;
}
//返回source中第一次出现在target的位置
public static int indexOfSubList(List<?> source, List<?> target) {
int sourceSize = source.size();
int targetSize = target.size();
//如果源列表比目标列表短则直接返回-1
int maxCandidate = sourceSize - targetSize;
if (sourceSize < INDEXOFSUBLIST_THRESHOLD ||
(source instanceof RandomAccess&&target instanceof RandomAccess)) {
nextCand:
for (int candidate = 0; candidate <= maxCandidate; candidate++) {
for (int i=0, j=candidate; i<targetSize; i++, j++)
//如果不相等则重新循环
if (!eq(target.get(i), source.get(j)))
continue nextCand;
return candidate;
}
} else { // Iterator version of above algorithm
ListIterator<?> si = source.listIterator();
nextCand:
for (int candidate = 0; candidate <= maxCandidate; candidate++) {
ListIterator<?> ti = target.listIterator();
for (int i=0; i<targetSize; i++) {
if (!eq(ti.next(), si.next())) {
//回溯si的指针
for (int j=0; j<i; j++)
si.previous();
continue nextCand;
}
}
return candidate;
}
}
return -1; // No candidate matched the target
}
//返回source中最后一次出现在target的位置
public static int lastIndexOfSubList(List<?> source, List<?> target) {
int sourceSize = source.size();
int targetSize = target.size();
int maxCandidate = sourceSize - targetSize;
if (sourceSize < INDEXOFSUBLIST_THRESHOLD ||
source instanceof RandomAccess) { // Index access version
nextCand:
for (int candidate = maxCandidate; candidate >= 0; candidate--) {
for (int i=0, j=candidate; i<targetSize; i++, j++)
if (!eq(target.get(i), source.get(j)))
continue nextCand; // Element mismatch, try next cand
return candidate; // All elements of candidate matched target
}
} else { // Iterator version of above algorithm
if (maxCandidate < 0)
return -1;
ListIterator<?> si = source.listIterator(maxCandidate);
nextCand:
for (int candidate = maxCandidate; candidate >= 0; candidate--) {
ListIterator<?> ti = target.listIterator();
for (int i=0; i<targetSize; i++) {
if (!eq(ti.next(), si.next())) {
if (candidate != 0) {
// Back up source iterator to next candidate
for (int j=0; j<=i+1; j++)
si.previous();
}
continue nextCand;
}
}
return candidate;
}
}
return -1; // No candidate matched the target
}
//根据元素的自然顺序返回最大值
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {
Iterator<? extends T> i = coll.iterator();
T candidate = i.next();
while (i.hasNext()) {
T next = i.next();
if (next.compareTo(candidate) > 0)
candidate = next;
}
return candidate;
}
//根据比较器比较返回Collection中的最大值
public static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp) {
if (comp==null)
return (T)max((Collection<SelfComparable>) (Collection) coll);
Iterator<? extends T> i = coll.iterator();
T candidate = i.next();
while (i.hasNext()) {
T next = i.next();
if (comp.compare(next, candidate) > 0)
candidate = next;
}
return candidate;
}
//根据自然顺序返回集合中的最小值
public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll) {
Iterator<? extends T> i = coll.iterator();
T candidate = i.next();
while (i.hasNext()) {
T next = i.next();
if (next.compareTo(candidate) < 0)
candidate = next;
}
return candidate;
}
//根据比较器比较返回Collection中的最小值
public static <T> T min(Collection<? extends T> coll, Comparator<? super T> comp) {
if (comp==null)
return (T)min((Collection<SelfComparable>) (Collection) coll);
Iterator<? extends T> i = coll.iterator();
T candidate = i.next();
while (i.hasNext()) {
T next = i.next();
if (comp.compare(next, candidate) < 0)
candidate = next;
}
return candidate;
}
//返回由n个o组成的不可变集合
public static <T> List<T> nCopies(int n, T o) {
if (n < 0)
throw new IllegalArgumentException("List length = " + n);
return new CopiesList<>(n, o);
}
//替换旧值
public static <T> boolean replaceAll(List<T> list, T oldVal, T newVal) {
boolean result = false;
int size = list.size();
if (size < REPLACEALL_THRESHOLD || list instanceof RandomAccess) {
if (oldVal==null) {
for (int i=0; i<size; i++) {
if (list.get(i)==null) {
list.set(i, newVal);
result = true;
}
}
} else {
for (int i=0; i<size; i++) {
if (oldVal.equals(list.get(i))) {
list.set(i, newVal);
result = true;
}
}
}
} else {
ListIterator<T> itr=list.listIterator();
if (oldVal==null) {
for (int i=0; i<size; i++) {
if (itr.next()==null) {
itr.set(newVal);
result = true;
}
}
} else {
for (int i=0; i<size; i++) {
if (oldVal.equals(itr.next())) {
itr.set(newVal);
result = true;
}
}
}
}
return result;
}
//反转整个list
public static void reverse(List<?> list) {
int size = list.size();
if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {
for (int i=0, mid=size>>1, j=size-1; i<mid; i++, j--)
//交换i和j位置的值
swap(list, i, j);
} else {
ListIterator fwd = list.listIterator();
ListIterator rev = list.listIterator(size);
for (int i=0, mid=list.size()>>1; i<mid; i++) {
Object tmp = fwd.next();
fwd.set(rev.previous());
rev.set(tmp);
}
}
}
public static void swap(List<?> list, int i, int j) {
final List l = list;
l.set(i, l.set(j, l.get(i)));
}
//随机交换list元素的位置
public static void shuffle(List<?> list) {
Random rnd = r;
if (rnd == null)
r = rnd = new Random();
shuffle(list, rnd);
}
public static void shuffle(List<?> list, Random rnd) {
int size = list.size();
if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
for (int i=size; i>1; i--)
swap(list, i-1, rnd.nextInt(i));
} else {
Object arr[] = list.toArray();
// Shuffle array
for (int i=size; i>1; i--)
swap(arr, i-1, rnd.nextInt(i));
// Dump array back into list
ListIterator it = list.listIterator();
for (int i=0; i<arr.length; i++) {
it.next();
it.set(arr[i]);
}
}
}
//返回一个逆转顺序的比较器
public static <T> Comparator<T> reverseOrder() {
return (Comparator<T>) ReverseComparator.REVERSE_ORDER;
}
//逆转比较器顺序
public static <T> Comparator<T> reverseOrder(Comparator<T> cmp) {
if (cmp == null)
return reverseOrder();
if (cmp instanceof ReverseComparator2)
return ((ReverseComparator2<T>)cmp).cmp;
return new ReverseComparator2<>(cmp);
}
//将list中的元素移动distance距离
public static void rotate(List<?> list, int distance) {
if (list instanceof RandomAccess || list.size() < ROTATE_THRESHOLD)
rotate1(list, distance);
else
rotate2(list, distance);
}
private static <T> void rotate1(List<T> list, int distance) {
int size = list.size();
if (size == 0)
return;
distance = distance % size;
if (distance < 0)
distance += size;
if (distance == 0)
return;
for (int cycleStart = 0, nMoved = 0; nMoved != size; cycleStart++) {
T displaced = list.get(cycleStart);
int i = cycleStart;
do {
i += distance;
if (i >= size)
i -= size;
displaced = list.set(i, displaced);
nMoved ++;
} while (i != cycleStart);
//返回只包含一个元素的不可变set
public static <T> Set<T> singleton(T o) {
return new SingletonSet<>(o);
}
//将此collection转为同步的
public static <T> Collection<T> synchronizedCollection(Collection<T> c) {
return new SynchronizedCollection<>(c);
}
//将集合转为不可变集合
public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c) {
return new UnmodifiableCollection<>(c);
}
分享到:
相关推荐
很多java开发的小伙伴都会阅读jdk源码,然而确不知道应该从哪读起。以下为小编整理的通常所需阅读的源码范围。 标题为包名,后面序号为优先级1-4,优先级递减 1、java.lang 1) Object 1 2) String 1 3) ...
6. **集合框架(Collections Framework)**:Java集合框架是处理对象集合的核心,包括List、Set、Map等接口以及它们的实现类。`java.util`和`java.util.concurrent`包中的类实现了各种数据结构和算法,为高效的数据...
第一次系统的阅读理解Java Collections Framework的源码,已经粗略的学习完了,做个简单的总结。首先把资料放置在第一位,想系统学习的主要原因在工作之余想自学点东西,看了master24 的博文之后,感觉有必要把Java...
2. **Database and Collections**: `MongoDatabase`代表一个数据库,`MongoCollection`代表数据库中的集合,它们提供了执行查询、插入、更新和删除操作的接口。 3. **BSON**: BSON(Binary JSON)是MongoDB中用于...
在本案例中,"游戏服务器引擎C#源码" 是一个专为手机网络游戏设计的软件开发框架,它采用高效且易读的C#编程语言编写。C#在游戏开发领域因其强大的面向对象特性、内存管理和.NET框架的支持而广受欢迎,特别是在...
源码可能包含这些数据结构的实现和使用,如`collections.deque`、`heapq`等模块。 6. **函数式编程**:Python支持高阶函数、闭包、匿名函数(lambda)和函数装饰器。源码可能会展示如何利用这些特性来编写简洁、可...
总而言之,Java 1.8的lambda表达式使得代码更简洁、更易读,它与函数式接口和Stream API结合,大大增强了Java在处理数据和执行任务时的灵活性。学习和熟练掌握这些特性,对于提升Java开发效率和代码质量至关重要。
在"conjugator"的实现中,我们可能会看到Python的标准库如`collections`用于数据结构优化,`re`模块进行正则表达式匹配以解析动词规则,或者`argparse`来处理命令行参数。可能还使用了面向对象编程,定义了代表动词...
using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using Common; using System.IO; namespace EZSockets { /// /// 封装的三菱的通讯类 /// public ...
当涉及到处理结构化数据时,CSV(Comma Separated Values)文件是常见的选择,因为它们简单、易读且跨平台兼容。本实例源码将展示如何使用C#有效地读取CSV文件。 首先,我们需要了解CSV文件的基本结构。CSV文件由一...
例如,我们可以使用`Collections.sort()`方法配合Lambda表达式轻松完成列表排序: ```java List<String> list = ...; list.sort((s1, s2) -> s1.compareTo(s2)); ``` 函数式接口是Lambda表达式的基础,它们定义了...
`collections`模块的源码也是学习的好材料,可以帮助我们理解这些数据结构的实现原理。 总之,Python的`collections`模块提供了许多实用的数据结构,如`namedtuple`、`deque`、`defaultdict`和`Counter`,它们都是...
### 修改的电子称读取源码解析 #### 1. **代码框架及环境配置** using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System....
MongoDB 使用 JSON 格式的文档来存储数据,这种格式叫做 BSON(Binary JSON),它在保持 JSON 的易读性的同时,提供了更高效的存储和检索。MongoDB 通过集合(Collections)组织这些文档,集合相当于关系数据库中的...
Python是一种广泛使用的高级编程语言,以其易读性、简洁性和丰富的库支持而闻名。在"Python高性能编程"这个主题中,我们关注的是如何利用Python的特性来实现高效的代码执行,优化算法,以及如何处理大数据量的情况。...
- **非同步**:HashMap不是线程安全的,如果在多线程环境下使用,需要额外的同步控制,如使用`Collections.synchronizedMap()`或使用`ConcurrentHashMap`。 - **初始容量与加载因子**:HashMap有初始容量和加载因子...
在本压缩包“简单的蓝桥题目(2)源码.zip”中,包含了三个Java编程相关的项目,分别是“单词分析”、“成绩统计”和“回文日期”。这些项目可以帮助初学者或者有一定基础的Java开发者加深对Java语言的理解,提高...
然而,对于需要频繁修改列表的场景,CopyOnWriteArrayList的效率可能会低于其他并发控制机制,如使用`synchronized`修饰的ArrayList或使用`Collections.synchronizedList()`创建的同步列表。在选择数据结构时,...
在Java编程语言中,泛型(Generics...总的来说,泛型和方法是Java编程的核心组成部分,熟练掌握它们能够使我们的代码更加安全、高效和易读。通过不断学习和实践,我们可以提升编程技巧,更好地应对复杂的软件开发挑战。
源码 MultiThreadMode Single Thread Execution模式 使用synchronized方法或代码块,只能保证某一段代码是只能由一个线程执行。 也可使用Semaphore类设置资源数量 Immutable模式 Immutable类:通过final关键字设置类...