我想创建一个用于测试目的的选项列表.起初,我这样做了:
ArrayList<String> places = new ArrayList<String>();
places.add("Buenos Aires");
places.add("Córdoba");
places.add("La Plata");
Run Code Online (Sandbox Code Playgroud)
然后我重构代码如下:
ArrayList<String> places = new ArrayList<String>(
Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?
检查变量是否已初始化的哪种方法更好/更正?(假设变量可以包含任何内容(字符串,整数,对象,函数等))
if (elem) { // or !elem
Run Code Online (Sandbox Code Playgroud)
要么
if (typeof(elem) !== 'undefined') {
Run Code Online (Sandbox Code Playgroud)
要么
if (elem != null) {
Run Code Online (Sandbox Code Playgroud) 你会如何Map在Java中初始化静态?
方法一:静态初始化
方法二:实例初始化(匿名子类)还是其他一些方法?
各自的优点和缺点是什么?
这是一个说明两种方法的示例:
import java.util.HashMap;
import java.util.Map;
public class Test {
private static final Map<Integer, String> myMap = new HashMap<Integer, String>();
static {
myMap.put(1, "one");
myMap.put(2, "two");
}
private static final Map<Integer, String> myMap2 = new HashMap<Integer, String>(){
{
put(1, "one");
put(2, "two");
}
};
}
Run Code Online (Sandbox Code Playgroud) 有没有像这样初始化Java HashMap的方法?:
Map<String,String> test =
new HashMap<String, String>{"test":"test","test":"test"};
Run Code Online (Sandbox Code Playgroud)
什么是正确的语法?我没有发现任何有关此事的内容.这可能吗?我正在寻找最短/最快的方法,将一些"最终/静态"值放在一个永不改变的地图中,并在创建Map时提前知道.
如果'Test'是一个普通的类,那么之间有什么区别:
Test* test = new Test;
Run Code Online (Sandbox Code Playgroud)
和
Test* test = new Test();
Run Code Online (Sandbox Code Playgroud) 我在C中有一个大数组(如果有所不同,则不是C++).我想将所有成员初始化为相同的值.我发誓我曾经知道一个简单的方法来做到这一点.我可以memset()在我的情况下使用,但是没有办法在C语法中构建这样做吗?
在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.
在C#中,我想用空字符串初始化字符串值.
我该怎么做?什么是正确的方法,为什么?
string willi = string.Empty;
Run Code Online (Sandbox Code Playgroud)
要么
string willi = String.Empty;
Run Code Online (Sandbox Code Playgroud)
要么
string willi = "";
Run Code Online (Sandbox Code Playgroud)
或者是什么?
我需要创建一个Set初始值.
Set<String> h = new HashSet<String>();
h.add("a");
h.add("b");
Run Code Online (Sandbox Code Playgroud)
有没有办法在一行代码中执行此操作?例如,它对最终的静态字段很有用.
我可以创建一个数组并像这样初始化它:
int a[] = {10, 20, 30};
Run Code Online (Sandbox Code Playgroud)
如何创建std::vector和初始化它同样优雅?
我知道的最好方法是:
std::vector<int> ints;
ints.push_back(10);
ints.push_back(20);
ints.push_back(30);
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
initialization ×10
collections ×5
java ×5
c++ ×2
constructor ×2
dictionary ×2
.net ×1
arraylist ×1
arrays ×1
c ×1
c# ×1
c++-faq ×1
hashset ×1
idiomatic ×1
if-statement ×1
javascript ×1
new-operator ×1
performance ×1
stl ×1
string ×1
undefined ×1
variables ×1
vector ×1