Java.util.Collections类包的学习

本文详细介绍了Java.util.Collections类的功能及使用方法,包括排序、混排、反转等实用操作,为Java开发者提供了丰富的集合操作技巧。
关键字: Java.util.Collections类包的学习 Java.util. Collections类包的学习
1. 描述:
1.1 概述
java.util. Collections类包含很多有用的方法,可以使程序员的工作变得更加容易,但是这些方法通常都没有被充分地利用。Javadoc给出 Collections类最完整的描述:“这一个类包含可以操作或返回集合的专用静态类。
” 1.2 所含方法
Iterator, ArrayList, Elements, Buffer, Map, Collections

列子:
import java.util.ArrayList;
import java.util.Collection;
import java.util. Collections;
import java.util.Comparator;
import java.util.List;

public class CollectionsSort {
public CollectionsSort() {

}

public static void main(String[] args) {
double array[] = {111, 111, 23, 456, 231 };
List list = new ArrayList();
List li = new ArrayList();
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
//list.add(""+array[i]);
}
double arr[] = {111};
for(int j=0;j<arr.length;j++){ <br=""> li.add(new Double(arr[j]));
}
}

2. 具体操作
1) 排序(Sort)
使用sort方法可以根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口。此列表内的所有元素都必须是使用指定比较器可相互比较的
double array[] = {112, 111, 23, 456, 231 };
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
Collections.sort(list);
for (int i = 0; i < array.length; i++) {
?? System.out.println(li.get(i));
}?
//结果:112,111,23,456,231
2) 混排(Shuffling)
混排算法所做的正好与 sort 相反: 它打乱在一个 List 中可能有的任何排列的踪迹。也就是说,基于随机源的输入重排该 List, 这样的排列具有相同的可能性(假设随机源是公正的)。这个算法在实现一个碰运气的游戏中是非常有用的。例如,它可被用来混排代表一副牌的 Card 对象的一个 List 。另外,在生成测试案例时,它也是十分有用的。
Collections.Shuffling(list)
double array[] = {112, 111, 23, 456, 231 };
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
Collections.shuffle(list);
for (int i = 0; i < array.length; i++) {
?? System.out.println(li.get(i));
}
//结果:112,111,23,456,231
3) 反转( Reverse)
?????? 使用 Reverse方法可以根据元素的自然顺序 对指定列表按降序进行排
序。
Collections. reverse(list)
double array[] = {112, 111, 23, 456, 231 };
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
Collections. reverse (list);
for (int i = 0; i < array.length; i++) {
?? System.out.println(li.get(i));
}
//结果:231,456,23,111,112
4) 替换所以的元素(Fill)
使用指定元素替换指定列表中的所有元素。
String str[] = {"dd","aa","bb","cc","ee"};
for(int j=0;j<str.length;j++){ <br=""> li.add(new String(str[j]));
}
Collections.fill(li,"aaa");
for (int i = 0; i < li.size(); i++) {
System.out.println("list[" + i + "]=" + li.get(i));

}
//结果:aaa,aaa,aaa,aaa,aaa

