A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | ООП | |||||||||||||||||||||||||
2 | Что такое ООП | ООП - методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования. Согласно парадигмы ООП программа состоит из обьектов, обменивающихся сообщениями. Обьекты могут обладать состоянием, единственный способ изменить состояние обьекта - передать ему сообщение, в ответ на которое, обьект может изменить собственное состояние. Класс — это описание еще не созданного объекта, как бы общий шаблон, состоящий из полей, методов и конструктора, а объект – экземпляр класса, созданный на основе этого описания. | ||||||||||||||||||||||||
3 | Какие преимущества у ООП | Легко читается - не нужно выискивать в коде функции и выяснять, за что они отвечают | ||||||||||||||||||||||||
4 | Быстро пишется - можно быстро создать сущности, с которыми должна работать программа. | |||||||||||||||||||||||||
5 | Простота реализации большого функционала - т.к. на написание кода уходит меньше времени, можно гораздо быстрее создать приложение с множеством возможностей | |||||||||||||||||||||||||
6 | Меньше повторений кода - не нужно писать однотипные функции для разных сущностей | |||||||||||||||||||||||||
7 | Какие недостатки у ООП | Потребление памяти - обьекты потребляют больше оперативной памяти, чем примитивные типы данных | ||||||||||||||||||||||||
8 | Снижает производительность - многие вещи технически реализованы иначе, поэтому они используют больше ресурсов. | |||||||||||||||||||||||||
9 | Неэффективность и неэкономное распределения памяти на этапе выполнения (по причине издержек на динамическое связывание и проверки типов на этапе выполнения). | |||||||||||||||||||||||||
10 | Излишняя универсальность. Часто содержится больше методов, чем это реально необходимо текущей программе. А поскольку лишние методы не могут быть удалены, они становятся мертвым грузом. | |||||||||||||||||||||||||
11 | Сложно начать - парадигма ООП сложнее функционального программирования, поэтому на старт уходит больше времени | |||||||||||||||||||||||||
12 | Назовите основные принципы ООП | Инкапсуляция Наследование Полиморфизм Абстракция — отделение концепции от ее экземпляра; | ||||||||||||||||||||||||
13 | Что такое инкапсуляция? (С примером) | Свойство системы, которое объединяет данные и методы, манипулирующие этими данными, а также защищает и то, и другое от внешнего вмешательства или неправильного использования. Инкапсуляция - это объединение данных и методов работы с этими данными в одной упаковке («капсуле»). Чтобы малейшее изменение в классе не влекло за собой изменение внешнего поведения класса. | ||||||||||||||||||||||||
14 | Что такое наследование? (С примером) | Свойство системы, которое позволяет описать новый класс на основе уже существующего с частично или полностью заимствованной функциональностью. | ||||||||||||||||||||||||
15 | Что такое полиморфизм? (С примером) | Полиморфизм – предоставляет возможность единообразно обрабатывать объекты с различной реализацией при условии наличия у них общего интерфейса или класса. Есть три вида полиморфизма: -ad hoc полиморфизм, основан на различении типов. Для различных типов аргументов используется разный код метода, пример статического - перегрузка метода. Пример динамического - переопределение метода. -параметрический полиморфизм - ситуация, когда один и тот же метод работает с аргументами различных типов одинаково, не зависимо от их точного типа. Пример — функция, работающая с объектом некоторого класса C, может без изменений работать с объектом порождённого от C класса (этот вид полиморфизма часто называют полиморфизм включения). -subtype полиморфизм - самый популярный - возможность объектов с одинаковой спецификацией(интерфейс\класс\abstract класс) иметь различную реализацию. Пример: Переопределение методов, интерфейсы. | ||||||||||||||||||||||||
16 | Что такое ассоциация | Есть два типа связи между объектами: ассоциация, которая делится на композицию и агрегацию, и наследование. Ассоциация - обозначает связь между обьектами. Например, игрок играет в определенной команде. Ассоциация означает, что объекты двух классов могут ссылаться один на другой, иметь некоторую связь между друг другом. Например Менеджер может выписать Счет. Соответственно возникает ассоциация между Менеджером и Счетом. Еще пример — Преподаватель и Студент — т.е. какой-то Студент учится у какого-то Преподавателя. Ассоциация и есть описание связи между двумя объектами. Студент учится у Преподавателя. Идея достаточно простая — два объекта могут быть связаны между собой и это надо как-то описать. http://java-course.ru/begin/relations/ | ||||||||||||||||||||||||
17 | ||||||||||||||||||||||||||
18 | Что такое композиция | Композиция — еще более «жесткое отношение, когда объект не только является частью другого объекта, но и вообще не может принадлежат еще кому-то. Например Машина и Двигатель. Хотя двигатель может быть и без машины, но он вряд ли сможет быть в двух или трех машинах одновременно. В отличии от студента, который может входить и в другие группы тоже. Например, в класс автомобиля содержит объект класса электрического двигателя: | ||||||||||||||||||||||||
19 | public class ElectricEngine{ } public class Car { ElectricEngine engine; public Car() { engine = new ElectricEngine(); } } | |||||||||||||||||||||||||
20 | При этом класс автомобиля полностью управляет жизненным циклом объекта двигателя. При уничтожении объекта автомобиля в области памяти вместе с ним будет уничтожен и объект двигателя. И в этом плане объект автомобиля является главным, а объект двигателя - зависимой. | |||||||||||||||||||||||||
21 | Что такое агрегация | Агрегация является особой формой ассоциации. Это более конкретизированные отношения между объектами. Агрегация — отношение когда один объект является частью другого. Например: Студент входит в Группу любителей физики.Это представляет отношения HAS-A. Агрегация определяет отношение HAS A ("имеет"), но связь слабее, чем в композиции, т.к. обьекты будут равноправны. | ||||||||||||||||||||||||
22 | Расскажите про раннее и позднее связывание. | Связывание означает наличие связи между ссылкой и кодом. Например, переменная, на которую вы ссылаетесь, привязана к коду, в котором она определена. Аналогично, вызываемый метод привязан к месту в коде, где он определен. Раннее связывание Если метод известен компилятору, то происходит ранее связывание на этапе компиляции (early binding), также называют статическим связыванием. Используется для final, перегруженных, статических методов. Позднее связывание (late binding) - вызов метода возможен только во время выполнения, т.к. у компилятора нет информации, чтобы проверить корректность такого вызова. В java это возможно при помощи рефлексии. Используется для переопределенных и абстрактных методов. Вот пример: Object a = ... // какое-то присваивание a.toString(); На этапе компиляции мы не знаем, какого типа объект a. Он может быть как собственно Object, так и любым его наследником, в котором метод toString() переопределён. Именно на этапе выполнения определяется тип a и вызывается toString() из того класса, какого типа объект a. Это и есть позднее связывание. В случае статического связывания используются не конкретные объекты, а информация о типе, то есть используется тип ссылочной переменной. С другой стороны, при динамическом связывании для нахождения нужного метода используется конкретный объект. Исходя из того, что раннее связывание выполняется на этапе компиляции, а позднее - в рантайме, первый вариант обладает лучшим быстродействием, однако второй необходим для реализации полиморфизма. | ||||||||||||||||||||||||
23 | SOLID | SOLID — это акроним, образованный из заглавных букв первых пяти принципов ООП и проектирования. S(Single Responsibility Principle) - принцип единственной ответственности - каждый класс выполняет лишь одну задачу. Легкая модификация в будущем, простое тестирование, класс не имеет зависимостей на другие классы. O(Open Closed Principle) - принцип открытости/закрытости - программные сущности открыты для расширения и закрыты для модификации. Чтобы не сломать логику в классе-родителе, мы унаследуемся от него и реализуем что-то своё, и используем свой класс. L(Liskov’s Substitution Principle) - принцип подстановки барбары лисков - объекты в программе можно заменить их наследниками без изменения свойств программы. I(Interface Segregation Principle) - принцип разделения интерфейса - много специализированных интерфейсов лучше, чем один общий D(Dependency Inversion Principle) - принцип инверсии зависимостей - зависимость на абстракциях. Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций. Использование: Создание интерфейсов и их реализаций. Пример: терминал оплаты(абстракция) и разные карты оплаты. | ||||||||||||||||||||||||
24 | Java | |||||||||||||||||||||||||
25 | Какая основная идея языка? | «Написано однажды - работает везде». Идея основывается в написании одного кода, который будет работать на любой платформе. | ||||||||||||||||||||||||
26 | За счет чего обеспечивается кроссплатформенность? | Кроссплатформенность была достигнута за счёт создания виртуальной машина Java. Java Virtual Machine или JVM - это программа, являющаяся прослойкой между операционной системой и Java программой. В среде виртуальной машины выполняются коды Java программ. Сама JVM реализована для разных ОС. Что байт код для JVM может исполняться везде где установлена JVM. Код не нужно перекомпилировать под каждую из платформ. | ||||||||||||||||||||||||
27 | Какие преимущества у java? | Объектно-ориентированное программирование - структура данных становится объектом, которым можно управлять для создания отношений между различными объектами. Язык высокого уровня с простым синтаксисом и плавной кривой обучения - синтаксис Java основан на C ++, поэтому Java похожа на C. Тем не менее, синтаксис Java проще, что позволяет новичкам быстрее учиться и эффективнее использовать код для достижения конкретных результатов. Стандарт для корпоративных вычислительных систем - корпоративные приложения — главное преимущество Java с 90-х годов, когда организации начали искать надежные инструменты программирования не на C. Безопасность - благодарю отсутсвию указателей и Security Manager (политика безопасности, в которой можно указать правила доступа, позволяет запускать приложения Java в "песочнице"). Независимость от платформы - Можно создать Java-приложение на Windows, скомпилировать его в байт-код и запустить его на любой другой платформе, поддерживающей виртуальную машину Java (JVM). Таким образом, JVM служит уровнем абстракции между кодом и оборудованием. Язык для распределенного программирования и комфортной удаленной совместной работы - Специфическая для Java методология распределенных вычислений называется Remote Method Invocation (RMI). RMI позволяет использовать все преимущества Java: безопасность, независимость от платформы и объектно-ориентированное программирование для распределенных вычислений. Кроме того, Java также поддерживает программирование сокетов и методологию распределения CORBA для обмена объектами между программами, написанными на разных языках. Автоматическое управление памятью Разработчикам Java не нужно вручную писать код для управления памятью благодаря автоматическому управлению памятью (AMM). Многопоточность Поток — наименьшая единица обработки в программировании. Чтобы максимально эффективно использовать время процессора, Java позволяет запускать потоки одновременно, что называется многопоточностью. Стабильность и сообщество Сообщество разработчиков Java не имеет себе равных. Около 45% респондентов опроса StackOverflow 2018 используют Java. | ||||||||||||||||||||||||
28 | Какие недостатки у java? | Платное коммерческое использование (с 2019) Низкая производительность из-за компиляции и абстракции с помощью виртуальной машины, а также приложение очистки памяти. Не развитые инструменты по созданию GUI приложений на чистой java. Многословный код Java — это более легкая версия неприступного C ++, которая вынуждает программистов прописывать свои действия словами из английского языка. Это делает язык более понятным для неспециалистов, но менее компактным. | ||||||||||||||||||||||||
29 | Что такое JDK? Что в него входит? | JDK (Java Development Kit) - включает JRE и набор инструментов разработчика приложений на языке Java: - компилятор Java (javac) - стандартные библиотеки классов java - примеры - документацию - различные утилиты | ||||||||||||||||||||||||
30 | Что такое JRE? Что в него входит? | JRE (java Runtime Environment) - минимально-необходимая реализация виртуальной машины для исполнения Java-приложений. Состоит из JVM, ClassLoader и стандартного набора библиотек и классов Java | ||||||||||||||||||||||||
31 | Что такое JVM? | JVM (Java Virtual Machine) - виртуальная машина Java исполняет байт-код Java, предварительно созданный из кода JIT компилятором, с помощью встроенного интерпретатора байткода. HotSpot представляет собой реализацию концепции JVM. | ||||||||||||||||||||||||
32 | Что такое byte code? | Байт-код Java — набор инструкций, скомпилированный компилятором, исполняемый JVM. | ||||||||||||||||||||||||
33 | Что такое загрузчик классов (classloader)? | Используется для передачи в JVM скомпилированного байт-кода, хранится в файлах с расширением .class При запуске JVM, используются три загрузчика классов: - Bootstrap ClassLoader - базовый загрузчик - загружает платформенные классы JDK из архива rt.jar - AppClassLoader - системный загрузчик - загружает классы приложения, определенные в CLASSPATH - Extension ClassLoader - загрузчик расширений - загружает классы расширений, которые по умолчанию находятся в каталоге jre/lib/ext. ClassLoader выполняет три основных действия в строгом порядке: • Загрузка: находит и импортирует двоичные данные для типа. • Связывание: выполняет проверку, подготовку и (необязательно) разрешение. - Проверка: обеспечивает правильность импортируемого типа. - Подготовка: выделяет память для переменных класса и инициализация памяти значениями по умолчанию. - Разрешение: преобразует символические ссылки из типа в прямые ссылки. • Инициализация: вызывает код Java, который инициализирует переменные класса их правильными начальными значениями. Каждый загрузчик хранит указатель на родительский, чтобы суметь передать загрузку если сам будет не в состоянии этого сделать. | ||||||||||||||||||||||||
34 | Что такое JIT? | JIT (Just-in-time compilation) - компиляция на лету или динамическая компиляция - технология увеличения производительности программных систем, использующих байт-код, путем компиляции байт-кода в машинный код во время работы программы. В основном отвечает за оптимизацию производительности приложений во время выполнения. https://javahelp.online/osnovy/voprosy-otvety-sobesedovanie-java (Q13) | ||||||||||||||||||||||||
35 | Что такое сборщик мусора? (Garbage collector) | Про 4 типа сборщиков мусора читай здесь: habr.com/ru/post/269621 | ||||||||||||||||||||||||
36 | Сборщик мусора выполняет две задачи: - поиск мусора; - очистка мусора. Для обнаружения мусора есть два подхода: | |||||||||||||||||||||||||
37 | - Учет ссылок (Reference counting); | |||||||||||||||||||||||||
38 | Учет ссылок - если обьект не имеет ссылок, он считается мусором. Проблема - не возможность выявить циклические ссылки, когда два обьекта не имеют внешних ссылок, но ссылаются друг на друга -> утечка памяти | |||||||||||||||||||||||||
39 | - Трассировка (Tracing). (используется в HotSpot)6 | |||||||||||||||||||||||||
40 | Трассировка - до обьекта можно добраться из Корневых точке (GC root). До чего добраться нельзя - мусор. Всё, что доступно из «живого» объекта, также является «живым». | |||||||||||||||||||||||||
41 | Типы корневых точек (GC Roots) java приложения: | |||||||||||||||||||||||||
42 | - объекты в статических полях классов - объекты, доступные из стека потоков - объекты из JNI(java native interface) ссылок в native методах | |||||||||||||||||||||||||
43 | Процессы сборки мусора разделяются несколько видов: minor GC (малая) - частый и быстрый, работает только с областью памяти "young generation"; - приложение приостанавливается на начало сборки мусора (такие остановки называются stop-the-world); - «живые» объекты из Eden перемещаются в область памяти «To»; - «живые» объекты из «From» перемещаются в «To» или в «old generation», если они достаточно «старые»; - Eden и «From» очищаются от мусора; - «To» и «From» меняются местами; - приложение возобновляет работу. major GC (старшая) - редкий и более длительный, затрагивает объекты старшего поколения. В принцип работы «major GC» добавляется процедура «уплотнения», позволяющая более эффективно использовать память. В процедуре живые объекты перемещаются в начало. Таким образом, мусор остается в конце памяти. full GC (полная) - полный сборщик мусора сначала запускает Minor, а затем Major (хотя порядок может быть изменен, если старое поколение заполнено, и в этом случае он освобождается первым, чтобы позволить ему получать объекты от молодого поколения). | |||||||||||||||||||||||||
44 | Виды ссылок в Java | 1) StrongReference — это самые обычные ссылки которые мы создаем каждый день, любая переменная ссылочного типа. StringBuilder builder = new StringBuilder(); - builder это и есть strong-ссылка на объект StringBuilder. | ||||||||||||||||||||||||
45 | 2) SoftReference — GC гарантировано удалит с кучи все объекты, доступные только по soft-ссылке, перед тем как бросит OutOfMemoryError. SoftReference это наш механизм кэширования объектов в памяти, но в критической ситуации, когда закончится доступная память, GC удалит не использующиеся объекты из памяти и тем самым попробует спасти JVM от завершения работы. StringBuilder builder = new StringBuilder(); SoftReference<StringBuilder> softBuilder = new SoftReference(builder); softBuilder.get() — вернет strong-ссылку на объект StringBuilder в случае если GC не удалил этот объект из памяти. В другом случае вернется null. softBuilder.clear() — удалит ссылку на объект StringBuilder То же самое работает для WeakReference. | |||||||||||||||||||||||||
46 | 3) WeakReference — если GC видит, что объект доступен только через цепочку weak-ссылок (исчезнули strong-ссылки), то он удалит его из памяти. | |||||||||||||||||||||||||
47 | 4) PhantomReference — если GC видит что объект доступен только через цепочку phantom-ссылок, то он его удалит из памяти. После нескольких запусков GC. Особенностей у этого типа ссылок две. Первая это то, что метод get() всегда возвращает null. Именно из-за этого PhantomReference имеет смысл использовать только вместе с ReferenceQueue. Вторая особенность – в отличие от SoftReference и WeakReference, GC добавит phantom-ссылку в ReferenceQueue после того как выполниться метод finalize(). | |||||||||||||||||||||||||
48 | So in brief: Soft references try to keep the reference. Weak references don’t try to keep the reference. Phantom references don’t free the reference until cleared. | |||||||||||||||||||||||||
49 | ReferenceQueue. Он позволяет отслеживать момент, когда GC определит что объект более не нужен и его можно удалить. Именно сюда попадает Reference объект после того как объект на который он ссылается удален из памяти. При создании Reference мы можем передать в конструктор ReferenceQueue, в который будут помещаться ссылки после удаления. | |||||||||||||||||||||||||
50 | Stack и Heap | Память процесса делится на Stack (стек) и Heap (куча) : - Stack содержит staсk frame'ы, они делятся на три части: параметры метода, указатель на предыдущий фрейм и локальные переменные. - Структура Heap зависит от выбранного сборщика мусора. Читай про GC! MetaSpace - специальное пространство кучи, отделенное от кучи основной памяти. JVM хранит здесь весь статический контент. Это включает в себя все статические методы, примитивные переменные и ссылки на статические объекты. Кроме того, он содержит данные о байт-коде, именах и JIT-информации . До Java 7 String Pool также был частью этой памяти. Вкратце, при Serial/Parallel/CMS GC будет следующая структура: | ||||||||||||||||||||||||
51 | ||||||||||||||||||||||||||
52 | А при G1 GC: | |||||||||||||||||||||||||
53 | ||||||||||||||||||||||||||
54 | С помощью опций Xms и Xmx можно настроить начальный и максимально допустимый размер кучи соответственно. Существуют опции для настройки величины стека. - Heap - используется всем приложением, Stack - одним потоком исполняемой программы. - Новый обьект создается в heap, в stack размещается ссылка на него. В стеке размещаются локальные переменные примитивных типов. - Обьекты в куче доступны из любого места программы, стековая память не доступна для других потоков. - Если память стека закончилась JRE вызовет исключение StackOverflowError, если куча заполнена OutOfMemoryError - Размер памяти стека, меньше памяти кучи. Стековая память быстрее памяти кучи. - В куче есть ссылки между объектами и их классами. На этом основана рефлексия. Обе области хранятся в RAM. | |||||||||||||||||||||||||
55 | Процедурная Java | |||||||||||||||||||||||||
56 | Какие примитивные типы данных есть в Java? | Вещественные, целочисленные, логические и строковые. byte short int long float double char boolean | ||||||||||||||||||||||||
57 | Что такое char? | 16-разрядное беззнаковое целое, представляющее собой символ UTF-16 (буквы и цифры) | ||||||||||||||||||||||||
58 | Сколько памяти занимает boolean? | Зависит от реализации JVM В стандартной реализации Sun JVM и Oracle HotSpot JVM тип boolean занимает 4 байта (32 бита), как и тип int. Однако, в определенных версия JVM имеются реализации, где в массиве boolean каждое значение занимает по 1-му биту. | ||||||||||||||||||||||||
59 | Что такое классы-обертки? | Обертка — это специальный класс, который хранит внутри себя значение примитива(объекты классов-оберток являются неизменяемыми (Immutable)). Нужны для реализации дженериков. | ||||||||||||||||||||||||
60 | Что такое автоупаковка и автораспаковка? | Автоупаковка - присвоение классу обертки значения примитивного типа; Автораспаковка - присвоение переменной примитивного типа значение класса обертки. для присваивания ссылок-примитивов объектам их классов-оберток (и наоборот) не требуется ничего делать, все происходит автоматически. Для того, чтобы иметь возможность оперировать с простыми числами (и boolean) как с объектами были придуманы классы-обёртки. | ||||||||||||||||||||||||
61 | Что такое явное и неявное приведение типов? В каких случаях в java нужно использовать явное приведение? | Неявное приведение – автоматическое расширение типа переменной от меньшего к большему. Явное приведение - явное сужение от большего к меньшему. Необходимо явно указать сужаемый тип. В случае с объектами мы можем делать неявное(автоматическое) приведение от наследника к родителю, но не наоборот, иначе получим ClassCastException. | ||||||||||||||||||||||||
62 | Что такое пул интов? | В Java есть пул(pool) целых чисел в промежутке [-128;127], так как это самый часто вречающийся диапазон. Т.е. если мы создаем Integer в этом промежутке, то вместо того, чтобы каждый раз создавать новый объект, JVM берет их из пула. Изменить размер кэша в HotSpot вы можете, указав ключ -XX:AutoBoxCacheMax=<размер>. | ||||||||||||||||||||||||
63 | Какие нюансы у строк в Java? | Класс String в Java - неизменяемый из-за модификатора final и отсутствия сеттера. Это нужно для реализации пула стрингов. При редактировании будет создаваться новая строка. При копировании новая строка не создается, а создается ссылка на существующую строку. | ||||||||||||||||||||||||
64 | Что такое пул строк? | Область памяти где хранятся обьекты строк. При создании в пуле идет поиск строки: -если НЕ находит - создается строка, возращается ссылка -если находит - возращает ссылку найденной строки. При этом использование оператора new заставляет класс String создать новый объект, даже если такая строка уже есть в пуле. После этого можем использовать метод intern(), чтобы поместить этот объект в пул строк. Пул строк и Integer хранится в heap, но ссылки на объекты хранятся в stack. | ||||||||||||||||||||||||
65 | Почему не рекомендуется изменять строки в цикле? Что рекомендуется использовать? | Т.к. строка неизменяемый класс, потребление ресурсов при редактировании, т.к. каждую итерацию при редактировании будет создаваться новый обьект строки. Рекомендуется использовать StringBuilder или StringBuffer. | ||||||||||||||||||||||||
66 | Почему строки не рекомендуется использовать для хранения паролей? | 1. Пул строк Так как строки в Java хранятся в пуле строк, то ваш пароль в виде обычного текста будет доступен в памяти, пока сборщик мусора не очистит её. И поскольку String используются в String pool для повторного использования, существует довольно высокая вероятность того, что пароль останется в памяти надолго, что совсем не безопасно. 2. Рекомендации авторов Java сама по себе рекомендует использовать метод getPassword () из класса JPasswordField, который возвращает char []. 3. Случайная печать в логах С типом String всегда существует опасность того, что текст, хранящийся в строке будет напечатан в файле логов или в консоли. В то же время в случае использования Array, вы не будете печатать содержимое массива, а только его расположение в памяти. | ||||||||||||||||||||||||
67 | Почему String неизменяемый и финализированный класс? | 1. Для возможности реализации строкового пула (String pool) Виртуальная машина имеет возможность сохранить много места в памяти (heap space) т.к. разные строковые переменные указывают на одну переменную в пуле. При изменяемости строк было бы невозможно реализовать интернирование, поскольку если какая-либо переменная изменит значение, это отразится также и на остальных переменных, ссылающихся на эту строку. 2. Безопасность Изменяемость строк несло бы в себе потенциальную угрозу безопасности приложения. Поскольку в Java строки используются для передачи параметров для авторизации, открытия файлов и т.д. — неизменяемость позволяет избежать проблем с доступом. 3. Для многопоточности. Неизменяемые строки потокобезопасны Так как строка неизменяемая то, она безопасна для много поточности и один экземпляр строки может быть совместно использован различными потоками. Это позволяет избежать синхронизации для потокобезопасности. Таким образом, строки в Java полностью потокобезопасны. 4. Ключ для HashMap Поскольку строка неизменная, её hashcode кэшируется в момент создания и нет никакой необходимости рассчитывать его снова. Это делает строку отличным кандидатом для ключа в Map и его обработка будет быстрее, чем других ключей HashMap. Поэтому строка наиболее часто используется в качестве ключа HashMap. - можно передавать строку между потоками не опасаясь, что она будет изменена - отсутствуют проблемы с синхронизацией потоков - отсутствие проблем с утечкой памяти - отсутствие проблем с доступом и безопасностью при использовании строк для передачи параметров авторизации, открытия файлов и т.д. - кэширование hashcode - Экономия памяти при использовании пула строк для хранения повторяющихся строк. | ||||||||||||||||||||||||
68 | Почему строка является популярным ключом в HashMap в Java? | Поскольку строки неизменны, их хэшкод кэшируется в момент создания, и не требует повторного пересчета. | ||||||||||||||||||||||||
69 | Что делает метод intern() в классе String? | Помещает строку в pool строк. | ||||||||||||||||||||||||
70 | Можно ли использовать строки в конструкции switch? | Да, начиная с Java 7 в операторе switch можно использовать строки, ранние версии Java не поддерживают этого. Более подробно: https://javarush.ru/groups/posts/759-java-string-voprosih-k-sobesedovaniju-i-otvetih-na-nikh-ch1 (10) При этом: - участвующие строки чувствительны к регистру; - использование строк в конструкции switch делает код читабельнее, убирая множественные цепи условий if-else - оператор switch использует метод String.equals() для сравнения полученного значения со значениями case, поэтому добавьте проверку на NULL во избежание NullPointerException. | ||||||||||||||||||||||||
71 | Какая основная разница между String, StringBuffer, StringBuilder? | String - неизменяемый, потокобезопасный; StringBuffer - изменяемый, потокобезопасный; StringBuilder - изменяемый, потоконебезопасный. | ||||||||||||||||||||||||
72 | Существуют ли в java многомерные массивы? | Многомерные массивы в их классическом понимании в java не существуют. Многомерный массив всегда прямоугольный и неразрывен в памяти. А то, что в java считается мнгомерным - в других языках ещё называют "зубчатым массивом" или массивом массивов. | ||||||||||||||||||||||||
73 | Какими значениями инициируются переменные по умолчанию? | byte 0 short 0 int 0 long 0L float 0.0f double 0.0d char '\u0000' boolean false Обьекты null Локальные (в методе) переменные не имеют значений по умолчанию, их имеют поля класса. Не static-поле класса будет инициализировано после того, как будет создан объект этого класса. А static-поле будет инициализировано тогда, когда класс будет загружен виртуальной Java машиной. | ||||||||||||||||||||||||
74 | Что такое сигнатура метода? | Это имя метода плюс параметры (порядок параметров имеет значение из-за множественной передачи данных через троеточие, которое должно располагаться последним). В сигнатуру метода не входит возвращаемое значение, а также бросаемые им исключения. А сигнатура метода в сочетании с типом возвращаемого значения и бросаемыми исключениями называется контрактом метода. | ||||||||||||||||||||||||
75 | Расскажите про метод main | Является, как правило, точкой входа в программу и вызывается JVM. Как только заканчивается выполнение метода main(), так сразу же завершается работа самой программы. static - чтобы JVM смогла загрузить его во время компиляции. public static void и сигнатура - обязательное декларирование. Мэйнов может быть много и может не быть вообще. Может быть перегружен. | ||||||||||||||||||||||||
76 | Каким образом переменные передаются в методы, по значению или по ссылке? | Java передает параметры по значению. Всегда. С примитивами, мы получаем копию содержимого. Со ссылками мы тоже получаем копию ссылки. https://javarush.ru/groups/posts/857-peredacha-parametrov-v-java | ||||||||||||||||||||||||
77 | ООП в Java | |||||||||||||||||||||||||
78 | Какие виды классов есть в java? | 1. Вложенные классы – нестатические классы внутри внешнего класса. 2. Вложенные статические классы – статические классы внутри внешнего класса. 3. Локальные классы Java – классы внутри методов. разница между локальным и внутреним 4. Анонимные Java классы – классы, которые создаются на ходу. Анонимные классы доступно 5. Final, abstract, enum - классы | ||||||||||||||||||||||||
79 | Расскажите про вложенные классы. В каких случаях они применяются? | Нужны для обслуживания внешних классов 1. Статические вложенные классы (Static nested classes) o Есть возможность обращения к внутренним статическим полям и методам класса обертки. 2. Вложенные классы o Есть возможность обращения к внутренним полям и методам класса обертки. o Не может иметь статических объявлений. o Внутри такого класса нельзя объявить перечисления. o Если нужно явно получить this внешнего класса — OuterClass.this 3. Локальный класс o Видны только в пределах блока, в котором объявлены. o Не могут быть объявлены как private/public/protected или static (по этой причине интерфейсы нельзя объявить локально). o Не могут иметь внутри себя статических объявлений (полей, методов, классов), но могут иметь константы (static final) o Имеют доступ к полям и методам обрамляющего класса. o Можно обращаться к локальным переменным и параметрам метода, если они объявлены с модификатором final или являются effectively final. 4. Анонимные классы o Локальный класс без имени. | ||||||||||||||||||||||||
80 | - Что такое «локальный класс»? Каковы его особенности? | Данные классы объявляются внутри других методов. Они обладают всеми свойствами нестатического вложенного класса, только создавать их экземпляры можно только в методе. Особенности: Локальные классы способны работать только с final переменными метода. С 8+ версий Java можно использовать не final переменные в локальных классах, но только при условии, что они не будут изменяться. Локальные классы нельзя объявлять с модификаторами доступа. Локальные классы обладают доступом к переменным метода. Может быть создан внутри блоков инициализации. | ||||||||||||||||||||||||
81 | Что такое «анонимные классы»? Где они применяются? | Это вложенный локальный класс без имени, который разрешено декларировать в любом месте обрамляющего класса, разрешающем размещение выражений. Создание экземпляра анонимного класса происходит одновременно с его объявлением. В зависимости от местоположения анонимный класс ведет себя как статический либо как нестатический вложенный класс - в нестатическом контексте появляется окружающий его экземпляр. Анонимные классы имеют несколько ограничений: Их использование разрешено только в одном месте программы - месте его создания; Применение возможно только в том случае, если после порождения экземпляра нет необходимости на него ссылаться; Реализует лишь методы своего интерфейса или суперкласса, т.е. не может объявлять каких-либо новых методов, так как для доступа к ним нет поименованного типа. Анонимные классы обычно применяются для: создания объекта функции (function object), например реализация интерфейса Comparator; создания объекта процесса (process object), такого как экземпляры классов Thread, Runnable и подобных; в статическом методе генерации; инициализации открытого статического поля final, которое соответствует сложному перечислению типов, когда для каждого экземпляра в перечислении требуется отдельный подкласс. Анонимные классы всегда являются конечными классами. Каждое объявление анонимного класса уникально. Видны только внутри того метода, в котором определены. В документации Oracle приведена хорошая рекомендация: «Применяйте анонимные классы, если вам нужен локальный класс для одноразового использования». | ||||||||||||||||||||||||
82 | - Каким образом из вложенного класса получить доступ к полю внешнего класса? | Статический вложенный класс имеет прямой доступ только к статическим полям обрамляющего класса. Простой вложенный класс, может обратиться к любому полю внешнего класса напрямую. В случае, если у вложенного класса уже существует поле с таким же литералом, то обращаться к внешнему полю следует через имя внешнего класса. Например: Outer.this.field. | ||||||||||||||||||||||||
83 | Что такое перечисления (enum)? | Перечисления представляют набор логически связанных констант. Перечисление фактически представляет новый класс, поэтому мы можем определить переменную данного типа и использовать ее. Перечисления, как и обычные классы, могут определять конструкторы, поля и методы. Следует отметить, что конструктор по умолчанию приватный. Также можно определять методы для отдельных констант. Методы: -ordinal() возвращает порядковый номер определенной константы (нумерация начинается с 0) -values() возвращает массив всех констант перечисления Еnum имеет ряд преимуществ при использовании в сравнении с static final int. Главным отличием является то что используя enum вы можете проверить тип данных. Недостатки - К ним не применимы операторы >, <, >=, <= - enum также требует больше памяти для хранения чем обычная константа. Нужны для ограничения области допустимых значений: например, времена года, дни недели | ||||||||||||||||||||||||
84 | Как проблема ромбовидного наследования решена в java? | В Java нет поддержки множественного наследования классов. Предположим, что SuperClass — это абстрактный класс, описывающий некоторый метод, а классы ClassA и ClassB — обычные классы наследники SuperClass, а класс ClassC наследуется от ClassA и ClassB одновременно. Вызов метода родительского класса приведет к неопределенности, так как компилятор не знает о том, метод какого именно суперкласса должен быть вызван. Это и есть основная причина, почему в Java нет поддержки множественного наследования классов. 1. Классы всегда побеждают: Определенный в классе / суперклассе метод всегда имеет высший приоритет перед дефолтными методами интерфейсов. 2. Если не срабатывает правило 1, то побеждают саб-интерфейсы (more specific). Т.е. если интерфейс B наследует A, и у обоих есть методы с одинаковой сигнатурой, то побеждает B. 3. Если оба правила не работают, то класс, наследующий конфликтующие интерфейсы, должен явно через super определить, какой именно метод вызвать, иначе компилятор будет сильно материться. | ||||||||||||||||||||||||
85 | Что такое конструктор по умолчанию? | Если у какого-либо класса не определить конструктор, то компилятор сгенерирует конструктор без аргументов - так называемый «конструктор по умолчанию». Если у класса уже определен какой-либо конструктор, то конструктор по умолчанию создан не будет и, если он необходим, его нужно описывать явно. | ||||||||||||||||||||||||
86 | Могут ли быть приватные конструкторы? Для чего они нужны? | Да, могут. Приватный конструктор запрещает создание экземпляра класса вне методов самого класса. Нужен для реализации паттернов, например singleton. | ||||||||||||||||||||||||
87 | Расскажите про классы-загрузчики и про динамическую загрузку классов. | При запуске JVM, используются три загрузчика классов: - Bootstrap ClassLoader - главный загрузчик - загружает платформенные классы JDK из архива rt.jar - AppClassLoader - системный загрузчик - загружает классы приложения, определенные в CLASSPATH - Extension ClassLoader - загрузчик расширений - загружает классы расширений, которые по умолчанию находятся в каталоге jre/lib/ext. Динамическая загрузка происходит "на лету" в ходе выполнения программы с помощью статического метода класса Class.forName(имя класса). Для чего нужна динамическая загрузка? Например мы не знаем какой класс нам понадобится и принимаем решение в ходе выполнения программы передавая имя класса в статический метод forName(). | ||||||||||||||||||||||||
88 | Чем отличаются конструкторы по-умолчанию, конструктор копирования и конструктор с параметрами? | -У конструктора по умолчанию отсутствуют какие-либо аргументы. -Конструктор копирования принимает в качестве аргумента уже существующий объект класса для последующего создания его клона. -Конструктор с параметрами имеет в своей сигнатуре аргументы (обычно необходимые для инициализации полей класса). | ||||||||||||||||||||||||
89 | Какие модификаторы доступа есть в Java? Какие применимы к классам? | Private – доступ к компоненту только из этого класса, в котором объявлен. Default – Переменная или метод будут доступны для любого другого класса в том же пакете. Protected – Поля protected доступны всем классам внутри пакета, а также всем классам-наследникам вне пакета. Public – доступ к компоненту из экземпляра любого класса и любого пакета. Класс может быть объявлен с модификатором public и default. | ||||||||||||||||||||||||
90 | Что означает модификатор static? | Статическая переменная - это переменная, принадлежащая классу, а не объекту. А статический класс- это вложенный класс, который может обращаться только к статическим полям обертывающего его класса. Внутри static метода нельзя вызвать не статический метод по имени класса. | ||||||||||||||||||||||||
91 | Может ли статический метод быть переопределён или перегружен? | Нельзя переопределять статические методы. Если вы объявите такой же метод в классе-наследнике (subclass), т.е. метод с таким же именем и сигнатурой, вы лишь «спрячете» метод суперкласса вместо переопределения. Это явление известно как сокрытие методов (hiding methods). Перегружен - да. Всё работает точно так же как и с обычными методами - 2 статических метода могут иметь одинаковое имя, если количество их параметров или типов различается. | ||||||||||||||||||||||||
92 | Могут ли нестатические методы перегрузить статические? | Да. Это будут просто два разных метода для программы. Статический будет доступен по имени класса. | ||||||||||||||||||||||||
93 | Можно ли сузить уровень доступа/тип возвращаемого значения при переопределении метода? | При переопределении метода нельзя сузить модификатор доступа к методу (например, с public до private), но можно расширить. Изменить тип возвращаемого значения нельзя, но можно сузить возвращаемое значение, если они совместимы. Например, если метод возвращает объект класса, а переопределенный метод возвращает класс-наследник. | ||||||||||||||||||||||||
94 | Что можно изменить в сигнатуре метода при переопределении? Можно ли менять модификаторы (throws и тп)? | В сигнатуре(имя + параметры) менять ничего нельзя. Возможно расширение уровня доступа. Изменять тип возвращаемого значения при переопределении метода разрешено только в сторону сужения типа (вместо родительского класса - наследника). Секцию throws метода можно не указывать, но стоит помнить, что она остаётся действительной, если уже определена у метода родительского класса. Так же, возможно добавлять новые исключения, являющиеся наследниками от уже объявленных или исключения RuntimeException. Порядок следования таких элементов при переопределении значения не имеет. | ||||||||||||||||||||||||
95 | Могут ли классы быть статическими? | Класс можно объявить статическим за исключением классов верхнего уровня. Такие классы известны как «вложенные статические классы» (nested static class). | ||||||||||||||||||||||||
96 | Что означает модификатор final? К чему он может быть применим? | Для класса это означает, что класс не сможет иметь подклассов, т.е. запрещено наследование. Следует также отметить, что к abstract-классам нельзя применить модификатор final, т.к. это взаимоисключающие понятия. Для переменных примитивного типа это означает, что однажды присвоенное значение не может быть изменено Для ссылочных переменных это означает, что после присвоения объекта, нельзя изменить ссылку на данный объект. Важно: Ссылку изменить нельзя, но состояние объекта изменять можно. Т.к. массив – это объект, то final означает, что после присвоения ссылки на объект, уже нельзя ее изменить, но можно изменять состояние объекта. | ||||||||||||||||||||||||
97 | Что такое абстрактные классы? Чем они отличаются от обычных? | Абстрактным называется класс, на основе которого не могут создаваться объекты. Как обычный класс, но с абстрактными методами. Нельзя создать объект или экземпляр абстрактного класса. Наследниками абстрактного класса могут быть другие абстрактные классы | ||||||||||||||||||||||||
98 | Может ли быть абстрактный класс без абстрактных методов? | Класс может быть абстрактным без единого абстрактного метода, если у него указан модификатор abstract. | ||||||||||||||||||||||||
99 | Могут ли быть конструкторы у абстрактных классов? Для чего они нужны? | Да. Необходимы для наследников. В абстрактном классе в Java можно объявить и определить конструкторы. Даже если вы не объявили никакого конструктора, компилятор добавит в абстрактный класс конструктор по умолчанию без аргументов. Абстрактные конструкторы будут часто использоваться для обеспечения ограничений класса или инвариантов, таких как минимальные поля, необходимые для настройки класса. | ||||||||||||||||||||||||
100 | Что такое интерфейсы? Какие модификаторы по умолчанию имеют поля и методы интерфейсов? | Интерфейс — это план класса или, можно сказать, набор абстрактных методов и статических констант. В интерфейсе каждый метод является открытым и абстрактным, но не содержит конструктора. Таким образом, интерфейс в основном представляет собой группу связанных методов с пустыми телами. Другими словами, интерфейс определяет как элементы будут взаимодействовать между собой. - методы интерфейса являются публичными (public) и абстрактными (abstract), - поля — public static final. |