Главная страница
Навигация по странице:

  • Виды памяти Память процесса делится на: Stack (стек) Heap (куча). В чем отличие между сегментами Stack и Heap

  • Что такое пул строк (String pool)

  • Представление вещественных чисел в двоичном виде

  • Рекурсия Рекурсия в Java

  • Интерфейсы Смысл интерфейса - в унификации работы с разнотипными объектами .P.S.

  • Анонимные классы

  • Каковы правила контракта между методами hashcode и equals

  • getClassinstanceOf в чем разница

  • Ответы на вопросы джава. Что такое литералы


    Скачать 1.32 Mb.
    НазваниеЧто такое литералы
    АнкорОтветы на вопросы джава
    Дата08.06.2022
    Размер1.32 Mb.
    Формат файлаdocx
    Имя файлаJAVA.docx
    ТипДокументы
    #578003

    Что такое литералы?

    Литералы — это явно заданные значения в коде программы — константы определенного типа, которые находятся в коде в момент запуска.



    Виды памяти

    Память процесса делится на:

    • Stack (стек)

    • Heap (куча).

    В чем отличие между сегментами Stack и Heap?

    1. Heap (куча) используется всеми частями приложения, а Stack используется только одним потоком исполнения программы.

    2. Новый объект создается в Heap, а в памяти Stack'a размещается ссылка на него. В памяти стека также размещаются локальные переменные примитивных типов.

    3. Объекты в куче доступны из любого места программы, в то время, как стековая память не доступна для других потоков.

    4. Если память стека полностью занята, то Java Runtime вызывает исключение java.lang.StackOverflowError, а если память кучи заполнена, то вызывается исключение java.lang.OutOfMemoryError.

    5. Размер памяти стека, как правило, намного меньше памяти в куче. Из-за простоты распределения памяти (LIFO), стековая память работает намного быстрее кучи.

    Java Heap память


    Java Heap (куча) используется Java Runtime для выделения памяти под объекты и JRE классы. Создание нового объекта также происходит в куче. Здесь работает сборщик мусора: освобождает память путем удаления объектов, на которые нет каких-либо ссылок. Любой объект, созданный в куче, имеет глобальный доступ и на него могут ссылаться с любой части приложения

    Stack память в Java


    Стековая память в Java работает по схеме LIFO (Последний-зашел-Первый-вышел). Всякий раз, когда вызывается метод, в памяти стека создается новый блок, который содержит примитивы и ссылки на другие объекты в методе. Как только метод заканчивает работу, блок также перестает использоваться, тем самым предоставляя доступ для следующего метода.



    А теперь рассмотри шаги выполнения нашей программы:

    1. Как только мы запустим программу, загружаются все классы среды выполнения в кучу. Потом  метод main()находит строку 1 и Java Runtime создает стековую память для использования методом main().

    2. Далее в строке 2 создается int’овая переменная, которая хранится в памяти стека метода main().

    3. Потом мы создали объект в строке 3 и он тут же появляется в куче, а стековая память содержит ссылку на него. Точно такой же процесс происходит, когда мы создаем объект Memory в строке 4.

    4. Теперь в строке 5 мы вызываем метод exMethod() и тут же сразу создается блок на вершине стека, который будет использоваться этим методом. Поскольку в Java объекты и примитивы передаются по значению, то в строке 6 будет создана новая ссылка на объект, созданный в строке 3.

    5. Строка, созданная в строке 7, отправляется в Пул строк (String Pool), который находится в куче. На эту строку также создается ссылка в стековой памяти метода exMethod().

    6. Метод exMethod()завершается на строке 8, поэтому блок стековой памяти для этого метода становится свободным.

    7. В строке 9 метод main() завершается, поэтому стековая память для метода main() будет уничтожена. Также программа заканчивается в этой строке, следовательно, Java Runtime освобождает всю память и завершает программу.

    Что такое пул строк (String pool)

    Класс String, возможно, наиболее часто используемый класс в Java. Если новый объект создавать в динамической памяти (memory heap) каждый раз, когда мы используем String, то мы потратим впустую много памяти. Пул строк (String pool) решает эту проблему, сохраняя только один объект для каждого значения строки.

    На диаграмме ниже мы видим как именно строковый пул расположен в памяти Java Heap. И как разные способы создания строк влияют на расположение их в памяти.



    Представление вещественных чисел в двоичном виде

    Рассмотрим основные форматы представления вещественных чисел, описанные в стандарте IEEE 754-2008. Они отличаются размером ячейки памяти, отводимой для одного числа:

    1) формат одинарной точности (single precision, 4 байт);

    2) формат двойной точности (double precision, 8 байт);

    3) формат расширенной точности (extended precision, 10 байт).

    В формате одинарной точности под число отводится 32 бита, которые распределены следующим образом:





    Пример. Представить в формате одинарной точности число –27,2510.

    1) Переводим десятичное число в двоичный вид: 27,2510 = 11011,012.

    2) Нормализуем двоичное число: 11011,012 = 1,101101·24 .

    3) Отбрасываем скрытую единицу.

    4) Мантисса: m = 1011012.

    5) Порядок: p = 410.

    6) Находим смещенный порядок: sp = 4 + 127 = 13110 = 1000 00112.

    7) Поскольку знак «минус», то старший бит равен 1.

    8) Ответ в двоичном виде:



    Рекурсия

    Рекурсия в Java — это вызов метода методом внутри метода.

    Ресурсозатратно. Пока программа углубляется в рекурсию, под локальные переменные выделяется место в памяти. А в цикле переменные просто обновляются.

    Java varargs

    Varargs — это аргументы переменной длины.

    Позволяет передавать в методы произвольное количество аргументов.



    Что такое Regex

    Регулярное выражение – это строка, последовательность символов. Данную строку также принято называть шаблоном, по которому происходит поиск соответствий в других последовательностях символов. Но не каждая строка компилируется в регулярное выражение, а только та, что соответствует их синтаксису.

    https://proglib.io/p/25-java-regex

    Что за зверь "Pattern"?

    Класс Java Pattern (java.util.regex.Pattern) является основной точкой доступа к API Java регулярных выражений. Всякий раз, когда требуется подключить Regex в работу, все начинается с Java-класса Pattern.

    Java Pattern можно использовать двумя способами. Метод Pattern.matches() нужен для быстрой проверки соответствия текста заданному регулярному выражению. Так же можно скомпилировать экземпляр Pattern, используя Pattern.compile().  Его можно использовать несколько раз для сопоставления регулярного выражения с несколькими текстами.

    super() & this()


    • super() - вызвать конструктор родительского класса.

    • this() - для вызова одного и того же конструктора класса.


    ПРИМЕЧАНИЕ:

    • Мы можем использовать super() и this() только в конструкторе, а не где-либо еще, любая попытка сделать это приведет к ошибке времени компиляции.

    • Мы должны сохранить super() или this() в качестве первой строки конструктора, но НЕ оба одновременно.



    • this используется для доступа к методам и полям текущего класса. По этой причине он не имеет смысла, например, в статических методах.

    • super позволяет получить доступ к непубличным методам и полям в суперклассе, а также получить доступ к конструкторам только из конструкторов класса.

     Модификатор static

    Ключевое слово означает, что что-то (поле, метод или вложенный класс) связано с типом, а не с каким-либо конкретным экземпляром типа.Статическим классом в java может быть только вложенный класс. Если класс отмечен как static, то он ведет себя, как обычный класс.

    Соответственно static поля существуют в одном экземпляре.

    А при работе в static методах нельзя обращаться к не статик контенту, потому что его там просто не существует.

    Нельзя использовать ключевое слово this, но можно и нужно взаимодействовать с объектами переданными как параметры.

    Может так будет проще. Статический контекст не требует создания объекта класса конструктором new. Статический объект создается сразу, при первом обращении к его методам. Если вам не надо создавать множественные копии ваших объектов, а просто необходимо получить результат некой операции, то статический объект это самое нужное. Большинство утилитарных библиотек используют именно статический подход.



    Интерфейсы

    Смысл интерфейса - в унификации работы с разнотипными объектами.

    P.S. Кстати, любимый вопрос интервьюеров на собеседовании: что имеет более высокий уровень абстракции - класс, абстрактный класс или интерфейс? Правильный ответ – интерфейс

    Интерфейс - это особая форма абстрактного класса, который не реализует никаких методов.

    Интерфейс в Java - это механизм для достижения полной абстракции. В интерфейсе Java могут быть только абстрактные методы, а не тело метода. Он используется для достижения полной абстракции и множественного наследования в Java. Интерфейс содержит поведение (абстрактные методы), которое реализует класс. Если класс, реализующий интерфейс, не является абстрактным, все методы интерфейса должны быть определены в классе. Поскольку множественное наследование не разрешено в java, интерфейс - это единственный способ реализовать множественное наследование. Вот пример для понимания интерфейса



    Абстрактные классы

    Абстрактный класс — это класс, который не может быть создан (В первую очередь абстрактный класс - это конечно же не класс который нельзя создать, а класс реализация которого оторвана от его декларации.). 

    Абстрактный класс используется путем создания наследующего подкласса, который может быть создан. Абстрактный класс делает несколько вещей для наследующего подкласса:

    1. Определите методы, которые могут использоваться наследующим подклассом.

    2. Определите абстрактные методы, которые должен реализовать наследующий подкласс.

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

    Смысл тот же что и у интерфейсов.

    Анонимные классы

    Анонимный класс – это локальный класс без имени. Можно объявить анонимный (безымянный) класс, который может расширить (extends) другой класс или реализовать (implements) интерфейс. Объявление такого класса выполняется одновременно с созданием его объекта посредством оператора new.

    Анонимные классы эффективно используются, как правило, для реализации (переопределения) нескольких методов и создания собственных методов объекта.

    Каковы правила контракта между методами hashcode и equals

    Если хеш-коды равны это не обязательно гарантирует что объекты одинаковы. (Коллизии)

    Сто процентов, если хешкоды разные, то и объекты разные.

    getClass&instanceOf в чем разница?

    При использовании getClass вы можете проверить только принадлежность к определенному классу и не более.

    При использовании instanceOf вы можете проверить как принадлежность к классу, так и к родительским классам.


    написать администратору сайта