5) 拷贝(Copy)
用两个参数,一个目标 List 和一个源 List, 将源的元素拷贝到目标,并覆盖它的内容。目标 List 至少与源一样长。如果它更长,则在目标 List 中的剩余元素不受影响。
Collections.copy(list,li): 后面一个参数是目标列表 ,前一个是源列表
double array[] = {112, 111, 23, 456, 231 };
List list = new ArrayList();
List li = new ArrayList();
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
double arr[] = {1131,333};
String str[] = {"dd","aa","bb","cc","ee"};
for(int j=0;j<arr.length;j++){ <br=""> li.add(new Double(arr[j]));
}
Collections.copy(list,li);
for (int i = 0; i <list.size(); i++)="" {="" <br=""> System.out.println("list[" + i + "]=" + list.get(i));
}
//结果:1131,333,23,456,231
6) 返回 Collections中最小元素(min)
根据指定比较器产生的顺序,返回给定 collection 的最小元素。collection 中的所有元素都必须是通过指定比较器可相互比较的
Collections.min(list)
double array[] = {112, 111, 23, 456, 231 };
List list = new ArrayList();
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
Collections.min(list);
for (int i = 0; i <list.size(); i++)="" {="" <br=""> System.out.println("list[" + i + "]=" + list.get(i));
}
//结果:23
7) 返回 Collections中最小元素(max)
根据指定比较器产生的顺序,返回给定 collection 的最大元素。collection 中的所有元素都必须是通过指定比较器可相互比较的
Collections.max(list)
double array[] = {112, 111, 23, 456, 231 };
List list = new ArrayList();
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
Collections.max(list);
for (int i = 0; i <list.size(); i++)="" {="" <br=""> System.out.println("list[" + i + "]=" + list.get(i));
}
//结果:456
8) lastIndexOfSubList
返回指定源列表中最后一次出现指定目标列表的起始位置
int count = Collections.lastIndexOfSubList(list,li);
double array[] = {112, 111, 23, 456, 231 };
List list = new ArrayList();
List li = new ArrayList();
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
double arr[] = {111};
String str[] = {"dd","aa","bb","cc","ee"};
for(int j=0;j<arr.length;j++){ <br=""> li.add(new Double(arr[j]));
}
Int locations = Collections. lastIndexOfSubList (list,li);
System.out.println(“===”+ locations);
//结果 3
9) IndexOfSubList
返回指定源列表中第一次出现指定目标列表的起始位置
int count = Collections.indexOfSubList(list,li);
double array[] = {112, 111, 23, 456, 231 };
List list = new ArrayList();
List li = new ArrayList();
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
double arr[] = {111};
String str[] = {"dd","aa","bb","cc","ee"};
for(int j=0;j<arr.length;j++){ <br=""> li.add(new Double(arr[j]));
}
Int locations = Collections.indexOfSubList(list,li);
System.out.println(“===”+ locations);
//结果 1
10) Rotate
根据指定的距离循环移动指定列表中的元素
Collections.rotate(list,-1);
如果是负数,则正向移动,正数则方向移动
double array[] = {112, 111, 23, 456, 231 };
List list = new ArrayList();
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
Collections.rotate(list,-1);
for (int i = 0; i <list.size(); i++)="" {="" <br=""> System.out.println("list[" + i + "]=" + list.get(i));
}
//结果:111,23,456,231,112
?????? 239342.html

