将对象直接添加到List与创建对象时的内存开销

时间:2016-08-01 10:55:03

标签: java

首先创建Java对象时是否存在内存开销,而不是直接将其添加到List中,或者List会自动使用已分配的对象中的内存吗?

User user = new User(userID, username);
userList.add(user);

VS

userList.add(new User(userID, username));

5 个答案:

答案 0 :(得分:3)

没有内存开销。对list元素的额外引用(user变量)驻留在堆栈上。列表的第一个元素和user变量引用堆上的同一个对象。在这两种情况下都有单个内存分配。

答案 1 :(得分:1)

User user = new User(userID, username);

这条线实际上做了两件事。首先,它在内存中创建一个对象(这是=的右侧)。之后,它创建一个名为user的新变量,并在其中存储对新创建的对象的引用。

如果将其添加到列表中,则列表将仅创建对创建的对象的另一个引用。

因此,在这两种情况下,对象只创建一次。

但是,在第一种情况下,您将创建一个额外的变量(用户)。它虽然是参考,但不是对象本身,所以实际所需的内存基本上没什么。无论如何,你完成这个方法后它就消失了。

答案 2 :(得分:1)

这大致相同。在两种情况下,内存分配都会进行一次。

不同之处在于:
- 在第一种情况下,两个引用使用该对象。
- 在第二种情况下,一个引用使用该对象。

答案 3 :(得分:0)

在任何一种情况下,对象都不会添加到列表中。添加了对象的引用。不同之处仅在于您是否打算在将对象添加到列表后对该对象执行其他操作。在第一种情况下,您仍然有OPENSSL_ROOT="$HOME/.build/openssl-1.0.1e" cd /tmp curl http://www.openssl.org/source/openssl-1.0.2h.tar.gz | tar zxvf - cd openssl-1.0.2.h mkdir -p "$OPENSSL_ROOT" ./config no-hw --prefix="$OPENSSL_ROOT" --openssldir=... make install 变量引用该对象,因此您可以轻松地进一步操作它。在后一种情况下,你没有变量,大概你不需要再操纵它了。

答案 4 :(得分:0)

  1. 不会有任何内存开销,因为引用将存储在堆栈中。
  2. 但是,如果有人试图在for循环中为非常高的n值创建额外的引用变量,那么将会出现可忽略不计的性能损失。

     List<User> users = new ArrayList<>(size);
            for (int i = 0; i < n; i++) {
                User user = new User("User " + i, i);
                users.add(user);
            }