我知道,如果你将盒装原始Integer与常量进行比较,例如:
Integer a = 4;
if (a < 5)
Run Code Online (Sandbox Code Playgroud)
a 将自动取消装箱,比较将起作用.
但是,当您比较两个盒装Integers并希望比较相等或小于/大于?时会发生什么?
Integer a = 4;
Integer b = 5;
if (a == b)
Run Code Online (Sandbox Code Playgroud)
以上代码是否会导致检查它们是否是同一个对象,还是会在这种情况下自动取消装箱?
关于什么:
Integer a = 4;
Integer b = 5;
if (a < b)
Run Code Online (Sandbox Code Playgroud)
?
假设我有这样一个ArrayList:
ArrayList<Integer> list = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)
添加操作后:
list.add(2);
list.add(3);
list.add(5);
list.add(7);
Run Code Online (Sandbox Code Playgroud)
number 2如果我这样做,我想删除
list.remove(2);
Run Code Online (Sandbox Code Playgroud)
然后number 5将被删除,我怎么能删除number 2?并且假设我不知道索引number 2.
我有一个小的实现细节问题,我在ArrayList::removeIf. 我不认为我可以简单地把它放在没有一些先决条件的情况下。
如此:实现基本是散装 remove,不像ArrayList::remove。一个例子应该让事情更容易理解。假设我有这个列表:
List<Integer> list = new ArrayList<>(); // 2, 4, 6, 5, 5
list.add(2);
list.add(4);
list.add(6);
list.add(5);
list.add(5);
Run Code Online (Sandbox Code Playgroud)
我想删除每个偶数元素。我可以:
Iterator<Integer> iter = list.iterator();
while (iter.hasNext()) {
int elem = iter.next();
if (elem % 2 == 0) {
iter.remove();
}
}
Run Code Online (Sandbox Code Playgroud)
或者:
list.removeIf(x -> x % 2 == 0);
Run Code Online (Sandbox Code Playgroud)
结果将是相同的,但实现却大不相同。由于iterator是 的视图,因此ArrayList每次调用时remove,底层ArrayList都必须处于“良好”状态,这意味着内部数组实际上会发生变化。同样,在每次调用 时remove,都会在System::arrayCopy内部进行调用。
在对比度removeIf上更聪明。由于它在内部进行迭代,因此可以使事情更加优化。它这样做的方式很有趣。
它首先计算应该从中删除元素的索引。这是通过首先计算一个 tiny 来完成的,这是BitSet一个 …