用Java重新分配Java中的对象

时间:2014-04-25 09:27:07

标签: java

这是关于Java中内存分配的noob问题。 我想知道它是否有问题"有以下reassignemnts:

例如。

byte[] b = new byte[10];

..

b = new byte[20]

....

b = new byte[4]

这会擦除堆栈并分配新内存吗?我们可以重新调整变量/对象的大小并以这种方式重新标注它吗?

7 个答案:

答案 0 :(得分:5)

  

这会擦除堆栈并分配新内存吗?

是的,如果旧对象没有任何实时参考,则会对其进行GC。

  

我们可以重新调整变量/对象的大小并以这种方式重新标注它吗?

不,Java阵列无法动态增长。它们的大小总是固定的。

如果是其他对象,则可以更改对象的状态。对于Ex:ArrayList,您可以在创建列表后更改列表的大小。

  

可能只是一个额外的问题。如果这只是分配新的   记忆和由GC处理的旧记忆,是否可​​以做到   以下:

MyObject myobject = new MyObject(byte[20])
... 
myobject= new MyObject(byte[10]);

是的,这完全正确。您正在为旧参考myobject重新分配新对象。

答案 1 :(得分:1)

将新对象分配给变量将使前一个对象有资格进行垃圾回收,如果它没有被任何活动线程引用..并且你可以像你做的那样做...并且将一个对象分配给另一个只分配对象引用(或多或少的指针)。它不会复制成员变量等。例如, B = C;

答案 2 :(得分:0)

是的,这将分配新内存,"擦除"原始数组中的数据。

如果要调整数组大小,但保留数据,请查看Arrays.copyOf()方法和朋友。这使您可以有效地将数据从一个数组移动到另一个数组:

int[] arr = new int[4];
arr = Arrays.copyOf(arr, 8); // Array is now 8 ints long, with the last 4 slots "empty"

通常,如果要自动调整数据结构大小,请查看由常规本机数组支持的ArrayList,但将其包装以便您自动调整大小。

答案 3 :(得分:0)

只要有对该对象的引用,我们使用new创建的任何对象都将驻留在堆中。

在你的情况下

byte[] b = new byte[10];  // new memory is created in heap

b = new byte[20] // new memory is created in heap

此时堆中的对象(byte[10]将符合GC条件)

b = new byte[4] //new memory is created here

此时堆中的对象(byte[20]将符合GC条件)

数组不会动态增长。 new每次使用新内存初始化一个新数组,旧内存符合GC

的条件

答案 4 :(得分:0)

第一个:每当你使用new关键字时,它总会创建新的内存和之前的ref。将被删除,但这并不意味着堆清楚实际上它是分配给GC的任务,它将非常有效地管理它。

第二个:您无法调整数组的大小,但您可以将该数据引用到另一个具有新的和更大的数组的数组中。对象将被GC自动删除。

第三个: arraylist可以在创建后动态增长。

答案 5 :(得分:0)

不,一旦创建了新对象,jvm自动gc是旧的。你无法在堆栈中找到它们。

正如@Abiram解释的那样,你无法修改数组的状态。你确实可以尝试使用ArrayList 用于添加动态值。 如果您没有显式初始化实例变量,那么当new返回其引用时,该变量仍将具有其默认初始值。初始值为,

Type            Default Value
boolean         false
byte           (byte) 0
short          (short) 0
int 0
long             0L
char            \u0000
float           0.0f
double          0.0d
object reference    null

您可以参考docs  这里

希望这会有所帮助!!

答案 6 :(得分:0)

  

new关键字将始终创建独立于的新实例   指定的类型。

这会擦除堆栈并分配新内存吗?

  

是的,它会为每个new分配一个新内存。和旧的   当下一次垃圾收集完成后,它将被清除   将清除分配的空间。

我们可以重新调整变量/对象的大小并以这种方式重新标注它吗?

  

不是我的答案,你不能用动态创建一个字节数组   尺寸。实际上,为单个对象分配太多内存会   制造内存问题。所以最好根据机器修复一些尺寸   明智地使用该对象以避免此类问题。