【发布时间】:2010-10-25 21:45:25
【问题描述】:
我们创建一个Set 为:
Set myset = new HashSet()
我们如何在 Java 中创建List?
【问题讨论】:
标签: java list collections
我们创建一个Set 为:
Set myset = new HashSet()
我们如何在 Java 中创建List?
【问题讨论】:
标签: java list collections
List myList = new ArrayList();
或使用泛型(Java 7 或更高版本)
List<MyType> myList = new ArrayList<>();
或使用泛型(旧 java 版本)
List<MyType> myList = new ArrayList<MyType>();
【讨论】:
另外,如果你想创建一个包含东西的列表(尽管它是固定大小的):
List<String> messages = Arrays.asList("Hello", "World!", "How", "Are", "You");
【讨论】:
让我总结一下并补充一点:
1. new ArrayList<String>();
2. Arrays.asList("A", "B", "C")
1. Lists.newArrayList("Mike", "John", "Lesly");
2. Lists.asList("A","B", new String [] {"C", "D"});
不可变列表
1. Collections.unmodifiableList(new ArrayList<String>(Arrays.asList("A","B")));
2. ImmutableList.builder() // Guava
.add("A")
.add("B").build();
3. ImmutableList.of("A", "B"); // Guava
4. ImmutableList.copyOf(Lists.newArrayList("A", "B", "C")); // Guava
空的不可变列表
1. Collections.emptyList();
2. Collections.EMPTY_LIST;
人物列表
1. Lists.charactersOf("String") // Guava
2. Lists.newArrayList(Splitter.fixedLength(1).split("String")) // Guava
整数列表
Ints.asList(1,2,3); // Guava
【讨论】:
Ints.asList 不会创建一个不可变列表,而是一个由给定整数数组支持的固定大小的列表(即它支持List.set(int, Object))。 “不可变字符列表”的第二个示例也不是不可变的(我会删除该行)。
创建固定大小的非空列表(不支持添加、删除等操作):
List<Integer> list = Arrays.asList(1, 2); // but, list.set(...) is supported
创建一个非空的可变列表:
List<Integer> list = new ArrayList<>(Arrays.asList(3, 4));
使用新的List.of(...) 静态工厂方法:
List<Integer> immutableList = List.of(1, 2);
List<Integer> mutableList = new ArrayList<>(List.of(3, 4));
使用Local Variable Type Inference:
var list1 = List.of(1, 2);
var list2 = new ArrayList<>(List.of(3, 4));
var list3 = new ArrayList<String>();
并遵循最佳实践...
自 Java 5 以来,泛型已成为该语言的一部分 - 您应该使用它们:
List<String> list = new ArrayList<>(); // Good, List of String
List list = new ArrayList(); // Bad, don't do that!
例如编程到List接口:
List<Double> list = new ArrayList<>();
代替:
ArrayList<Double> list = new ArrayList<>(); // This is a bad idea!
【讨论】:
【讨论】:
ArrayList。如果我只处理列表的末尾,它是一个双端队列(或队列),我使用ArrayDeque 实现。原因是即使基于数组的实现可能在空槽上浪费一些内存(当我无法预测必要的容量时),对于小型集合来说,这与所有链表(或双端队列)中的节点实例。作为回报,我得到随机访问。 LinkedList 提供了哪些独特的好处?
从 Java 7 开始你有type inference for generic instance creation,所以没有必要在赋值的右边复制泛型参数:
List<String> list = new ArrayList<>();
固定大小的列表可以定义为:
List<String> list = Arrays.asList("foo", "bar");
对于不可变列表,您可以使用Guava 库:
List<String> list = ImmutableList.of("foo", "bar");
【讨论】:
//simple example creating a list form a string array
String[] myStrings = new String[] {"Elem1","Elem2","Elem3","Elem4","Elem5"};
List mylist = Arrays.asList(myStrings );
//getting an iterator object to browse list items
Iterator itr= mylist.iterator();
System.out.println("Displaying List Elements,");
while(itr.hasNext())
System.out.println(itr.next());
【讨论】:
List 是一个类似Set 的接口,并且有ArrayList 和LinkedList 作为general purpose implementations。
我们可以创建列表为:
List<String> arrayList = new ArrayList<>();
List<String> linkedList = new LinkedList<>();
我们也可以创建一个固定大小的列表:
List<String> list = Arrays.asList("A", "B", "C");
我们几乎总是使用ArrayList 而不是LinkedList 实现:
LinkedList 为对象使用了大量空间,当我们有很多元素时性能很差。LinkedList 中的任何索引操作都需要 O(n) 时间,而 ArrayList 中的时间为 O(1)。上面Arrays.asList创建的列表不能在结构上修改,但它的元素仍然可以修改。
根据doc,方法Collections.unmodifiableList 返回指定列表的不可修改视图。我们可以这样得到:
Collections.unmodifiableList(Arrays.asList("A", "B", "C"));
如果我们使用 Java 9,那么:
List<String> list = List.of("A", "B");
如果我们在 Java 10 中,那么方法 Collectors.unmodifiableList 将返回 Java 9 中引入的真正不可修改列表的实例。查看此 answer 以获取有关 Collections.unmodifiableList 与 Collectors.unmodifiableList 中差异的更多信息 Java 10。
【讨论】:
List list = new ArrayList();
或者使用泛型
List<String> list = new ArrayList<String>();
当然,您也可以将字符串替换为任何类型的变量,例如整数。
【讨论】:
由于java中数组列表的声明就像
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable
您可以通过多种方式在 java 中创建和初始化数组列表。
1) List list = new ArrayList();
2) List<type> myList = new ArrayList<>();
3) List<type> myList = new ArrayList<type>();
4) Using Utility class
List<Integer> list = Arrays.asList(8, 4);
Collections.unmodifiableList(Arrays.asList("a", "b", "c"));
5) Using static factory method
List<Integer> immutableList = List.of(1, 2);
6) Creation and initializing at a time
List<String> fixedSizeList = Arrays.asList(new String[] {"Male", "Female"});
Again you can create different types of list. All has their own characteristics
List a = new ArrayList();
List b = new LinkedList();
List c = new Vector();
List d = new Stack();
List e = new CopyOnWriteArrayList();
【讨论】:
有时——但很少——而不是新的 ArrayList,您可能需要一个新的 LinkedList。从 ArrayList 开始,如果您有性能问题并且有证据表明该列表存在问题,并且对该列表进行了大量添加和删除 - 然后 - 而不是之前 - 切换到 LinkedList 并查看情况是否有所改善。但总的来说,坚持使用 ArrayList,一切都会好起来的。
【讨论】:
以下是创建列表的一些方法。
java.lang.UnsupportedOperationException。 List<String> fixedSizeList = Arrays.asList(new String[] {"Male", "Female"});
List<String> fixedSizeList = Arrays.asList("Male", "Female");
List<String> fixedSizeList = List.of("Male", "Female"); //from java9
以下版本是一个简单的列表,您可以在其中添加/删除任意数量的元素。
List<String> list = new ArrayList<>();
这是在java中创建LinkedList的方法,如果你需要频繁插入/删除列表中的元素,你应该使用LinkedList而不是ArrayList
List<String> linkedList = new LinkedList<>();
【讨论】:
Arrays.asList("Male", "Female")。
【讨论】:
使用Google Collections,您可以在Lists类中使用以下方法
import com.google.common.collect.Lists;
// ...
List<String> strings = Lists.newArrayList();
List<Integer> integers = Lists.newLinkedList();
可变参数初始化和从Iterable<T> 初始化存在重载。
这些方法的优点是您不需要像使用构造函数那样显式指定泛型参数 - 编译器会根据变量的类型推断它。
【讨论】:
作为一个选项,您可以在此处使用双括号初始化:
List<String> list = new ArrayList<String>(){
{
add("a");
add("b");
}
};
【讨论】:
List<Object> nameOfList = new ArrayList<Object>();
您需要导入List 和ArrayList。
【讨论】:
更多选项可以用 Java 8 做同样的事情,不是更好,也不是更糟,只是不同,如果你想对列表做一些额外的工作,Streams 将为你提供更多选择(过滤器、映射、减少、等等)
List<String> listA = Stream.of("a", "B", "C").collect(Collectors.toList());
List<Integer> listB = IntStream.range(10, 20).boxed().collect(Collectors.toList());
List<Double> listC = DoubleStream.generate(() -> { return new Random().nextDouble(); }).limit(10).boxed().collect(Collectors.toList());
LinkedList<Integer> listD = Stream.iterate(0, x -> x++).limit(10).collect(Collectors.toCollection(LinkedList::new));
【讨论】:
使用 Java 9,您可以执行以下操作来创建 不可变 List:
List<Integer> immutableList = List.of(1, 2, 3, 4, 5);
List<Integer> mutableList = new ArrayList<>(immutableList);
【讨论】:
有很多方法可以创建 Set 和 List。 HashSet 和 ArrayList 只是两个例子。如今,将泛型与集合一起使用也相当普遍。我建议你看看它们是什么
这是对 java 的内置集合的一个很好的介绍。 http://java.sun.com/javase/6/docs/technotes/guides/collections/overview.html
【讨论】:
List arrList = new ArrayList();
最好按照下面的建议使用泛型:
List<String> arrList = new ArrayList<String>();
arrList.add("one");
如果你使用 LinkedList。
List<String> lnkList = new LinkedList<String>();
【讨论】:
使用Eclipse Collections,您可以像这样创建一个列表:
List<String> list1 = Lists.mutable.empty();
List<String> list2 = Lists.mutable.of("One", "Two", "Three");
如果你想要一个不可变的列表:
ImmutableList<String> list3 = Lists.immutable.empty();
ImmutableList<String> list4 = Lists.immutable.of("One", "Two", "Three");
您可以通过使用原始列表来避免自动装箱。以下是创建 int 列表的方法:
MutableIntList list5 = IntLists.mutable.empty();
MutableIntList list6 = IntLists.mutable.of(1, 2, 3);
ImmutableIntList list7 = IntLists.immutable.empty();
ImmutableIntList list8 = IntLists.immutable.of(1, 2, 3);
所有 8 个原语都有变体。
MutableLongList longList = LongLists.mutable.of(1L, 2L, 3L);
MutableCharList charList = CharLists.mutable.of('a', 'b', 'c');
MutableShortList shortList = ShortLists.mutable.of((short) 1, (short) 2, (short) 3);
MutableByteList byteList = ByteLists.mutable.of((byte) 1, (byte) 2, (byte) 3);
MutableBooleanList booleanList = BooleanLists.mutable.of(true, false);
MutableFloatList floatList = FloatLists.mutable.of(1.0f, 2.0f, 3.0f);
MutableDoubleList doubleList = DoubleLists.mutable.of(1.0, 2.0, 3.0);
注意:我是 Eclipse Collections 的提交者。
【讨论】:
试试这个:
List<String> messages = Arrays.asList("bla1", "bla2", "bla3");
或者:
List<String> list1 = Lists.mutable.empty(); // Empty
List<String> list2 = Lists.mutable.of("One", "Two", "Three");
【讨论】:
如果您需要具有单个实体的可序列化、不可变列表,您可以使用:
List<String> singList = Collections.singletonList("stackoverlow");
【讨论】: