Я новичок в концепции массива, я кое-что не могу понять, я где-то читал, что когда мы инициализируем массив, например int[] a = {1,2,3,4} ;
тогда a фактически содержит адрес расположения в памяти первого элемента этого массива Я еще не начал oop, но, как я знаю, когда метод toString используется для ссылочных переменных, он преобразует значение объекта, адрес которого ссылочная переменная содержит, в строку, но почему при использовании
System.out.print(Arrays.toString(a));
печатается весь массив, а не только первый элемент массива a ? потому что массив a содержит адрес только первого элемента
потому что код метода Arrays.toString(...)
написан для отображения всего массива
Я ничего не знаю о программировании на C, и я изучаю Java самостоятельно.
Так что a actually contain the address of memory location of the the first element of that array
неправильно, вы не могли прочитать это о Java
Нет, я читал это на странице о массивах, так что это только в программировании на C?
Кажется, вы часто упоминаете термины «адрес» или «местоположение в памяти», но в Java они, как правило, не имеют большого значения. Предлагаю вам изучить основы работы с массивами на языке Java.
В Java массивы — это больше, чем просто адреса памяти. Скорее, они (и в основном все остальное в Java) являются объектами с определенными методами и свойствами. Итак, при вызове Arrays.toString(a)
(и аналогично a.toString()
) фактически вызывается специальный метод, специализирующийся на печати массивов, и этот метод просто печатает каждый элемент.
Обновлено: Вот краткое руководство по вводу: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html
Хорошо, Причина, по которой он печатает все значения массива, заключается в том, что это массив. Когда мы выполняем
System.out.print(Arrays.toString(a))
мы не указали, какой элемент массива печатать, поэтому он отображает весь массив. a указывает на адрес первого элемента.
Массив был напечатан, потому что вы вызвали Arrays.toString(int[] a)
метод
Который реализован JAVA API
https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#toString(int[])
/**
* Returns a string representation of the contents of the specified array.
* The string representation consists of a list of the array's elements,
* enclosed in square brackets (<tt>"[]"</tt>). Adjacent elements are
* separated by the characters <tt>", "</tt> (a comma followed by a
* space). Elements are converted to strings as by
* <tt>String.valueOf(int)</tt>. Returns <tt>"null"</tt> if <tt>a</tt> is
* <tt>null</tt>.
*
* @param a the array whose string representation to return
* @return a string representation of <tt>a</tt>
* @since 1.5
*/
public static String toString(int[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(a[i]);
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
Для большей ясности, связанной с представлениями памяти массивов,
Пожалуйста, проверьте приведенную ниже диаграмму:
Так правильно ли, что ссылочная переменная a содержит адрес первого элемента массива? Применимо ли это также к java, а не только к программированию на C, как упоминал @azro?
@Marwa Marwa нет, массив в Java - это больше, чем просто указатель/адрес памяти.
@Hulk не является ли переменная массива просто контейнером, который содержит адрес фактического массива?
@Marwa короткий ответ «Да», длинный ответ «Нет», потому что, как сказал Хук, массив в Java - это больше, чем просто указатель / адрес памяти, например, он добавляет функциональность, чтобы знать длину массива и произвольный доступ к любому объекту внутри множество
Это объект, который содержит гораздо больше, чем просто фактическое содержимое, такое как методы сортировки, доступа, удаления,... содержимое и свойства, такие как длина,...
@ahmednabil88 datatype[] arrayVariableName =new datatype[size] Итак, теперь имя arrayVariable содержит адрес объекта массива, верно? Итак, объект создается в ячейке памяти с указанным адресом? У каждого отдельного элемента этого массива есть свой адрес? Или весь массив будет иметь только соответствующий ему адрес?
@Marwa да, у каждого отдельного элемента этого массива есть свой адрес, и для большей ясности я добавлю диаграмму, описывающую представления памяти (в обоих случаях «массив содержит объекты» и «массив содержит примитивы»)
@Marwa, если ответ полезен для вас, можете ли вы пометить его как принятый ответ?
Отличаются ли адреса каждого элемента от адреса объекта массива?
@Марва, конечно, это правда
Java не работает как C; в Java адрес памяти не актуален