定义:就是集合中的内容不可以被修改。
如何获取不可变集合?
List、Set、Map类中提供的静态方法of可用来获取不可变集合。
特点:一旦创建完成只可以进行查询,不可以增删改。
细节:Map集合中的of方法只能添加10个键值对。因为of方法中键和值是分开进行传递的,不能使用可变参数。
当添加的键值对超过10个时,可使用Map中提供的ofEntries方法,在这个方法中,可以把键和值看作一个整体,然后再使用可变参数。
那么这个方法如何使用呢?
①获取到所有的键值对对象(Entry对象);
②使用toArray方法把键值对对象放到数组中去并指明数组中存放的是Entry类型的数据;
toArray方法在底层会比较集合的长度跟数组的长度两者的大小:
如果集合的长度 > 数组的长度 :数据在数组中放不下,此时会根据实际数据的个数,重新创建数组。
如果集合的长度 <= 数组的长度:数据在数组中放的下,此时不会创建新的数组,而是直接用。
下面是代码示例:
public class Test3 {
public static void main(String[] args) {
//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("林三", "天津");
/*// 把键值对转变为键值对对象并获取
Set<Map.Entry<String, String>> entries = hm.entrySet();
// 使用toArray方法把键值对对象放到数组中去并指明数组中存放的是Entry类型的数据
Map.Entry[] array = entries.toArray(new Map.Entry[0]);
// 创建不可变集合
Map map = Map.ofEntries(array);
*/
//Map.ofEntries(hm.entrySet().toArray(new Map.Entry[0]));
Map<String, String> map = Map.copyOf(hm);
}
}
在JDK10以后提供了cpoyOf方法,就是对ofEntries方法创建不可变集合等代码的抽取。
有一点:Map是一个接口,然后其中又有一个内部类接口Entry,就是键值对对象。