1.不可变集合的应用场景:
①如果某个数据不能被修改,把它防御性的拷贝到不可变集合中是个很好的实践
②或者当集合对象被不可信的库调用时,不可变形式是安全的
简单理解:不想让别人修改集合中的内容(例如斗地主里面的牌盒)
2.创建不可变集合的书写格式:
在List、Set、Map接口中,都存在静态的of方法,可以获取一个不可变的集合
3.方法:
static <E> List<E> of(E...elements)--------->创建一个具有指定元素的List集合对象
static <E> Sett<E> of(E...elements)--------->创建一个具有指定元素的Set集合对象
static <K,V> Map<K,V> of(E...elements)--------->创建一个具有指定元素的Map集合对象
注意:这个集合不能添加,不能删除,不能修改
创建不可变的List集合:
package a07immutable;
import java.util.Iterator;
import java.util.List;
public class ImmutableDemo1 {
public static void main(String[] args) {
//一旦创建之后,是无法进行修改的,在下面的代码中,只能进行查询操作
List<String> list = List.of("张三", "李四", "王五", "赵六");
System.out.println(list.get(0));
System.out.println(list.get(1));
System.out.println(list.get(2));
System.out.println(list.get(3));
System.out.println("---------------");
for (String s : list) {
System.out.println(s);
}
System.out.println("---------------");
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
System.out.println("---------------");
//普通for
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
System.out.println(s);
}
}
}
运行结果:
创建一个不可变的Set集合
注意:当我们要获取一个不可变的Set集合时,里面的参数一定要保证唯一性
package a07immutable;
import java.util.Iterator;
import java.util.Set;
public class ImmutableDemo2 {
public static void main(String[] args) {
//创建不可变的Set集合
Set<String> set = Set.of("张三", "李四", "王五", "赵六");
//Set集合没有索引
for (String s : set) {
System.out.println(s);
}
System.out.println("---------------------");
Iterator<String> it = set.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
}
}
运行结果:
创建一个不可变的Map集合
注意:
①键是不能重复的
②Map里面的of方法,参数是有上限的,最多只能传递20个参数,也就是10个键值对
③超过10个了用ofEntries方法(如果JDK版本大于10,可以直接用copyOf方法)
创建键值对<=10个的:
package a07immutable;
import java.util.Map;
import java.util.Set;
public class ImmutableDemo3 {
public static void main(String[] args) {
//创建Map的不可变集合
Map<String, String> map = Map.of("鹿晗", "北京", "天空", "北京", "某某", "南京");
Set<String> keys = map.keySet();
for (String key : keys) {
String value = map.get(key);
System.out.println(key+"="+value);
}
System.out.println("----------------");
//获取所有键值对对象
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String, String> entry : entries) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"="+value);
}
}
}
运行结果:
创建键值对超过10个的:
package a07immutable;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class ImmutableDemo4 {
public static void main(String[] args) {
//1.创建一个普通的Map集合
HashMap<String,String> hm=new HashMap<>();
hm.put("1","aa");
hm.put("2","bb");
hm.put("3","cc");
hm.put("4","dd");
hm.put("5","ee");
hm.put("6","ff");
hm.put("7","gg");
hm.put("8","hh");
hm.put("9","ii");
hm.put("10","jj");
hm.put("11","kk");
//2.利用上面的数据获取一个不可变集合
/* //获取所有的键值对对象(Entry对象)
Set<Map.Entry<String, String>> entries = hm.entrySet();
//把entries变成数组
Map.Entry[] arr1=new Map.Entry[0];
Map.Entry[] arr2 = entries.toArray(arr1);
//toArray方法在底层会比较集合的长度跟数组的长度两者的大小
//如果集合的长度 > 数组的长度:数据在数组中放不下,此时会根据实际数据的个数,重新创建数组
//如果集合的长度 <= 数组的长度:数据在数组中放的下,此时不会创建新的数组,而是直接用
//不可变的map集合
Map map = Map.ofEntries(arr2);//可变参数在底层就是一个数组,所以参数直接传数组就可以了
*/
// Map<Object, Object> map = Map.ofEntries(hm.entrySet().toArray(new Map.Entry[0]));
// map.put("aaa","11");//会报错
//Java中有写好的方法copyOf,但是是在JDK10出现的,之前的版本不能用哦
Map<String, String> map = Map.copyOf(hm);
}
}