Java Collections.unmodifiableCollection是否保留基础集合的顺序?

时间:2017-04-06 10:06:12

标签: java collections

我假设,Collections中的不可修改的方法返回底层集合的视图或外观。似乎不言自明的是FILE *readFile = fopen("test.bin","rb"); int data; while(fread(&data,1,1, readFile)==1){ printf("%d", data); //here it will output some random number } fclose(readFile); 将使用基础列表的顺序,而unmodifiableList可以随意执行任何操作,因为没有排序。

我正在使用unmodfiableSet这是一个集合,但确实保留了排序,并试图公开保留基础排序的集合的不可修改的视图。使用LinkedHashSet似乎不合适,但我无法使用unmodifiableSet。我无法找到保证unmodifiableList将使用基础集合中的任何排序,但我怀疑它会。

有人能指出一个定义这种行为或与之矛盾的规范吗?

2 个答案:

答案 0 :(得分:1)

mediator .Setup(m => m.Send(It.IsAny<TransferNotificationCommand>(), It.IsAny<CancellationToken>())) .ReturnsAsync(new Notification()) //<-- return Task to allow await to continue .Verifiable("Notification was not sent."); //...other code removed for brevity mediator.Verify(x => x.Send(It.IsAny<CreateIsaTransferNotificationCommand>(), It.IsAny<CancellationToken>()), Times.Once()); 的调用只是创建了一个瘦包装器,在进行mutate方法调用时抛出异常。所有其他方法调用都会进入底层集合,因此除了原始集合之外,没有任何其他方法会影响排序或其他内容。

包装器没有状态,它只有对底层集合的引用。

整个Collections.unmodifiableXXX包装器非常小,因为迭代器(继承自UnmodifiableSet)使用底层集合中的迭代器(除了它覆盖UnmodifiableCollection),迭代顺序为与原始集合中的完全相同。

remove()

答案 1 :(得分:0)

根据集合类的java doc

  

不可修改的集合:集合元素的迭代顺序未指定,并且可能会发生变化。