相关疑难解决方法(0)

如何直接初始化HashMap(以字面方式)?

有没有像这样初始化Java HashMap的方法?:

Map<String,String> test = 
    new HashMap<String, String>{"test":"test","test":"test"};
Run Code Online (Sandbox Code Playgroud)

什么是正确的语法?我没有发现任何有关此事的内容.这可能吗?我正在寻找最短/最快的方法,将一些"最终/静态"值放在一个永不改变的地图中,并在创建Map时提前知道.

java collections dictionary initialization

990
推荐指数
9
解决办法
118万
查看次数

Java"双支撑初始化"的效率?

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 collections performance initialization

786
推荐指数
10
解决办法
12万
查看次数

280
推荐指数
8
解决办法
8万
查看次数

用Java创建地图

我想创建一个map包含条目的条目(int, Point2D)

我怎么能用Java做到这一点?

我尝试了下面的失败.

HashMap hm = new HashMap();

hm.put(1, new Point2D.Double(50, 50));
Run Code Online (Sandbox Code Playgroud)

java map

68
推荐指数
6
解决办法
24万
查看次数

new Class(...){{...}}初始化习语的含义

{{ ... }}块在以下代码中的含义是什么?

class X {

    private Y var1;

    private X() {
        Z context = new Z(new SystemThreadPool()) {{
            var1 = new Y();
        }};
    }

}
Run Code Online (Sandbox Code Playgroud)

java initialization double-brace-initialize

44
推荐指数
2
解决办法
8819
查看次数

通过其内部领域获得枚举

有内场,地图的枚举.

现在我需要通过其内部领域获得枚举.

写道:

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 enums

32
推荐指数
2
解决办法
2万
查看次数

在创建期间填充哈希映射

可能重复:
如何在Java中初始化静态地图

如何在初始化时用Java填充HashMap,这可能是这样的吗?

public static Map<byte,int> sizeNeeded=new HashMap<byte,int>(){1,1};
Run Code Online (Sandbox Code Playgroud)

java collections initialization

23
推荐指数
1
解决办法
4万
查看次数

为什么不能在Java构造函数中使用字段的简写数组初始化?

请看以下示例:

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为该数组.

java arrays array-initialization

21
推荐指数
2
解决办法
9301
查看次数

如何在初始化时定义Map内容?

我只是想知道是否可以在初始化时定义Map对象的内容.

例如,可以创建一个数组,如下所示:

new String[] {“apples”, “bananas”, “pears”}
Run Code Online (Sandbox Code Playgroud)

所以,我想知道我们能为地图做些类似的事情.

java collections initialization map

14
推荐指数
2
解决办法
3万
查看次数

Arrays.asList也适用于地图?

我有以下代码:

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"})

java dictionary list

13
推荐指数
3
解决办法
1万
查看次数