Какие бывают внутренние классы? Как правильно создавать объект вложенного класса? Как правильно создавать объект внутреннего класса? Зачем использовать ключевое слово final при создании анонимных классов? Во что компилируется анонимный внутренний класс?​

Внутренние классы бывают следующих типов:
-вложенные (статические) внутренние классы;
-внутренние классы члены;
-локальные классы;
-анонимные классы.

Вложенные статические классы.​

Имеют доступ только к статическим полям и методам содержащего их класса. Для создания экземпляра не требуется объект внешнего класса.

Вложенные статические классы в основном используются для группировки. Пример из кода компилируется в два класса OuterClass$InnerStaticClass.class и OuterClass.class.

Внутренние классы члены.​

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

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

Локальные классы.​

Локальные классы создаются в блоках инициализации и в статических блоках java кода. Но чаще всего они используются внутри методов. Они могут обращаться только к финальным полям обрамляющего класса и аргументам метода. Его нельзя создать за пределами блока кода, в котором он описан. Локальный класс не может быть private, public, protected или static.

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

Анонимные классы используются в месте их создания. Они не имеют имени. Являясь частным случаем локального класса они приемствуют все ограничения локальных классов. Также могут обращаться к финальным локальным переменным внешнего класса и ко всем полям обрамляющего класса. Локальные переменные должны быть финальными для того, что бы пользователь класса был уверен в том, что пока он работает с данными они не изменятся во внешнем коде, что их состояние остаётся актуальным на всём протяжении жизни анонимного класса.

После компиляции анонимный класс из примера выше выглядит как TestAnonimClass$1.class, но в программе мы не можем обратиться к нему по такому имени.

Как преобразовать число в шестнадцатеричную строку? Как преобразовать число в двоичную строку?​

И вновь на помощь приходят классы обёртки, в которых заботливыми разработчиками уже реализованы методы для представления чисел в разных системах счисления. Пример:

 

Как узнать максимальное значение int? Как узнать минимальное значение byte?​

У классов обёрток в Java есть константы, возвращающие максимальные и минимальные значения обёртываемых примитивов.

 

Зачем в «ArrayList» нужно писать «?»​

Если дословно, не вдаваясь в термины дженериков, то данную конструкцию можно описать как ArrayList каких то типов, которые станут известны только в момент выполнения программы. «?» является так называемым групповым типом(маской), он не позволяет вызывать методы, модифицирующие дженеризированный объект. Но можно расширять маску и тогда методы становятся доступны. Пример в коде ниже:

Если раскомментировать лист строк, то пример не скомпилируется. Гораздо лучше отловить ошибку компилятором, нежели она всплывёт в момент выполнения программы.

В чём отличие TreeMap и HashMap?​

Классы являются представителями коллекций Java. Различаются способом хранения ключей. TreeMap — автоматически сортирует помещённые в неё пары. Её стоит использовать там, где важен порядок хранения объектов. В HashMap сортировка ключей выполняется на основе их хэшкодов. Порядок на первый взгляд хаотичный. При выборке выигрывает TreeMap, так как в ней при поиске ключа работают алгоритмы, применяемые к упорядоченным массивам. Посмотреть как будет меняться время выборки вы можете сами, поигравшись со счётчиками циклов в коде ниже.

 

Как определить, содержит ли переданный объект определённый метод?​

Тут нам поможет великий и ужасный механизм рефлексии, который при умелом подходе поможет разобрать любой объект мира Java по крупицам, а также модифицировать его. Для проверки объекта на содержание какого либо метода изначально нужно получить объект Class данного экземпляра, а уж из него можно вытянуть всё необходимое. Как обычно, пример в коде ниже:

Как вы видите, даже приватные методы с лёгкостью можно достать из объекта.

Как отсортировать список строк в обратном алфавитном порядке?​

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

Метод принимает экземпляр класса, реализующего интерфейс List и параметризованный содержимым листа компаратор, который знает как сортировать этот самый лист. При вызове без компаратора метод отсортирует Ваш лист в обычном порядке, но если передать ему компаратор, который возвращает метод класса Collections reverseOrder(), то он отсортирует в обратном порядке лист. Пример в коде ниже.

 

Как отсортировать массив чисел?​

Для сортировки массивов в классе Arrays есть метод sort, в котором реализован оптимальный алгоритм. Можно, конечно, написать свои алгоритмы сортировки, но это полезно при начале обучения ЯП. Пользоваться же тем что уже написано до нас гораздо удобнее.

 

Что такое mutable и immutable типы? Что даёт классу String то, что его сделали immutable? ​

Immutable (неизменным) типом в ООП называется такой тип, объект которого после создания становиться неизменным, так сказать read-only. Соответственно mutable(изменчивые) типы готовы к изменениям на всём протяжении своего существования. Immutable тип, например String, не содержит методов для изменения своего состояния. Все методы, которые якобы изменяют состояние объекта String, на самом деле возвращают новые строки. Плюсы неизменности строк следующие:
-так как строки неизменны, их стало возможно использовать в пуле, тем самым добиться экономии памяти

s1 и s2 указывают на одну и ту же строку.
-возможность кэширования хэш-кода. Мы всегда можем быть уверены что хэш-код строки не изменился.
-безопасность. Подключения к базам, соединения, аргументы методов. Строки везде.
-потокобезопасность. Методы, обращающиеся из разных потоков к общей строке всегда видят одно и то же её состояние.

Что происходит, когда мы пишем «A»+»b»+»C»?​

Происходит чудо — называемое конкатенацией (или объединением) строк. Возвращается строка, состоящая из «суммируемых» строк. Математические операторы, в отличии от языка С, в Java перегружать нельзя. «+» является исключением, он перегружен изначально и помимо своих прямых обязанностей используется ещё для объединения строк.