有没有像这样初始化Java HashMap的方法?:
Map<String,String> test =
new HashMap<String, String>{"test":"test","test":"test"};
Run Code Online (Sandbox Code Playgroud)
什么是正确的语法?我没有发现任何有关此事的内容.这可能吗?我正在寻找最短/最快的方法,将一些"最终/静态"值放在一个永不改变的地图中,并在创建Map时提前知道.
在Java的隐藏功能中,最佳答案提到了Double Brace Initialization,它具有非常诱人的语法:
Set<String> flavors = new HashSet<String>() {{
add("vanilla");
add("strawberry");
add("chocolate");
add("butter pecan");
}};
Run Code Online (Sandbox Code Playgroud)
这个成语创建了一个匿名内部类,其中只包含一个实例初始化程序,"可以使用包含作用域中的任何[...]方法".
主要问题:这听起来效率低吗?它的使用是否应限于一次性初始化?(当然炫耀!)
第二个问题:新的HashSet必须是实例初始化程序中使用的"this"...任何人都可以了解机制吗?
第三个问题:在生产代码中使用这个成语是否过于模糊?
简介:非常非常好的答案,谢谢大家.在问题(3)中,人们认为语法应该是清楚的(尽管我建议偶尔发表评论,特别是如果你的代码会传递给可能不熟悉它的开发人员).
在问题(1)上,生成的代码应该快速运行.额外的.class文件会导致jar文件混乱,并且会稍微减慢程序启动速度(感谢@coobird测量它).@Thilo指出垃圾收集可能会受到影响,在某些情况下,额外加载类的内存成本可能是一个因素.
问题(2)对我来说最有趣.如果我理解答案,那么DBI中发生的事情是匿名内部类扩展了由new运算符构造的对象的类,因此具有引用正在构造的实例的"this"值.井井有条.
总的来说,DBI让我感到非常好奇.Coobird和其他人指出,您可以使用Arrays.asList,varargs方法,Google Collections和提议的Java 7 Collection文字获得相同的效果.Scala,JRuby和Groovy等较新的JVM语言也为列表构建提供了简明的符号,并且与Java良好地互操作.鉴于DBI使类路径混乱,减慢了类加载速度,并使代码更加模糊,我可能会回避它.但是,我打算在一位刚刚获得SCJP的朋友身上发表这篇文章,并且喜欢关于Java语义的好朋友!;-) 感谢大家!
7/2017:Baeldung 对双支撑初始化有很好的总结,并认为它是一种反模式.
12/2017:@Basil Bourque指出,在新的Java 9中你可以说:
Set<String> flavors = Set.of("vanilla", "strawberry", "chocolate", "butter pecan");
Run Code Online (Sandbox Code Playgroud)
这肯定是要走的路.如果您遇到早期版本,请查看Google Collections的ImmutableSet.
{{ ... }}Java中的Double Brace初始化语法()是什么?
我想创建一个map包含条目的条目(int, Point2D)
我怎么能用Java做到这一点?
我尝试了下面的失败.
HashMap hm = new HashMap();
hm.put(1, new Point2D.Double(50, 50));
Run Code Online (Sandbox Code Playgroud) {{ ... }}块在以下代码中的含义是什么?
class X {
private Y var1;
private X() {
Z context = new Z(new SystemThreadPool()) {{
var1 = new Y();
}};
}
}
Run Code Online (Sandbox Code Playgroud) 有内场,地图的枚举.
现在我需要通过其内部领域获得枚举.
写道:
package test;
/**
* Test enum to test enum =)
*/
public enum TestEnum {
ONE(1), TWO(2), THREE(3);
private int number;
TestEnum(int number) {
this.number = number;
}
public TestEnum findByKey(int i) {
TestEnum[] testEnums = TestEnum.values();
for (TestEnum testEnum : testEnums) {
if (testEnum.number == i) {
return testEnum;
}
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
但是每次我需要找到合适的实例时,查看所有枚举并不是非常有效.
有没有其他方法可以做同样的事情?
可能重复:
如何在Java中初始化静态地图
如何在初始化时用Java填充HashMap,这可能是这样的吗?
public static Map<byte,int> sizeNeeded=new HashMap<byte,int>(){1,1};
Run Code Online (Sandbox Code Playgroud) 请看以下示例:
private int[] list;
public Listing() {
// Why can't I do this?
list = {4, 5, 6, 7, 8};
// I have to do this:
int[] contents = {4, 5, 6, 7, 8};
list = contents;
}
Run Code Online (Sandbox Code Playgroud)
为什么我不能使用速记初始化?我能想到解决这个问题的唯一方法是制作另一个数组并设置list为该数组.
我只是想知道是否可以在初始化时定义Map对象的内容.
例如,可以创建一个数组,如下所示:
new String[] {“apples”, “bananas”, “pears”}
Run Code Online (Sandbox Code Playgroud)
所以,我想知道我们能为地图做些类似的事情.
我有以下代码:
Map<String, Map<Double, String>> map = new HashMap<>();
Map<Double,String> Amap = new HashMap<>();
map.put(getValuesTypes.FUT(), HERE);
Run Code Online (Sandbox Code Playgroud)
而不是首先创建一个Map并将其放在"HERE",我正在寻找一个像我可以在List那里使用的功能,这样我就Arrays.asList(...)
可以进入"Here" ?.asMap({1.0,"A"}, {2.0,"B"})