我记得,在Java 8之前,默认容量ArrayList
是10.
令人惊讶的是,对default(void)构造函数的注释仍然说: Constructs an empty list with an initial capacity of ten.
来自ArrayList.java
:
/**
* Shared empty array instance used for default sized empty instances. We
* distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
* first element is added.
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
...
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
Run Code Online (Sandbox Code Playgroud) 如果lambda表达式不需要参数,因此它的名称是多余的,我如何编写它?
这种方式不编译:
setRowFactory(-> new TableRowCustom());
Run Code Online (Sandbox Code Playgroud)
但是这个做了:
setRowFactory(__ -> new TableRowCustom());
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
所以我发现了Java的Map computeIfAbsent
(使用java8)方法的好奇心,我希望有人能告诉我为什么会发生这种情况,因为我无法真正遵循该问题背后的逻辑.
所以,我有一个带有键的Map(显然),值是一个列表,当没有设置键时,我使用computeIfAbsent创建一个新列表.现在,当我使用Integer作为键时,我可以使用以下内容:
List<Object> list = map.computeIfAbsent(1, ArrayList::new);
Run Code Online (Sandbox Code Playgroud)
但是当我使用String作为密钥尝试使用时
List<Object> list = map.computeIfAbsent("key", ArrayList::new);
Run Code Online (Sandbox Code Playgroud)
我得到了错误The method computeIfAbsent(String, Function<? super String,? extends List<Object>>) in the type Map<String,List<Object>> is not applicable for the arguments (String, ArrayList::new)
.是否缺少实施?使用String键我必须使用类似的方法,然后再次使用.
List<Object> list = map.computeIfAbsent("key", k -> new ArrayList<>());
Run Code Online (Sandbox Code Playgroud)
也许有人可以启发我.谢谢 :)
我只有50000 个对象时出现内存不足错误。
我检查了computeIfAbsent
实现,但不幸的是没有发现任何奇怪的东西。
我的机器配置是16 GB
ram 和core I7
.
public class Test {
public static void main(String[] args) {
int count = 50000;
List<ListObject> list = new ArrayList();
for (int i = 0; i < count; i++) {
int key = ThreadLocalRandom.current().nextInt(100000);
int value = ThreadLocalRandom.current().nextInt(1000000);
list.add(new ListObject(key, value));
}
Map<Integer, List<Integer>> map = new HashMap();
for (ListObject a : list) {
map.computeIfAbsent(a.getKey(), ArrayList::new);
}
System.out.println("Done");
}
Run Code Online (Sandbox Code Playgroud)
我的 ListObject 如下:
class ListObject {
public …
Run Code Online (Sandbox Code Playgroud)