основные вопросы Java-программы - PullRequest
0 голосов
/ 27 августа 2009
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;
}

}

Ответы [ 2 ]

5 голосов
/ 27 августа 2009
  1. Да.
  2. номер
  3. Да.
  4. Вроде. На самом деле, нет. Это вопрос с подвохом?
  5. Да!
  6. номер
  7. номер

Хорошо, вот несколько реальных ответов.

  1. Оператор new выделяет память, если ее недостаточно. Даже если конструктор объекта выходит из строя, а выделенная память быстро собирается мусором, место для нового объекта выделяется временно.
  2. Это выделяет пространство для полей ArrayList, которые не зависят от количества элементов в ArrayList, и, кроме того, оно создаст достаточно места для ссылок на 10 объектов, которые не зависит от размера самих объектов; указатели будут 32-разрядными в 32-разрядной системе и 64-разрядными (или, возможно, когда-нибудь действительно умными виртуальными машинами, когда-нибудь сжатыми) в 64-разрядной системе.
  3. Это простое задание. Обе переменные были присвоены одно и то же значение.
  4. Память была изначально выделена для 20 ссылок на объекты. Однако, если в список добавлено более 20 объектов, ArrayList автоматически перераспределит необходимое хранилище.
  5. Да. В этом случае можно увидеть, что никакие ссылки на объект, изначально присвоенный bList3, не могут «избежать» жесткой ссылки. Этот объект без ссылки теперь может быть использован для сборки мусора.
  6. bList4 по-прежнему указывает на тот же объект, и этот объект нельзя собрать мусором. Этот список ссылается на все элементы, на которые ссылается bList, но они не совпадают. В частности, изменения в одном списке не повлияют на другой, но изменения в содержимом списков будут видны через любой список.
  7. Нет, Java передает ссылки по значению, поэтому метод не может заставить ссылку вызывающей стороны ссылаться на другой объект.
1 голос
/ 27 августа 2009
  1. Да.

  2. Нет. Он выделит память для 10 ссылок на объекты B и, возможно, на большее (поскольку ArrayList может расти и иметь больше внутреннего пространства, чем в настоящее время требуется для его содержимого).

  3. Да.

  4. См. 2.

  5. Да.

  6. Нет. В этом случае вы создали два отдельных объекта ArrayList, что означает, что если вы добавите другой элемент в bList4 или удалите один из его элементов, изменение не будет отображаться в bList и наоборот (что было бы, если бы вы присвоили его bList4 = bList;

  7. Нет, поскольку вы перезаписываете копию ссылки bList3 внутри method1 - что никак не влияет на метод. Однако если вы изменили объект списка или его содержимое, изменения будут видны снаружи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...