Java动态内存分配(堆)

时间:2012-06-16 03:14:13

标签: java memory-management

这不是我期待具体答案的问题,因为它非常广泛。我正在自学Java,并专注于动态内存分配。让我们做一个非常简单的例子:假设我有一个非常基本的数据输入屏幕。所有这一切都是基本的,用户输入一系列名字,可能是员工目录或其他东西。在我的JFrame上,我有一个JTextField控件,其中输入了这些名称。员工人数仅在运行时知道。用户输入一个名称并点击回车键,它将名称提交到内存并创建一个新对象来存储下一个名字(傻,我知道,但我正在努力关注)。这样的事情(不要太过于字面 - 我显然没有编译):

public class Employee {
  String fName;

  public void setName( String n ) {
      fName = n;
  }
};

public class JFrameEmp {

//blah, blah, blah

JTxtName.addKeyListener(new KeyAdapter() {
    public void keyPressed(KeyEvent e) {
        /* Handle the enter key */
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            /* Store name */
            this.setName(JTxtName.getText());

            /* Create New Object */
            Employee next = new Employee();
            }
        };
    }
}

我需要帮助的地方是最后一行。即使这是有用的,让我们说我想打印出输入的名字列表。在我的方法中,我认为无法唯一地识别每个对象(以便我可以遍历它们)。

我是否需要创建一个数组来存储这些?但是它有一个固定的长度并且存在于堆栈中。我宁愿找到一种方法来使用堆来允许开放式列表。

我应该阅读什么来学习如何做到这一点?这一定是很常见的事情,但我所用的书籍似乎并没有涵盖它。

感谢。我希望我能够很好地解释这一点,而不需要太多细节。

3 个答案:

答案 0 :(得分:2)

听起来你想存储List Employee个。 Java提供动态大小的数组及其ArrayList类。

以下是一个例子:

ArrayList<Employee> employees = new ArrayList<Employee>();
employees.add(new Employee("Alice"));
employees.add(new Employee("Bob"));
System.out.println(employees.get(0)); // prints out Alice

答案 1 :(得分:2)

您可以使用数组。您可能会发现查看Java Collections框架非常有用,特别是有关implementations的页面。

但是,是的,您需要将对象添加到某种数据结构中,否则在garbage collector没有有效的引用后,它们将被清除。

答案 2 :(得分:2)

您好像在寻找数据存储结构。

您可以使用内置数组,它实际上存储在java中的堆上(唯一的问题是您需要跟踪大小并在需要更多空间时重新分配)。

更好的选择是ArrayList,它内置了add个方法,可以在需要时自动调整大小。

您还可以使用HashMap,这样可以通过名称快速搜索您的员工。