简单理解:不想让别人修改集合中的内容时,就可以放入不可变集合
在List、Set、Map接口中,都存在静态的of方法,可以获取一个不可变的集合。
List<String> list = List.of("zhangsan", "lisi", "wangwu");
//查
System.out.println(list.get(0));//zhangsan
//不能增删改---会报错
/* list.add("aaa");
list.remove(0);
list.set(2,"bbb")*/
System.out.println("--------------");
//可以遍历---(以下是List的五种遍历方式,复习一下)
for (String s : list) {
System.out.println(s);
}
System.out.println("-------------");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String str = it.next();
System.out.println(str);
}
System.out.println("---------------");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("---------------");
list.forEach((s) -> System.out.println(s));
System.out.println("-------------");
ListIterator<String> stringListIterator = list.listIterator();
while (stringListIterator.hasNext()) {
String str = stringListIterator.next();
System.out.println(str);
}
当我们要获取一个不可变的Set集合时,参数一定要保证唯一性,否则报错:
![Snipaste_2024-01-31_21-21-46.png](https://cdn.nlark.com/yuque/0/2024/png/40571611/1706710878225-53db3e63-04c7-4f4a-9aa9-d8b8dd095a24.png#averageHue=%23f9f7f5&clientId=u3e0bafb0-1ee4-4&from=drop&height=210&id=ucd70692e&originHeight=595&originWidth=1861&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=109489&status=done&style=shadow&taskId=uad672bfc-e8eb-4064-9a89-3e4666c47c4&title=&width=656)
Set<String> set = Set.of("zhangsan", "lisi", "wangwu");
//因为Set系列集合没有索引索引不能使用get方法,但是我们可以遍历
//不能增删改
System.out.println("--------------");
//可以遍历---(以下是Set的三种遍历方式,复习一下)
for (String s : set) {
System.out.println(s);
}
System.out.println("-------------");
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String str = it.next();
System.out.println(str);
}
System.out.println("---------------");
set.forEach((s) -> System.out.println(s));
键不能重复
当要添加的键值对数量少于 10个,直接时使用 Of 方法创建不可变集合:
因为 of 方法最多创建十个键值对对象:
Map<String, String> map = Map.of("刘一", "南昌", "张三", "上海", "王五", "北京", "孙七", "深圳", "吴九", "上饶");
//以下是Map的三种遍历方式:
//keySet
Set<String> set = map.keySet();
for (String s : set) {
System.out.println(s+" ="+map.get(s));
}
System.out.println("--------------------------");
//entrySet
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String, String> entry : entries) {
System.out.println(entry.getKey()+" ="+entry.getValue());
}
System.out.println("--------------------------");
//forEach
map.forEach(new BiConsumer<String, String>() {
@Override
public void accept(String s, String s2) {
System.out.println(s+" "+s2);
}
});
当要添加的键值对数量大于 10个,使用 ofEntries 方法 或直接点,使用 Copyof 方法创建不可变集合
//1.创建一个普通的Map集合
HashMap<String, String> hm = new HashMap<>();
hm.put("张三", "南京");
hm.put("李四", "北京");
hm.put("王五", "上海");
hm.put("赵六", "北京");
hm.put("孙七", "深圳");
hm.put("周八", "杭州");
hm.put("吴九", "宁波");
hm.put("郑十", "苏州");
hm.put("刘一", "无锡");
hm.put("陈二", "嘉兴");
hm.put("aaa", "111");
//一共十一个键值对对象
//目的:利用上面的数据来获取一个不可变集合
//1.entrySet方法获取到键值对对象
Set<Map.Entry<String, String>> entries = hm.entrySet();
//2.创建一个Entry数组,用于存储键值对。
Map.Entry[] arr1 = new Map.Entry[0];
//3.把entries变成一个数组
//toArray方法在底层会比较集合的长度跟数组的长度两者的大小
//如果集合的长度 > 数组的长度 :数据在数组中放不下,此时会根据实际数据的个数,重新创建数组
//如果集合的长度 <= 数组的长度:数据在数组中放的下,此时不会创建新的数组,而是直接用
Map.Entry[] arr2 = entries.toArray(arr1);
//不可变的map集合
Map map = Map.ofEntries(arr2);
//或直接写成下面这种
Map<Object, Object> map = Map.ofEntries(hm.entrySet().toArray(new Map.Entry[0]));
//或直接调用compyOf方法,它底层其实就是使用上面这个
Map<String, String> map = Map.copyOf(hm);