Одномерные массивы.. Вопрос: Что такое int d[]? Вы должны четко представлять, что такое d, где оно находится и чему оно равно?
Одномерные массивы. Давайте смотреть синтаксис. Я хочу сделать массив.
Объявление – 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|