我有一个初始化的数组,如:
Element[] array = {new Element(1), new Element(2), new Element(3)};
Run Code Online (Sandbox Code Playgroud)
我想将此数组转换为ArrayList类的对象.
ArrayList<Element> arraylist = ???;
Run Code Online (Sandbox Code Playgroud) 在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++到Java,明显没有答案的问题是为什么Java不包含运算符重载?
是不是Complex a, b, c; a = b + c;
比简单得多Complex a, b, c; a = b.add(c);
?
是否存在已知的原因,有效的论据,不使运算符重载?这个理由是武断的,还是输给了时间?
是否有一个实用方法可以在一行中执行此操作?我无法在任何地方找到它Collections
,或者List
.
public List<String> stringToOneElementList(String s) {
List<String> list = new ArrayList<String>();
list.add(s);
return list;
}
Run Code Online (Sandbox Code Playgroud)
除非我打算在上面放上花哨的轮辋,否则我不想重新发明轮子.
嗯......类型可以T
,而不是String
.但你明白了.(所有空检查,安全检查......等)
我知道您可以在实例化期间初始化数组,如下所示:
String[] names = new String[] {"Ryan", "Julie", "Bob"};
Run Code Online (Sandbox Code Playgroud)
有没有办法用ArrayList做同样的事情?或者我必须单独添加内容array.add()
吗?
Java中的ArrayList或List声明质疑并回答了如何声明一个空,ArrayList
但是如何声明一个带有值的ArrayList?
我尝试了以下但它返回语法错误:
import java.io.IOException;
import java.util.ArrayList;
public class test {
public static void main(String[] args) throws IOException {
ArrayList<String> x = new ArrayList<String>();
x = ['xyz', 'abc'];
}
}
Run Code Online (Sandbox Code Playgroud) Java 9为列表引入了一种新的工厂方法List.of
:
List<String> strings = List.of("first", "second");
Run Code Online (Sandbox Code Playgroud)
前一个和新选项有什么区别?也就是说,这有什么区别:
Arrays.asList(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)
还有这个:
List.of(1, 2, 3);
Run Code Online (Sandbox Code Playgroud) 我有一个示例程序,如图所示.
我希望我ArrayList
symbolsPresent
用一些预定义的符号初始化:ONE,TWO,THREE和FOUR.
symbolsPresent.add("ONE");
symbolsPresent.add("TWO");
symbolsPresent.add("THREE");
symbolsPresent.add("FOUR");
Run Code Online (Sandbox Code Playgroud)
import java.util.ArrayList;
public class Test {
private ArrayList<String> symbolsPresent = new ArrayList<String>();
public ArrayList<String> getSymbolsPresent() {
return symbolsPresent;
}
public void setSymbolsPresent(ArrayList<String> symbolsPresent) {
this.symbolsPresent = symbolsPresent;
}
public static void main(String args[]) {
Test t = new Test();
System.out.println("Symbols Present is" + t.symbolsPresent);
}
}
Run Code Online (Sandbox Code Playgroud)
那可能吗?
我有MyClass
MyClass(String, String, int);
Run Code Online (Sandbox Code Playgroud)
我知道如何以这种方式添加到ArrayList:
MyClass.name = "Name";
MyClass.address = "adress";adress
MyClass.age = age;
Run Code Online (Sandbox Code Playgroud)
然后添加到arrayList,如:
list.add(MyClass);
Run Code Online (Sandbox Code Playgroud)
但现在我有很多以静态形式存在的对象MyClass,我想添加
ArrayList<MyClass> list = new ArrayList<MyClass>({"Name","Address", age};.....);
Run Code Online (Sandbox Code Playgroud)
我可以这样做吗 谢谢,无论如何
Java 9附带了用于创建不可变列表的便捷工厂方法.最后,列表创建非常简单:
List<String> list = List.of("foo", "bar");
Run Code Online (Sandbox Code Playgroud)
但是这个方法有12个重载版本,11个有0到10个元素,另一个有var args.
static <E> List<E> of(E... elements)
Run Code Online (Sandbox Code Playgroud)
同样是与案件Set
和Map
.
由于存在var args方法,有多少11种方法有什么意义呢?
我认为var-args创建一个数组,所以其他11个方法可以跳过创建一个额外的对象,在大多数情况下会有0-10个元素.还有其他原因吗?
java ×10
arraylist ×4
collections ×3
arrays ×2
java-9 ×2
c++ ×1
declare ×1
list ×1
performance ×1