【问题标题】:Confused on how to implement an ArrayList对如何实现 ArrayList 感到困惑
【发布时间】:2018-11-26 04:39:18
【问题描述】:

所以我在查看 ArrayLists 并且对如何将元素添加到数组而不明确说明 people.add(person1) 一遍又一遍地为每个对象感到困惑。我目前已编译此代码,但不会在控制台中打印任何内容。我认为我的错误与对象构造函数和people.add(this) 有关。我做错了什么?


import java.util.ArrayList;

public class People {

  int age;
  String name;

  static ArrayList<People> people = new ArrayList<People>();

  public People(String name, int age){
    this.name = name;
    this.age = age;
    people.add(this);
  }    

  People person1 = new People("Bob", 41);
  People person2 = new People("Arthur", 32);
  People person3 = new People("Tom",18);

  public static void main(String[] args){

    for(People p : people) {
      System.out.println(p.name);
    }
  }
}

【问题讨论】:

  • main中初始化person1 ,2, 3
  • person1person2person3变量都是实例变量;它们只会在People 的实例被实例化时被实例化。由于您从未在任何被调用代码中实例化People 实例,因此永远不会将任何People 添加到ArrayList。您需要创建变量static 或将它们移动到main 内的局部变量中。但是,不要将它们保留在原处,因为实例化 People 实例将尝试再创建三个实例——导致 StackOverflowError
  • @Slaw 他肯定会加入stackoverflow。 :)

标签: java arraylist implementation


【解决方案1】:

数组列表是一个static 变量。您正在创建的People 对象是非静态变量,仅在调用构造函数时创建。您应该将对象创建移到main() 函数中。

public static void main(String[] args){
  People person1 = new People("Bob", 41);
  People person2 = new People("Arthur", 32);
  People person3 = new People("Tom",18);

    for(People p : people) {
      System.out.println(p.name);
    }
  }

您可以阅读有关静态变量的更多信息here

【讨论】:

  • 啊,好的,谢谢。我仍然对静态和非静态之间的区别生疏。另外,为什么我们必须调用 people.add(this) 而不是 people.add(Person),因为要添加的对象是 Person。 “这个”到底是什么意思?
  • this 是对 current 对象的引用——该对象的方法或构造函数被调用。您在构造函数中调用了list#add,所以people.add(this) 将告诉程序将当前对象添加到列表中。
  • 有道理。谢谢你:)
  • @krauser126 如果你觉得这很有用,你应该把它标记为答案
【解决方案2】:

您的代码有点过于复杂。为了玩ArrayList,您可以在 main 方法中声明 ArrayList,并在其中创建 People 类的对象并在 ArrayList 中添加人员对象。您在 People 类中创建 People 类的这三个实例的方式,创建 People 对象将导致循环引用导致 StackOverflowError

您应该将您的代码修改为类似的内容,并注意为打印 People 对象有意义的信息,您需要覆盖 Object 类的 toString 方法,否则它只会打印对您来说可能是垃圾的对象地址。

public class People {

    int age;
    String name;

    public People(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return String.format("age: %s, name: %s", age, name);
    }

    public static void main(String[] args) {
        ArrayList<People> people = new ArrayList<People>();

        People person1 = new People("Bob", 41);
        People person2 = new People("Arthur", 32);
        People person3 = new People("Tom", 18);

        people.add(person1);
        people.add(person2);
        people.add(person3);

        people.forEach(System.out::println);
    }
}

试试这个,如果您遇到任何问题,请告诉我。

【讨论】:

    【解决方案3】:

    试试这个:

    import java.util.ArrayList;
    
    public class People {
    
      int age;
      String name;
    
      People(String name, int age){
        this.name = name;
        this.age = age;
    
    
        Main.people.add(this);
      }    
    
    }
    
    public class Main {
    
      public static ArrayList<People> people = new ArrayList<People>();
    
      public static void main(String[] args){
    
      People person1 = new People("Bob", 41);
      People person2 = new People("Arthur", 32);
      People person3 = new People("Tom",18);
    
    
        System.out.println(people.size());
    
        for(People p : people) {
          System.out.println(p.name);
        }
      }
    
    }
    

    【讨论】:

    • 您可以将main留在People
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多