【问题标题】:How to initialize List<String> object in Java?如何在 Java 中初始化 List<String> 对象?
【发布时间】:2012-11-03 21:51:29
【问题描述】:

我无法像下面的代码那样初始化列表:

List<String> supplierNames = new List<String>();
supplierNames.add("sup1");
supplierNames.add("sup2");
supplierNames.add("sup3");
System.out.println(supplierNames.get(1));

我遇到以下错误:

无法实例化类型List&lt;String&gt;

如何实例化List&lt;String&gt;

【问题讨论】:

    标签: java list


    【解决方案1】:

    如果您检查API 中的List,您会注意到它说:

    Interface List<E>
    

    成为interface 意味着它不能被实例化(不可能有new List())。

    如果您检查该链接,您会发现一些实现 Listclasses:

    所有已知的实现类:

    AbstractListAbstractSequentialListArrayListAttributeListCopyOnWriteArrayListLinkedListRoleListRoleUnresolvedListStackVector

    其中一些可以实例化(那些未定义为abstract class 的)。使用他们的链接了解更多关于他们的信息,即:了解哪个更适合您的需求。

    最常用的3个大概是:

     List<String> supplierNames1 = new ArrayList<String>();
     List<String> supplierNames2 = new LinkedList<String>();
     List<String> supplierNames3 = new Vector<String>();
    

    奖金:
    您还可以使用 Arrays class 以更简单的方式用值实例化它,如下所示:

    List<String> supplierNames = Arrays.asList("sup1", "sup2", "sup3");
    System.out.println(supplierNames.get(1));
    

    但请注意,您不能向该列表添加更多元素,因为它是 fixed-size

    【讨论】:

    • Arrays.asList 很棒,但正如您现在应该注意到的那样,在int[] a = {1,2,3}; System.out.println(Arrays.asList(a)); // [[I@70cdd2] 等情况下,它并没有达到预期的效果
    • @J.A.I.L.这不是正在发生的事情。这是一个元素的列表,其中一个元素是一个整数数组。想要的行为可能是三个元素 1、2 和 3 的列表。
    • @Christoffer Hammarström 打印一个列表或一个数组,你可以使用 java.util.Arrays.toString(array);,所以这个特性已经给出了..
    • 一些不受欢迎的 Vector 用法,例如 thishere。因为线程问题
    • 如果您需要将结果列表设为ArrayList,请使用new ArrayList&lt;&gt;(Arrays.asList("sup1", "sup2", "sup3"))
    【解决方案2】:

    无法实例化接口,但实现很少:

    JDK2

    List<String> list = Arrays.asList("one", "two", "three");
    

    JDK7

    //diamond operator
    List<String> list = new ArrayList<>();
    list.add("one");
    list.add("two");
    list.add("three");
    

    JDK8

    List<String> list = Stream.of("one", "two", "three").collect(Collectors.toList());
    

    JDK9

    // creates immutable lists, so you can't modify such list 
    List<String> immutableList = List.of("one", "two", "three");
    
    // if we want mutable list we can copy content of immutable list 
    // to mutable one for instance via copy-constructor (which creates shallow copy)
    List<String> mutableList = new ArrayList<>(List.of("one", "two", "three"));
    

    此外,Guava 等其他库还提供了许多其他方法。

    List<String> list = Lists.newArrayList("one", "two", "three");
    

    【讨论】:

      【解决方案3】:

      List是一个Interface,你不能实例化一个Interface,因为interface是一个约定,你的类应该有什么方法。为了实例化,您需要该接口的一些实现(实现)。使用非常流行的 List 接口实现尝试以下代码:

      List<String> supplierNames = new ArrayList<String>(); 
      

      List<String> supplierNames = new LinkedList<String>();
      

      【讨论】:

        【解决方案4】:

        您将需要使用ArrayList&lt;String&gt; 等。

        List&lt;String&gt; 是一个接口。

        使用这个:

        import java.util.ArrayList;
        
        ...
        
        List<String> supplierNames = new ArrayList<String>();
        

        【讨论】:

          【解决方案5】:

          List是一个接口,不能初始化接口。而是实例化一个实现类。

          喜欢:

          List<String> abc = new ArrayList<String>();
          List<String> xyz = new LinkedList<String>();
          

          【讨论】:

            【解决方案6】:

            在大多数情况下,您需要简单的 ArrayList - List 的实现

            JDK 7 之前的版本

            List<String> list = new ArrayList<String>();
            

            JDK 7 及更高版本可以使用菱形运算符

            List<String> list = new ArrayList<>();
            

            更多信息写在这里Oracle documentation - Collections

            【讨论】:

              【解决方案7】:

              List 只是一个接口,是一些通用列表的定义。您需要提供此列表接口的实现。最常见的两个是:

              ArrayList - 在数组上实现的列表

              List<String> supplierNames = new ArrayList<String>();
              

              LinkedList - 一个像相互连接的元素链一样实现的列表

              List<String> supplierNames = new LinkedList<String>();
              

              【讨论】:

                【解决方案8】:

                取决于你想使用什么样的列表,比如

                List<String> supplierNames = new ArrayList<String>();
                

                应该让你去。

                List是接口,ArrayList是List接口的一种实现。阅读JavaDocs of the List interface,可以找到更多可能更适合您需求的实现。

                【讨论】:

                  【解决方案9】:

                  如果你只想创建一个不可变 List&lt;T&gt; 里面只有一个 对象,你可以使用这个API:

                  List<String> oneObjectList = Collections.singletonList("theOnlyObject”);
                  

                  更多信息:docs

                  【讨论】:

                    【解决方案10】:

                    List 是一个接口。你不能使用 List 来初始化它。

                      List<String> supplierNames = new ArrayList<String>();
                    

                    这些是一些 List 实现的类,

                    ArrayList, LinkedList, Vector
                    

                    您可以根据自己的要求使用其中任何一种。这些每个类都有自己的特点。

                    【讨论】:

                    • 一些不受欢迎的 Vector 用法,例如 thishere。因为线程问题
                    【解决方案11】:

                    以防万一,还有人在这个问题上徘徊。因为,我看到一两个新用户再次问同样的问题,然后每个人都说,不,你不能那样做,亲爱的谨慎,除了这里给出的所有答案,我想提供附加信息 - 是的,您实际上可以这样做,List list = new List(); 但是以编写接口的所有方法的实现为代价。 这个概念不仅仅是 List list = new List();但是

                    List<Integer> list = new List<Integer>(){
                    
                            @Override
                            public int size() {
                                // TODO Auto-generated method stub
                                return 0;
                            }
                    
                            @Override
                            public boolean isEmpty() {
                                // TODO Auto-generated method stub
                                return false;
                            }
                    
                            @Override
                            public boolean contains(Object o) {
                                // TODO Auto-generated method stub
                                return false;
                            }
                    

                    .....等等(不能写所有方法。)

                    这是一个匿名类的例子。当有人说,不,你不能实例化一个接口,是正确的,这是正确的。但是你永远不能说,你不能写 List list = new List(); 但是,显然你可以做到这一点,这是一个很难的陈述你不能这样做

                    【讨论】:

                    • 需要明确的是,这不会创建一个实际类型为List 的对象。相反,它声明了一个没有名称并实现List 的新类,并在运行时创建新声明的类的新对象。
                    【解决方案12】:

                    而不是:

                    List<String> supplierNames = new List<String>();
                    

                    如果您使用的是最新的 JDK,请写下:

                     List<String> supplierNames = new ArrayList<>();
                    

                    这是初始化List的正确方法。

                    【讨论】:

                      【解决方案13】:

                      我们创建soyuz-to 来简化1 个问题:如何将X 转换为Y(例如String 转换为Integer)。对象的构造也是一种转换,所以它有一个简单的函数来构造MapListSet

                      import io.thedocs.soyuz.to;
                      
                      List<String> names = to.list("John", "Fedor");
                      

                      请检查一下 - 它还有很多其他有用的功能

                      【讨论】:

                        猜你喜欢
                        • 2014-02-11
                        • 1970-01-01
                        • 2011-02-03
                        • 1970-01-01
                        • 2015-08-04
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2023-01-29
                        相关资源
                        最近更新 更多