- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
谁能解释为什么 subList() 不像 subSet() 方法那样运行,并抛出 ConcurrentModificationException,而 子集 不是。这两种方法都创建了一个 Backed Collection,所以可能 subList() 方法 设计者创建这个方法依赖于不可修改的原始列表,但如果所有 Backed Collections 具有相同的行为(如 subSet())?
//代码
public class ConcurrentModificationException {
public static void main(String[] args) {
String[] array = {"Java","Python","Pearl","Ada","Javascript","Go","Clojure"};
subListEx(array);
subSetEx(array);
}
private static void subListEx(String[] array) {
List<String> l = new ArrayList<String>(Arrays.asList(array));
List<String> l2 = l.subList(2, 4);
System.out.println(l.getClass().getName());
// l.add("Ruby"); // ConcurrentModificationException
// l.remove(2); // ConcurrentModificationException
l2.remove("Ada"); // OK
for (String s:l) { System.out.print(s+", "); }
System.out.println();
for (String s:l2) { System.out.print(s+", "); }
}
private static void subSetEx(String[] array) {
SortedSet<String> s1 = new TreeSet<String>(Arrays.asList(array));
SortedSet<String> s2 = s1.subSet("Java", "Python");
s1.remove("Ada");
for (String s:s1) { System.out.print(s+", "); }
System.out.println();
for (String s:s2) { System.out.print(s+", "); }
}}
提前致谢!
最佳答案
很明显,行为符合记录。但我认为您的主要问题是为什么 ArrayList
和 TreeSet
的行为不同。好吧,这与数据在两个集合中的内部存储方式有关。
ArrayList
在内部使用一个数组来存储数据,随着 ArrayList
的大小动态增加,它会重新调整大小。现在,当您创建给定列表的 subList
时,具有指定索引的原始列表与 subList
相关联。因此,在原始列表中进行的任何结构更改(破坏原始数组的索引)都会使作为子列表的一部分存储的索引变得毫无意义。这就是为什么在 ArrayList#subList
方法中不允许进行任何结构更改的原因。subList 方法返回 ArrayList
类中名为 SubList
的 inner
类实例,如下所示:
private class SubList extends AbstractList<E> implements RandomAccess {
private final AbstractList<E> parent;
private final int parentOffset;
private final int offset;
int size;
SubList(AbstractList<E> parent,
int offset, int fromIndex, int toIndex) {
this.parent = parent;
this.parentOffset = fromIndex;
this.offset = offset + fromIndex;
this.size = toIndex - fromIndex;
this.modCount = ArrayList.this.modCount;
}
如您所见,SubList
包含对原始列表的引用。 parentOffset
只是您正在创建的 subList
的起始索引。现在修改原始 list
可能会更改原始列表中 fromIndex
处的值,但不会更改 SubList
中的值。在这种情况下,SubList
类中的 parentOffset
和原始列表中的 fromIndex
将指向不同的数组元素。也有可能在某个时候原始数组变得足够短,使 SubList
中存储的索引无效并使其 OutOfRange
。这当然是不可取的,并且在对原始列表进行此类结构更改时,返回的子列表的语义被认为是未定义。
另一方面,TreeSet
在内部将其数据存储在 TreeMap
中。现在,由于 Map
中没有这样的索引概念,因此不存在索引中断的问题。 Map
只不过是 key-value 对的映射。创建一个 SubSet 涉及创建一个由原始 Map
支持的 SubMap。修改原始 Set
只需要使相应的 key-value 映射无效,从而将更改传播到为 创建的
.subMap
子集
关于java - subList() 与其他类似的 Collections 方法有不同的行为,一旦 subList 被改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18367173/
谁能解释为什么 subList() 不像 subSet() 方法那样运行,并抛出 ConcurrentModificationException,而 子集 不是。这两种方法都创建了一个 Backed
是否有任何函数或方法可以在 python 2.7 中递归实现此目的? Input : ['and', ['or', 'P', '-R', 'P'], ['or', '-Q', '-R', 'P']]
让我们考虑一下:List ints = Arrays.asList("1","2","3","4","5","6")让 k=2 . 我们想返回以下列表 List : ["12", "23", "34
当我使用子列表时,我遇到了 ConcurrentModificationException 问题。 我的问题是:使用子列表创建新集合是否安全? 示例: List list = new LinkedLi
如果有重复,我深表歉意,但我进行了搜索,但找不到任何可以解决我当前问题的主题。 我想知道是否有某种Pythonic方法可以并行迭代两个(或更多)子列表。我已经很了解 zip 函数,因此我将在一个简短的
我已经定义了 ArrayList: ArrayList numbers = new ArrayList(); 我只想处理它的特定部分,所以我创建了子列表: List numbersh = number
public List> splitList( List values) { List> newList = new ArrayList>(); //Type mism
我有一个显示 Glassfish 日志文件列表的 JSF 页面。我使用延迟加载进行分页。我将日志文件名列表保存到 Java List. private List dataList = new Arra
是否有技巧或前奏函数来测试列表是否包含特定的子字符串/子列表? xyz :: [a] -> [a] -> Bool xyz "hello world" "worl" -> True xyz [1,2,
我在单元测试中遇到了这个问题。 执行后: List cleanCards = cards.subList(0, cards.size() - difference); 以下断言给了我一个 Concur
我需要实现一个在序列上滑动的滑动窗口。 (1:[0,1,2,3]2:[1,2,3,4],...)哪个批准可能更快?1. for each step i; {List=wholeList.sublist
因此我修改了 API(用于命令管理)以使用 String[] 而不是字符串列表。 我的问题在这里:strings.subList(1, strings.length)所以我需要将其更改为可以完成相同工
如果我有一个变量 LinkedList list 并重复执行以下操作以提取“列表”的尾部 // Some operation that adds elements to 'list' // max_s
我很想知道最新的 JVM 如何处理通过以下方法保留的垃圾回收内存。 public List getHallOfFame() { ArrayList listToSort = new ArrayLi
我有一个使用 JPA 保存的 java 对象。该对象有一个成员“friendsList”,它是一个字符串列表。我在这个对象上使用了@CollectionOfElements hibernate 注释。
我有一个长度为 x 值的列表。该列表被分解成不同长度的子列表。然后我将这些子列表写入输出文件。有没有办法打印没有括号的子列表。 编辑清楚: 实际 列表有 300 个子列表,其中包含 12250 个元素
Erlang 有没有办法在 ets 表上创建一个选择查询,它将获得 的所有元素包含 搜索到的文本? ets:select(Table, [{ %% Match spec for select qu
这是简化的代码 public Page getTestData(TestData testData, Pageable pageRequest) { List results = getSomethi
我是序言的新学习者。这是我们工作室的问题,我不知道从哪里开始。 真的很感激这方面的任何帮助。 子列表(Xs,Ys) 当 Xs 是一个包含 Ys 的某些元素的列表时,这适用于它们在列表 Ys 中出现的相
我目前正在开发我的第一个 Android 应用程序。它解析 JSON 数据并将其放入 ListView(见下文)。 protected void onPostExecute(String result
我是一名优秀的程序员,十分优秀!