2017-02-14 23 views
0

Почему иногда нам не нужно создавать объект и просто назначать его методам и т. Д.? Возьмем, например, следующее.Почему экземпляр объекта не нужен в некоторых случаях, таких как это?

List<String> list1 = new ArrayList<>(); 
List<String> list2 = Collections.synchronizedList(list1); 

Означает ли это, что list2 присваивается объект ArrayList? Что происходит с распределением памяти в этом случае? Благодаря!

ответ

1

List2 назначается с некоторой реализацией списка. В точном случае это либо SynchronizedRandomAccessList объект, либо SynchronizedList объект, но не ArrayList.

Here исходный код:

public static <T> List<T> synchronizedList(List<T> list) { 
     return (list instanceof RandomAccess ? 
       new SynchronizedRandomAccessList<>(list) : 
       new SynchronizedList<>(list)); 
} 

Статический метод synchronizedList() просто помощник в этом деле. Объекты в java (не примитивные значения) работают с передачей ссылок на ячейки памяти. Таким образом, synchronizedList() возвращает ссылку памяти на объект new SynchronizedList(), и, вызывая его, вы назначаете эту ячейку памяти вашему объекту list2.

1

Объектная инстанция всегда необходима. В Java есть две области памяти: стек потоков и куча.

  • Примитивы (т.е. переменных, которые не являются объектами), как логическое значение, байты, коротким, полукокс, INT, длинным, поплавок, двойник, сохраняется в стеке Thread
  • объектов, которые создаются с new ключевого слова выделяются в Heap

в вашем случае List объект конкретизируется в методе Collections.synchronizedList будет выделено в Heap и ссылки на этот список будет назначен на местная переменная list2