public class A { //some fields (may not only primitive types) and methods here}
public class B {// some fields (may not only primitive types) and methods here, may also have a class A reference }
遵循问题:
public class Test{
public static void main(String[] args){
A a = new A();//1. it will allocate memory for one object of A and a is the reference points to that space?
ArrayList<B> bList = new ArrayList<B>(10);//2. it will allocate memory for 10 objects of B?
ArrayList<B> bList2 = bList;//3. bList2 reference to the same location as bList?
ArrayList<B> bList3 = new ArrayList<B>(20);//4. bList3 points to a memory location which can hold 20 objects of B?
bList3 = bList;//5. bList3 now points to the same location as bList, and the space allocated in question 4 will be cleaned by garbage collector later?
ArrayList<B> bList4 = new ArrayList<B>(10);
bList4.addAll(bList);//6. it is the same as bList4 = bList;? and the memory created in above line will be cleaned by garbage collector later?
method1(bList3);//7.after this function call bList3 will point to memory space created for bLista inside the method1? and we can modify the content of that space via bList3
}
public void method1(ArrayList<B> list){
//do something here
ArrayList<B> bLista = new ArrayList<B>();
list = bLista;
}
}
答案 0 :(得分:5)
好的,这是一些真正的答案。
new
运算符会分配内存。即使对象的构造函数失败,并且分配的内存很快被垃圾收集,也会临时分配新对象的空间。ArrayList
的字段分配空间,这些字段不依赖于ArrayList
中的元素数量,此外,它还会为10个对象的引用创建足够的空间,它不依赖于物体本身的大小;在64位系统上,指针在32位系统上将是32位,而在某一天,64位(或者可能会被真正智能的虚拟机压缩到更少)。ArrayList
将自动重新分配必要的存储空间。bList3
的对象的引用可以“逃避”被强烈引用。那个未引用的对象现在有资格进行垃圾收集。bList4
仍然指向同一个对象,并且该对象不能被垃圾回收。该列表引用bList
引用的所有元素,但它们不相同。特别是,对一个列表的更改不会影响另一个列表,但是通过任一列表都可以看到对列表的内容的更改。 答案 1 :(得分:1)
是
没有。它会将10个引用的内存分配给B个对象,也可能更多(因为ArrayList可以增长并且内部空间比其内容当前所需的空间更多)。
是
见2.
是
没有。在这种情况下,您创建了两个单独的ArrayList
对象,这意味着如果您向bList4
添加另一个元素或删除其中一个元素,则更改将不会在bList
中显示,反之亦然(如果您分配了bList4 = bList;
不,因为您在bList3
内覆盖了引用method1
的副本 - 这在方法之外没有任何影响。但是,如果您修改了列表对象或其内容,则更改将在外部显示。