【问题标题】:Initializing ArrayList with some predefined values [duplicate]用一些预定义的值初始化 ArrayList [重复]
【发布时间】:2013-04-18 04:15:05
【问题描述】:

我有一个如图所示的示例程序。

我希望我的 ArrayList symbolsPresent 使用一些预定义的符号进行初始化:一、二、三和四。

symbolsPresent.add("ONE");
symbolsPresent.add("TWO");
symbolsPresent.add("THREE");
symbolsPresent.add("FOUR");

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);

    }    
}

这可能吗?

【问题讨论】:

标签: java


【解决方案1】:

试试这个

new String[] {"One","Two","Three","Four"};

List<String> places = Arrays.asList("One", "Two", "Three");

ARRAYS

【讨论】:

  • 好的解决方案,asList(...) 像问题作者要求的那样返回新的 ArrayList(a)
  • @CarlosHenriqueRodriguez asList(...) 返回 List 而不是 ArrayList
  • @PermGenError List 是返回类型,方法返回ArrayList。它不是 java.util.ArrayList,它是一个具有相同行为的内部类
  • Arrays.asList(T...) 返回的列表的大小限制为构造函数中提供的数组的大小。这可能是也可能不是问题,具体取决于使用情况。
【解决方案2】:

双括号初始化是一个选项:

List<String> symbolsPresent = new ArrayList<String>() {{
   add("ONE");
   add("TWO");
   add("THREE");
   add("FOUR");
}};

注意String 泛型类型参数JLS §15.9 所指示的分配表达式中是必需的

如果类实例创建表达式使用类的类型参数的“”形式声明匿名类,则会出现编译时错误。

【讨论】:

  • 有趣的匿名课间!
  • 如果你添加一个在这个结构之外定义的对象,你需要声明它final 以便它编译。如果您想知道原因,请阅读this answer
  • 还有一个performance penalty,虽然它的意义值得商榷。
  • 这很酷,但在 Java 7 中,您可以避免在初始化时指定类型:此处为 docs.oracle.com/javase/7/docs/technotes/guides/language/…
  • @Rose 链接仅详细说明标准 List 初始化,即没有添加值的匿名内部类 :)
【解决方案3】:

overloaded ArrayList constructor怎么样。

 private ArrayList<String> symbolsPresent = new ArrayList<String>(Arrays.asList(new String[] {"One","Two","Three","Four"}));

【讨论】:

  • Arrays.asList() 不能单独完成这项工作吗?
  • @CarlosHenriqueRodriguez 会的,但是您必须在左侧有 List 。 :)
  • 请注意,您可以在 Java 5 及更高版本中使用 var-args 语法。
  • 如果我没记错的话,如果你使用 Arrays.asList() 并直接使用返回的 List,它将是固定大小。基本上它的行为仍然像一个数组,只是包装在 List 接口中。
【解决方案4】:

您还可以使用可变参数语法来使您的代码更简洁:

使用重载的构造函数:

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c"));

utils 模块中的子类 ArrayList:

public class MyArrayList<T> extends ArrayList<T> {
    public MyArrayList(T... values) {
        super(Arrays.asList(values));
    }
}

ArrayList<String> list = new MyArrayList<String>("a", "b", "c");

或者有一个静态工厂方法(我的首选方法):

public class Utils {
  public static <T> ArrayList<T> asArrayList(T... values) {
    return new ArrayList<T>(Arrays.asList(values));
  }
}

ArrayList<String> list = Utils.asArrayList("a", "b", "c");

【讨论】:

    【解决方案5】:
    import com.google.common.collect.Lists;
    
    ...
    
    
    ArrayList<String> getSymbolsPresent = Lists.newArrayList("item 1", "item 2");
    
    ...
    

    【讨论】:

      【解决方案6】:

      您可以使用 Java 8 Stream API
      您可以创建对象流并将它们收集为列表。

      private List<String> symbolsPresent = Stream.of("ONE", "TWO", "THREE", "FOUR")
          .collect(Collectors.toList());
      

      【讨论】:

      • 投了赞成票,因为流提供了一种统一的机制来解决广泛的问题,而自定义函数只是消耗了凡人的记忆。
      【解决方案7】:
      public static final List<String> permissions = new ArrayList<String>() {{
          add("public_profile");
          add("email");
          add("user_birthday");
          add("user_about_me");
          add("user_location");
          add("user_likes");
          add("user_posts");
      }};
      

      【讨论】:

        【解决方案8】:

        Java 9 允许您使用 List.of factory 用一行代码创建一个不可修改的列表:

        public class Main {
            public static void main(String[] args) {
                List<String> examples = List.of("one", "two", "three");
                System.out.println(examples);
            }
        }
        

        输出:

        [one, two, three]
        

        【讨论】:

          【解决方案9】:

          我个人喜欢在构造函数中进行所有初始化

          public Test()
          {
            symbolsPresent = new ArrayList<String>();
            symbolsPresent.add("ONE");
            symbolsPresent.add("TWO");
            symbolsPresent.add("THREE");
            symbolsPresent.add("FOUR");
          }
          

          编辑:这是一个当然的选择,其他人更喜欢在声明中初始化。两者都是有效的,我选择了构造函数,因为那里可以进行所有类型的初始化(如果您需要循环或参数,...)。但是,我在源代码顶部的声明中初始化了常量。
          最重要的是遵循您喜欢的规则并在我们的课程中保持一致。

          【讨论】:

            【解决方案10】:

            此外,如果您想强制 List 为只读(如果修改,则抛出 UnsupportedOperationException):

            List&lt;String&gt; places = Collections.unmodifiableList(Arrays.asList("One", "Two", "Three"));

            【讨论】:

              【解决方案11】:

              我建议使用 Arrays.asList() 进行单行初始化。有关声明和初始化 List 的不同方式,您还可以参考Initialization of ArrayList in Java

              【讨论】:

                【解决方案12】:

                我使用一个从 ArrayList 继承的泛型类,并使用带有可变编号或参数的参数实现构造函数:

                public class MyArrayList<T> extends ArrayList<T> {
                    public MyArrayList(T...items){
                        for (T item : items) {
                            this.add(item);
                        }
                    }
                }
                

                例子:

                MyArrayList<String>myArrayList=new MyArrayList<String>("s1","s2","s2");
                

                【讨论】:

                  【解决方案13】:

                  如果您只想在任何方法之外进行初始化,请使用初始化程序块:

                  import java.util.ArrayList;
                  
                  public class Test {
                  private ArrayList<String> symbolsPresent = new ArrayList<String>();
                  
                  // All you need is this block.
                  {
                  symbolsPresent = new ArrayList<String>();
                  symbolsPresent.add("ONE");
                  symbolsPresent.add("TWO");
                  symbolsPresent.add("THREE");
                  symbolsPresent.add("FOUR");
                  }
                  
                  
                  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);
                  
                  }    
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 2011-05-11
                    • 2018-09-04
                    • 2012-04-30
                    • 1970-01-01
                    • 2016-01-29
                    • 2011-02-15
                    • 1970-01-01
                    • 2016-11-24
                    • 2023-02-25
                    相关资源
                    最近更新 更多