Java提供了一个操作Set、List和Map等集合的工具类:Collections,该工具类提供了方法操作集合元素,还提供了将集合对象设置不可变、对集合对象实现同步控制等方法
Collections提供用于对List集合元素进行排序的相关方法:
import java.util.*;
import static java.lang.System.*;
public class SortTest
{
public static void main(String[] args)
{
var nums = new ArrayList();
nums.add(2);
nums.add(-5);
nums.add(3);
nums.add(0);
// 输出:[2, -5, 3, 0]
out.println(nums);
// 将List集合元素的次序反转
Collections.reverse(nums);
// 输出:[0, 3, -5, 2]
out.println(nums);
// 将List集合元素的按自然顺序排序
Collections.sort(nums);
// 输出:[-5, 0, 2, 3]
out.println(nums);
// 将List集合元素的按随机顺序排序
Collections.shuffle(nums);
// 每次输出的次序不固定
out.println(nums);
}
}
Collections提供了用于查找替换集合元素的类方法:
import java.util.*;
import static java.lang.System.*;
public class SearchTest
{
public static void main(String[] args)
{
var nums = new ArrayList();
nums.add(2);
nums.add(-5);
nums.add(3);
nums.add(0);
// 输出:[2, -5, 3, 0]
out.println(nums);
// 输出最大元素,将输出3
out.println(Collections.max(nums));
// 输出最小元素,将输出-5
out.println(Collections.min(nums));
// 将nums中的0使用1来代替
Collections.replaceAll(nums, 0, 1);
// 输出:[2, -5, 3, 1]
out.println(nums);
// 判断-5在List集合中出现的次数,返回1
out.println(Collections.frequency(nums, -5));
// 对nums集合排序
Collections.sort(nums);
// 输出:[-5, 1, 2, 3]
out.println(nums);
//只有排序后的List集合才可用二分法查询,输出3
out.println(Collections.binarySearch(nums, 3));
}
}
Collections类中提供了多个synchronizedXxx()方法,该方法可以将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题
Java常用的集合框架中的实现类HashSet、TreeSet、ArrayList、ArrarDeque、LinkedList、HashMap和TreeMap都是线程不安全的,多线程访问的时候,超过一个线程试图修改其中的内容就会存在线程不安全问题
import java.util.*;
import static java.lang.System.*;
public class SynchronizedTest
{
public static void main(String[] args)
{
// 下面程序创建了四个线程安全的集合对象
var c = Collections.synchronizedCollection(new ArrayList());
var list = Collections.synchronizedList(new ArrayList());
var s = Collections.synchronizedSet(new HashSet());
var m = Collections.synchronizedMap(new HashMap());
}
}
Collections提供了三类方法来返回一个不可变的集合:
import java.util.*;
import static java.lang.System.*;
public class UnmodifiableTest
{
public static void main(String[] args)
{
// 创建一个空的、不可改变的List对象
var unmodifiableList = Collections.emptyList();
// 创建一个只有一个元素,且不可改变的Set对象
var unmodifiableSet = Collections.singleton("SpringBoot实战");
// 创建一个普通Map对象
var scores = new HashMap();
scores.put("语文", 80);
scores.put("Java", 82);
// 返回普通Map对象对应的不可变版本
var unmodifiableMap = Collections.unmodifiableMap(scores);
// 下面任意一行代码都将引发UnsupportedOperationException异常
unmodifiableList.add("测试元素");
unmodifiableSet.add("测试元素");
unmodifiableMap.put("语文", 90);
}
}
Java9之后可以直接调用Set、List、Map的of()方法创建包含N个元素的不可变集合
import java.util.*;
import java static java.lang.System.*;
public class Java9Collection
{
public static void main(String[] args)
{
// 创建包含4个元素的Set集合
var set = Set.of("Java", "Kotlin", "Go", "Swift");
out.println(set);
// 不可变集合,下面代码导致运行时错误
// set.add("Ruby");
// 创建包含4个元素的List集合
var list = List.of(34, -25, 67, 231);
out.println(list);
// 不可变集合,下面代码导致运行时错误
// list.remove(1);
// 创建包含3组key-value对的Map集合
var map = Map.of("语文", 89, "数学", 82, "英语", 92);
out.println(map);
// 不可变集合,下面代码导致运行时错误
// map.remove("语文");
// 使用Map.entry()方法显式构建key-value对
var map2 = Map.ofEntries(Map.entry("语文", 89),
Map.entry("数学", 82),
Map.entry("英语", 92));
out.println(map2);
}
}
它是Iterator迭代器的古老版本,JDK1.0延续至今,只有两个方法
Vector、Stack、HashTable、BitSet都是JDK1.0遗留下来的Enumeration可用于遍历这些古董集合类,而对于ArrayList、HashMap等集合类不再支持Enumeration
import java.util.*;
import static java.lang.System.*;
public class EnumerationTest
{
public static void main(String[] args)
{
var v = new Vector();
v.add("疯狂Java讲义");
v.add("轻量级Java EE企业应用实战");
var scores = new Hashtable();
scores.put("语文", 78);
scores.put("数学", 88);
Enumeration em = v.elements();
while (em.hasMoreElements())
{
out.println(em.nextElement());
}
Enumeration keyEm = scores.keys();
while (keyEm.hasMoreElements())
{
Object key = keyEm.nextElement();
out.println(key + "--->" + scores.get(key));
}
}
}