免费做logo设计的网站,做网站建设公司crm在线的培训服务,旅游门户网站方案,电子商务网站中最基本的系统是什么是不可变集合
不可变集合#xff0c;英文叫 immutable
顾名思义就是说集合是不可被修改的。集合的数据项是在创建的时候提供#xff0c;并且在整个生命周期中都不可改变。
为什么要使用不可变集合
不可变对象有很多优点#xff0c;包括#xff1a; 当对象被不可信的…什么是不可变集合
不可变集合英文叫 immutable
顾名思义就是说集合是不可被修改的。集合的数据项是在创建的时候提供并且在整个生命周期中都不可改变。
为什么要使用不可变集合
不可变对象有很多优点包括 当对象被不可信的库调用时不可变形式是安全的不可变对象被多个线程调用时不存在竞态条件问题不可变集合不需要考虑变化因此可以节省时间和空间。所有不可变的集合都比它们的可变形式有更好的内存利用率分析和测试细节不可变对象因为有固定不变可以作为常量来安全使用 创建对象的不可变拷贝是一项很好的防御性编程技巧。Guava为所有JDK标准集合类型和Guava新集合类型都提供了简单易用的不可变版本。
Java 9 版本以前 Collections提供了一组方法把可变集合封装成不可变集合假如要创建一个包含 几个元素的 Set 集合程序需要先创建 Set 集合然后调用 几次 add() 方法向 Set 集合中添加元素。例如
ListString list new ArrayListString();list.add(a);list.add(b);list.add(c);ListString unmodifiableList Collections.unmodifiableList(list);list.add(d);System.out.println(unmodifiableList);
输出的结果 [a,b,c,d]
得出结论Collections.unmodifiableList 实现的不是真正的不可变集合当原始集合修改后不可变集合也发生变化。 笨重而且累赘不能舒适地用在所有想做防御性拷贝的场景不安全要保证没人通过原集合的引用进行修改返回的集合才是事实上不可变的低效包装过的集合仍然保有可变集合的开销比如并发修改的检查、散列表的额外空间等等。 如果你没有修改某个集合的需求或者希望某个集合保持不变时把它防御性地拷贝到不可变集合是个很好的实践。
但是Java 9 出了些新的生成不可变集合的方法程序直接调用 Set、List、Map 的 of() 方法即可创建包含 N 个元素的不可变集合这样一行代码就可创建包含 N 个元素的集合。 不可变意味着程序不能向集合中添加元素也不能从集合中删除元素。
如下程序示范了如何创建不可变集合。
public class Java9Collection {
public static void main(String[] args) {
// 创建包含4个元素的Set集合
Set set Set.of(Java, Kotlin, Go, Swift);
System.out.println(set);
// 不可变集合下面代码导致运行时错误
// set.add(Ruby);
// 创建包含4个元素的List集合List list List.of(34, -25, 67, 231);
System.out.println(list);
// 不可变集合下面代码导致运行时错误
// list.remove(1);
// 创建包含3个key-value对的Map集合Map map Map.of(语文, 89, 数学, 82, 英语, 92);
System.out.println(map);
// 不可变集合下面代码导致运行时错误
// map.remove(语文);
// 使用Map.entry()方法显式构建key-value对Map map2 Map.ofEntries(Map.entry(语文, 89), Map.entry(数学, 82), Map.entry(英语, 92));
System.out.println(map2);}
}
从上面代码可以看出 Set、List 比较简单程序只要为它们的 of() 方法传入 N 个集合元素即可创建 Set、List 集合。
创建不可变的 Map 集合有两个方法。使用 of() 方法时只要依次传入多个 key-value 对即可还可使用 ofEntries() 方法该方法可接受多个 Entry 对象因此程序显式使用 Map.entry() 方法来创建 Map.Entry 对象。