Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Одномерные массивы.. Вопрос: Что такое int d[]? Вы должны четко представлять, что такое d, где оно находится и чему оно равно?




Одномерные массивы.

Давайте смотреть синтаксис. Я хочу сделать массив.

public static void main(String[] args) { // примеры объявления переменных массивов int a[]; int[] b;   // явно указываем число элементов в массиве a = new int [10];   // создаем массив, перечисляя значения его элементов b= new int [] {1, 2, 3, 4};   // создаем массив объектов типа String String str [] = new String[] {new String(" Hello " ), " world" };   // выводим размеры массивов System. out. println(" a length: " + a. length); System. out. println(" b length: " + b. length); System. out. println(" str length: " + str. length);   // доступ к элементам массива System. out. println(str[0] + str[1]); }

 

Объявление

– int d[];

– int d2[][];

Создание

– d = new int[10];

Инициализация

– int d[]={1, 3, 6};

Вопрос: Что такое int d[]? Вы должны четко представлять, что такое d, где оно находится и чему оно равно?

Ответ: Итак, смотрите внимательно. d – это ссылка, которая ничему не равна и является даже неинициализированной. По-хорошему, если бы ниже было написано присвоение, то надо было бы дописать = null (для ссылок – специальное значение).

 И еще очень важно – это стеки. Если брать вот этот код и если добавить сюда фигурные скобки, чтобы было понятно, что мы начнем сейчас этот код писать в своих методах в summa, в main.

{

}

Это локальная переменная. Внутри фигурных скобок будет создана переменная с именем d, которая даже не инициализирована. Вы спросите, а чем она может быть инициализирована? Переменная-ссылка d может быть установлена на одномерный массив int’ов. Одна скобка – одномерный, две скобки – двумерный. Сколько может быть скобок? Сколько хотите.

Обратите внимание, никаких цифр в квадратных скобках нет. Будет ошибка. Почему? Ну это же смешно, что значит ссылка на одномерный массив из пяти int’ов? Почему из пяти? А почему не из 15? Поэтому когда я объявляю ссылку важно сказать, какой тип элемента и сколько измерений.

Поэтому сейчас как такового массива, куда вы хотите положить данные, пока вообще не существует.

Вопрос: А сама ссылка занимает сколько-то места?

Ответ: Да, сколько-то занимает в памяти в стеке. Конечно. Вы хотите спросить сколько? Я думаю, что размер ссылок одинаковый. Думаю, что для конкретной реализации одной виртуальной машины – ответ да. Но другая виртуальная машина, другая платформа, другая разрядность – наверно может отличаться. Сколько конкретно занимает – мы не знаем. И обратите внимание, что в Java нет операции sizeof. Вы не можете спросить, сколько это занимает места в памяти. Ну авторы решили: «А какая вам в принципе разница? ». Это дело виртуальной машины что-то размещать в памяти, а не ваша. Поэтому ссылка в стеке.

Вопрос: Куда мои данные класть?

Ответ: Некуда. Ты должен попросить память. Для этого в ЯП Java есть одна единственная команда, чтобы попросить память. new – это выделение памяти.

После new должна быть какая-то конструкция, которая четко позволяет посчитать, сколько этой памяти нужно выделить? Обратите внимание, что здесь обязательно в квадратных скобках должно быть проставлено число элементов. Не обязательно константы. Здесь можно поставить переменную n, a + b. В любом случае int говорит, сколько занимает каждый элемент в памяти, а в [] их количество. Они и вычисляют общий размер. Вот здесь наконец-то и создается объект в динамической памяти (не в стеке, а в куче). И вот эта ссылочка d на этот объект будет установлена. Вот только так выглядит в оперативной памяти ссылочный тип: ссылка и объект. Они должны быть у вас четко распадаться на два этих элемента.

Вопрос: Итак, что мы получили после этих двух шагов?

Ответ: Ссылка установлена на объект, и главное выделена память. Еще очень важно понимать, что вот такой синтаксис new int[10] приведет к тому, что все 10 элементов массива будут инициализированы нулями своего типа.

Вопрос: Теперь самое важное! Мы дошли до закрывающей фигурной скобки, прошли её. Вопрос, что из этого исчезло?

Ответ: Стек будет очищен. Эта переменная int d создавалась для этого блока. Вы завершили этот блок и вся стековая память освобождается. Только стековая.

Вопрос: А с самим объектом, что-нибудь произойдет?

Ответ: Нет, ничего не произойдет. Объект останется в памяти.

Вопрос: До каких пор?

Ответ: До тех пор, пока сборщик мусора не определит, что на этот объект больше нет ссылок и объект не нужен никому. И как только сборщик мусора это определит, он этот объект попытается со временем удалить из памяти. Но это произойдет неизвестно когда и может быть не так быстро и не так скоро. Все зависит от загрузки, от ресурсов. Может быть, сборщику мусора никто не дает развернуться и спокойно работать. А может быть памяти много. Поэтому стек освобожается сразу в конкретном месте (мы это четко знаем).

Если вы хотите коротко записать, то можете сделать так. Это самый короткий вариант.

int d[] = {1, 3, 6};

Т. е. я объявляю ссылку и тут же пишу значения. Я не хочу нули. Я знаю, что мне нужен массив из трех элементов. Да у меня даже есть начальные значения. Потом их можно будет поменять, но меня устраивают значения 1, 3, 6. И компилятор сам вставит вот это: d = new int[3]. Т. е. это всего-лишь сокращенный синтаксис, который компилятор развернет. Он скажет «аааааа!!!! понятно!!! int d, а там 1, 2, 3», значит надо написать new int[3] и т. д. Вам предлагают короткий синтаксис для экономии в каких-то ситуациях.

Вопрос: Что будет, если я вот так напишу? Подумайте, что будет в такой ситуации?

Я говорю мало мне 10 int, и буквально через 2 строки вы делаете 100 int.

Ответ: Тот массив из 10 чисел вы потеряете и вернуться к нему вы не сможете, потому что вы не можете добраться до объекта потеряв его ссылку, если у вас не было запасной.

Вопрос: Есть в Java утечка памяти или нет?

Ответ: Вопрос неоднозначный. Что значит в Java нет утечки памяти? А что вы считате под Java? Виртуальную машину вы считаете за часть Java? Если виртуальная машина – это часть Java, то знайте, что виртуальная машина написана на native-коде. Там есть утечка памяти? Ее по вашему писали боги? Программисты писали. А как они пишут? Они пишут одинаково – ошибаются. Это нормально. Код довести до идеала невозможно, чтобы он был абсолютно идеальным. Чудес не бывает. Поэтому да, все равно где-то что-то будет. И т. к. любая java-библиотека все-равно ниже использует native-код, то в нем могут быть проблемы. Вот когда вы пишете кусок своего алгоритма полностью на Java и спрашиваете про него: «А вот здесь могут быть утечки памяти? », вы знаете и гарантируете, что там нет native-кода, т. е. весь код написан на Java, тогда можно сказать, что утечек памяти нет. Потеря объекта – это просто проблема.

Итак, последняя особенность синтаксиса. Квадратные скобки можно ставить, как слева, так и справа от имени. Java позволяет и так, и так.  Где вам больше нравится слева или справа?

Вы спросите, это одно и то же? Вот именно, что это не одно и то же. Это разные вещи. Смотрите.

Я пишу . Ну это ссылка на одномерный массив. Да, все верно.

Я пишу . Это тоже ссылка на одномерный массив. Да, все верно.

Вопрос: Это одно и то же?

Ответ: Нет.

И если я напишу k11 = 9, то у меня возникнет ошибка. И если написать k11 и поставить точку, то я увижу length. А когда я вижу length – это массив.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...