请问有人能告诉我这是否正确?如果不是,是否存在可能会失败的情况?
感谢任何输入!
我认为这是JDK中的一个真正差距。幸运的是,由Java集合设计师Joshua Bloch领导的Google团队创建了一个库,其中包括真正的不可变集合。
ImmutableList特别是您要查找的实现。 这里是Guava ImmutableCollections一些功能的快速概述。
Collections.unmodifiableList(this.data)
上面的语句就足够了,因为它会返回一个视图。对此视图进行任何修改都将导致抛出UnsupportedOperationException
。以下是Collections#unmodifiableList
文档的摘录。
返回指定列表的不可修改视图。此方法允许模块向用户提供对内部列表的“只读”访问权限。对返回的列表进行的查询操作“透过”到指定的列表,并且尝试修改返回的列表(无论是直接还是通过其迭代器),都会导致
UnsupportedOperationException
。......
/**
* @serial include
*/
static class UnmodifiableList<E> extends UnmodifiableCollection<E>
implements List<E> {
static final long serialVersionUID = -283967356065247728L;
final List<? extends E> list;
UnmodifiableList(List<? extends E> list) {
super(list);
this.list = list;
}
public boolean equals(Object o) {return o == this || list.equals(o);}
public int hashCode() {return list.hashCode();}
public E get(int index) {return list.get(index);}
public E set(int index, E element) {
throw new UnsupportedOperationException();
}
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
public E remove(int index) {
throw new UnsupportedOperationException();
}
public int indexOf(Object o) {return list.indexOf(o);}
public int lastIndexOf(Object o) {return list.lastIndexOf(o);}
public boolean addAll(int index, Collection<? extends E> c) {
throw new UnsupportedOperationException();
}
public ListIterator<E> listIterator() {return listIterator(0);}
public ListIterator<E> listIterator(final int index) {
return new ListIterator<E>() {
ListIterator<? extends E> i = list.listIterator(index);
public boolean hasNext() {return i.hasNext();}
public E next() {return i.next();}
public boolean hasPrevious() {return i.hasPrevious();}
public E previous() {return i.previous();}
public int nextIndex() {return i.nextIndex();}
public int previousIndex() {return i.previousIndex();}
public void remove() {
throw new UnsupportedOperationException();
}
public void set(E e) {
throw new UnsupportedOperationException();
}
public void add(E e) {
throw new UnsupportedOperationException();
}
};
}
copyOf
这是Java 10及更高版本内置的方法。
每个方法都返回一个独立的集合,其中包含原始集合中的对象。返回的集合与 Collections.unmodifiable…
实用程序类方法不同,它们不是对原始集合的视图。
copyOf
方法复制的是引用(指针),而不是对象本身,因此涉及的内存不多。
copyOf
方法复制的是引用(指针),而不是对象本身。因此,不会涉及太多内存。 - Basil BourqueList.of, Map.of, Map.copyOf(Java 10+)
...根据Oracle文档,一个不可变集合的优点就是它自动保证了线程安全性。在创建集合后,您可以将其交给多个线程使用,并且它们都会看到一致的视图。阅读更多信息:oracle docs