礼物 2008-11-07 23:12 发表评论
<think> 我们被要求解释`java.util.ImmutableCollections`,这是Java中一个与不可变集合相关的。 在Java 9中,引入了新的工厂方法用于创建不可变集合(如List、Set、Map等)。这些工厂方法返回的集合实例实际上是`java.util.ImmutableCollections`的内部实现。 这个位于`java.base`模块的`java.util`中,是一个私有的(即不公开暴露给外部使用),所以我们在代码中通常不会直接使用它,而是通过`List.of()`, `Set.of()`, `Map.of()`等工厂方法间接使用。 不可变集合的特点: 1. 一旦创建,就不能添加、删除或修改元素(尝试修改会抛出`UnsupportedOperationException`)。 2. 不允许含null元素(如果尝试含null,会抛出`NullPointerException`)。 3. 如果尝试修改集合(通过迭代器、set、add等方法),都会抛出`UnsupportedOperationException`。 4. 它们是序列化的(如果元素可序列化,则集合可序列化)。 在`java.util.ImmutableCollections`中,有多个内部静态,例如: - `ListN`(对应多个元素的List) - `List0`(空List) - `List1`(单个元素的List) - `List2`(两个元素的List) - 等等(实际上,为了优化,对于小数量(<=12)有专门的实现,超过12个则使用数组实现) 同样,Set和Map也有似的实现。 注意:这些不可变集合的实现细节可能随版本变化,因此我们不应该依赖具体的实现,而应该通过工厂方法使用它们。 以下是一个使用示例,展示如何创建不可变集合并尝试修改(会抛出异常): </think> `java.util.ImmutableCollections` 是 Java 9 引入的一个**内部工具**,用于实现不可变集合(如 `List.of()`、`Set.of()`、`Map.of()` 等工厂方法返回的集合)。它不直接对外暴露,而是作为 JDK 实现不可变集合的底层支撑。以下是详细解释和代码示例: --- ### 核心特性 1. **不可变性** 所有通过 `ImmutableCollections` 创建的集合: - 禁止修改(增/删/改操作会抛出 `UnsupportedOperationException`) - 禁止含 `null` 元素(传入 `null` 会抛 `NullPointerException`) - 线程安全(因为不可变) 2. **空间优化** 针对不同元素数量有专门优化(如空集合、单元素集合等): ```java List.of() // 返回 ImmutableCollections.List0(空集合) List.of("A") // 返回 ImmutableCollections.List1(单元素集合) List.of("A", "B") // 返回 ImmutableCollections.List2(双元素集合) ``` 3. **防御性编程** 防止外部修改: ```java List<String> list = List.of("A", "B"); list.add("C"); // 抛出 UnsupportedOperationException ``` --- ### 代码示例与原理 #### 1. 创建不可变集合 ```java import java.util.List; import java.util.Set; import java.util.Map; public class ImmutableExample { public static void main(String[] args) { // 创建不可变集合 List<String> list = List.of("A", "B"); // 底层由 ImmutableCollections.List2 实现 Set<Integer> set = Set.of(1, 2, 3); Map<String, Integer> map = Map.of("Key", 100); System.out.println(list.getClass().getName()); // 输出: java.util.ImmutableCollections$ListN } } ``` #### 2. 尝试修改会抛出异常 ```java List<String> list = List.of("A", "B"); list.set(0, "X"); // 抛出 UnsupportedOperationException list.add("C"); // 抛出 UnsupportedOperationException ``` #### 3. 不允许 null 值 ```java List.of("A", null); // 抛出 NullPointerException ``` --- ### 实现原理(简化版) 以下是模拟 `ImmutableCollections` 内部实现的简化代码: ```java // 模拟 ImmutableCollections 的内部实现 abstract class ImmutableList<E> extends AbstractList<E> { @SafeVarargs static <E> List<E> of(E... elements) { if (elements.length == 0) return new List0<>(); else if (elements.length == 1) return new List1<>(elements[0]); else return new ListN<>(elements); } static final class List0<E> extends ImmutableList<E> { @Override public E get(int index) { throw new IndexOutOfBoundsException(); } @Override public int size() { return 0; } } static final class List1<E> extends ImmutableList<E> { private final E e0; List1(E e0) { this.e0 = Objects.requireNonNull(e0); } @Override public E get(int index) { if (index != 0) throw new IndexOutOfBoundsException(); return e0; } @Override public int size() { return 1; } } static final class ListN<E> extends ImmutableList<E> { private final E[] elements; ListN(E[] elements) { this.elements = Arrays.copyOf(elements, elements.length); for (E e : this.elements) Objects.requireNonNull(e); // 禁止 null } @Override public E get(int index) { return elements[index]; } @Override public int size() { return elements.length; } @Override public E set(int index, E element) { throw new UnsupportedOperationException(); // 禁止修改 } } } ``` --- ### 何时使用? 优先使用工厂方法而非 `ImmutableCollections` : ```java // ✅ 正确用法 List<String> safeList = List.of("A", "B"); // ❌ 不需要(也无法)直接使用 ImmutableCollections // ImmutableCollections.ListN<String> list = ... ``` --- ### 总结 | 特性 | 说明 | |---------------------|----------------------------------------------------------------------| | **不可变性** | 所有操作均只读,修改会抛异常 | | **空值限制** | 禁止含 `null`(避免空指针漏洞) | | **内存优化** | 对 0/1/2 个元素有专用实现 | | **线程安全** | 天然支持多线程(无需同步) | | **工厂方法入口** | 通过 `List.of()`, `Set.of()`, `Map.of()` 创建 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值