Массивы переменных в java

Я новичок в концепции массива, я кое-что не могу понять, я где-то читал, что когда мы инициализируем массив, например int[] a = {1,2,3,4} ;

тогда a фактически содержит адрес расположения в памяти первого элемента этого массива Я еще не начал oop, но, как я знаю, когда метод toString используется для ссылочных переменных, он преобразует значение объекта, адрес которого ссылочная переменная содержит, в строку, но почему при использовании

System.out.print(Arrays.toString(a));

печатается весь массив, а не только первый элемент массива a ? потому что массив a содержит адрес только первого элемента

Java не работает как C; в Java адрес памяти не актуален

fantaghirocco 21.12.2020 10:41

потому что код метода Arrays.toString(...) написан для отображения всего массива

Hovercraft Full Of Eels 21.12.2020 10:42

Я ничего не знаю о программировании на C, и я изучаю Java самостоятельно.

Marwa 21.12.2020 10:43

Так что a actually contain the address of memory location of the the first element of that array неправильно, вы не могли прочитать это о Java

azro 21.12.2020 10:43

Нет, я читал это на странице о массивах, так что это только в программировании на C?

Marwa 21.12.2020 10:44

Кажется, вы часто упоминаете термины «адрес» или «местоположение в памяти», но в Java они, как правило, не имеют большого значения. Предлагаю вам изучить основы работы с массивами на языке Java.

MC Emperor 21.12.2020 10:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
6
90
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

В 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 21.12.2020 10:54

@Marwa Marwa нет, массив в Java - это больше, чем просто указатель/адрес памяти.

Hulk 21.12.2020 10:55

@Hulk не является ли переменная массива просто контейнером, который содержит адрес фактического массива?

Marwa 21.12.2020 11:05

@Marwa короткий ответ «Да», длинный ответ «Нет», потому что, как сказал Хук, массив в Java - это больше, чем просто указатель / адрес памяти, например, он добавляет функциональность, чтобы знать длину массива и произвольный доступ к любому объекту внутри множество

Ahmed Nabil 21.12.2020 11:06

Это объект, который содержит гораздо больше, чем просто фактическое содержимое, такое как методы сортировки, доступа, удаления,... содержимое и свойства, такие как длина,...

Jakob Tinhofer 21.12.2020 11:13

@ahmednabil88 datatype[] arrayVariableName =new datatype[size] Итак, теперь имя arrayVariable содержит адрес объекта массива, верно? Итак, объект создается в ячейке памяти с указанным адресом? У каждого отдельного элемента этого массива есть свой адрес? Или весь массив будет иметь только соответствующий ему адрес?

Marwa 21.12.2020 11:36

@Marwa да, у каждого отдельного элемента этого массива есть свой адрес, и для большей ясности я добавлю диаграмму, описывающую представления памяти (в обоих случаях «массив содержит объекты» и «массив содержит примитивы»)

Ahmed Nabil 21.12.2020 11:52

@Marwa, если ответ полезен для вас, можете ли вы пометить его как принятый ответ?

Ahmed Nabil 21.12.2020 12:18

Отличаются ли адреса каждого элемента от адреса объекта массива?

Marwa 21.12.2020 12:45

@Марва, конечно, это правда

Ahmed Nabil 21.12.2020 12:49

Другие вопросы по теме