предисловие
Золото три серебро четыре скоро будет. Я разобрался с некоторыми классическими вопросами интервью Java, а также дал ответы. Надеюсь, это будет полезно для всех. Если есть что-то, что вы считаете неправильным, пожалуйста, укажите это, большое спасибо много.
гитхаб-адрес
Общие черты и различия HashMap, HashTable, ConcurrentHash
Идея: Вы можете описать их базовую структуру, следует ли хранить NULL, является ли это линейной безопасностью и т. д., и, наконец, описать интервьюера.Цикл смерти HashmapПроблема и почему ConcurrentHashMap отказывается от блокировки сегмента.
HashMap
- Нижний слой реализован связным списком + массивом
- Может хранить нулевые ключи и нулевые значения
- Линейная ненадежность
- Начальная емкость равна 16, а каждое расширение равно n-й степени числа 2.
- Коэффициент нагрузки составляет 0,75. Когда общее количество элементов на карте превышает 0,75 массива ввода, операция расширения запущена.
- В случае параллелизма введите операцию HASHMAP приведет к бесконечному петле, что приводит к использованию ЦП, близкой к 100%
В HashMap есть бесконечный цикл, если вам интересно, вы можете прочитать эту статью, которая хорошо написана:Клише, бесконечный цикл HashMap
Для целей разработки этих констант в HashMap вы также можете прочитать мою статью:Бонусный элемент интервью — назначение этих констант в исходном коде HashMap.
HashTable
- Нижний слой HashTable также реализован связным списком + массивом.
- Будь то ключ или значение не может быть нулевым
- Он линейно безопасен и использует ключевое слово synchronized.
ConcurrentHashMap
- Нижний слой ConcurrentHashMap представляет собой массив + связанный список/красно-черное дерево.
- Невозможно хранить нулевые ключи и значения
- ConcurrentHashMap является потокобезопасным
- ConcurrentHashMap использует метод сегментации блокировки для обеспечения линейной безопасности.
- Причина, по которой JDK8 отказывается от сегментированных блокировок, заключается в том, что несколько сегментированных блокировок занимают место в памяти, а вероятность конкуренции за одну и ту же блокировку очень мала, а сегментированные блокировки приведут к низкой эффективности.
В чем разница между ArrayList и LinkedList.
Идеи: уравнивание их базовой структуры данных, эффективности, накладных расходов
- ArrayList — это структура данных, основанная на динамических массивах, а LinkedList — структура данных, основанная на связанных списках.
- Произвольный доступ для получения и установки, ArrayList более эффективен, потому что LinkedList должен перемещать указатель, а ArrayList — это структура данных на основе индекса, которая может быть напрямую сопоставлена с ней.
- Вставляйте и удаляйте данные, добавляйте и удаляйте, LinkedList более эффективен, потому что ArrayList должен перемещать данные.
- LinkedList дороже, чем ArrayList, потому что узлы LinkedList должны хранить ссылки в дополнение к данным.
Разница между String, Stringbuffer, StringBuilder.
Нить:
- Класс String является неизменяемым классом, после создания его нельзя изменить.
- String является окончательным классом и не может быть унаследован
- Строка реализует метод equals() и метод hashCode().
Строковый буфер:
- Унаследованный от AbstractStringBuilder, это изменяемый класс.
- StringBuffer является потокобезопасным
- Данные могут создаваться динамически с помощью метода append.
StringBuilder:
- Унаследованный от AbstractStringBuilder, это изменяемый класс.
- StringBuilder нелинейно безопасен.
- Эффективность выполнения выше, чем у StringBuffer.
Каковы несколько основных типов данных в JAVA и сколько байтов занимает каждый из них.
См. пример:
public class Test {
public static void main(String[] args) {
System.out.println("Byte bit num: " + Byte.SIZE);
System.out.println("Short bit num : " + Short.SIZE);
System.out.println("Character bit num: " + Character.SIZE);
System.out.println("Integer bit num: " + Integer.SIZE);
System.out.println("Float bit num: " + Float.SIZE);
System.out.println("Long bit num: " + Long.SIZE);
System.out.println("Double bit num: " + Double.SIZE);
}
}
результат операции:
Byte bit num: 8
Short bit num : 16
Character bit num: 16
Integer bit num: 32
Float bit num: 32
Long bit num: 64
Double bit num: 64
Разница между String s и новой строкой
String str ="whx";
String newStr =new String ("whx");
String str ="whx"
Сначала найдите объект "whx" в пуле констант. Если он есть, пусть str указывает на этот "whx". Если нет, создайте новый объект "whx" в пуле констант, и пусть str указывает на новый объект в константном пуле объект "whx".
String newStr =new String ("whx");
Это объект "whx", созданный в куче, а адрес памяти объекта "whx" в куче создается в стеке.
как показано на рисунке:
Эта статья очень хороша:Разница между строкой и новой строкой()
Разница между Био, Нио и Айо
BIO
Это традиционный пакет java.io, он реализован на основе потоковой модели, метод взаимодействия синхронный и блокирующий, то есть при чтении входного или выходного потока поток будет заблокирован до тех пор, пока не будет выполнено чтение и запись. действие завершено, там звонки между ними идут в надежном линейном порядке. Его преимущество в том, что код относительно прост и интуитивно понятен, а недостаток в том, что эффективность и масштабируемость ввода-вывода очень низки, и он легко может стать узким местом в производительности приложения.
NIO
Это пакет java.nio, представленный в Java 1.4. Он предоставляет новые абстракции, такие как Channel, Selector, Buffer и т. д. Он может создавать мультиплексированные, синхронные неблокирующие программы ввода-вывода и в то же время предоставляет более близкие методы манипулирования данными. к лежащей в основе высокой производительности операционной системы.
AIO
После того, как пакет был введен в Java после 1.7, модернизированная версия NIO, обеспечивает неблокирующий асинхронный режим работы IO, поэтому люди называют IT AiO (Asynchronous IO), IO основан на асинхронном событии и механизме обратного вызова для достижения механизма , то есть операция приложения будет возвращена напрямую, не будет забита, когда завершена фоновая обработка, операционная система уведомит соответствующий поток для последующих операций.
Вышеупомянутое содержание взято из этой статьи, вы можете прочитать ее и написать более подробно.
Ядро Java (5) глубокое понимание BIO, NIO, AIO
Расскажите о жизненном цикле весны.
- Во-первых, после запуска контейнера инициализируйте bean-компонент
- Согласно определению бина, вводить свойства
- Обнаружение того, реализует ли объект интерфейс XXXAWARE и ввести соответствующий экземпляр XXXAWARE в бону, например, Beanameage и т. Д.
- Вышеуказанные шаги, объект компонента был правильно настроен, путем реализации интерфейса BeanPostProcessor может дополнительно настроить некоторые метод обработки. Такие как: постпроцесбезвыинициализация.
- После завершения предварительной обработки BeanPostProcessor могут быть реализованы такие методы, как postConstruct, afterPropertiesSet, init-method и т. д. Добавьте нашу пользовательскую логику,
- За счет реализации интерфейса BeanPostProcessor выполняется постобработка postProcessAfterInitialzation.
- После этого фасоль готова к употреблению.
- После закрытия контейнера, если компонент реализует интерфейс DisposableBean, будет вызван метод интерфейса destroy().
- Указав функцию для метода destroy, указанная логика может быть выполнена до того, как компонент будет уничтожен.
Принцип отражения, каковы три способа создать экземпляр класса по отражению.
Механизм отражения Java:
Механизм отражения в Java означает, что в рабочем состоянии любой класс может знать все свойства и методы этого класса, и для любого объекта может быть вызван любой его метод; это динамическое получение информации и динамический вызов объектов. метод становится механизмом отражения языка Java
Есть три способа получить объекты класса:
- Используйте статический метод Class.forName
- Использование метода .class класса
- Используйте метод getClass() объекта экземпляра
Посмотрите на эту статью, которую я писал:Разговор об отражении Java: от входа к практике, к принципу
Расскажите о нескольких способах достижения идемпотентности
чтоидемпотентность? Запрос ресурса один и несколько раз должен иметь одинаковый результат для самого ресурса. Другими словами, любое его многократное выполнение будет иметь такое же влияние на сам ресурс, как и однократное выполнение.
Обычно существуют следующие способы достижения идемпотентности:
- Метод пессимистической блокировки (например, пессимистическая блокировка базы данных, выберите... для обновления)
- Оптимистичный метод блокировки (например, алгоритм CAS)
- Уникальные ограничения (например, уникальные индексы)
- Распределенные блокировки (распределенные блокировки redis и т. д.)
Взгляните на эту статью, она хорошо написана:Изучите несколько способов достижения идемпотентности
Поговорите о порядке создания экземпляров классов, таких как статические данные родительского класса, конструкторы, поля, статические данные подкласса, конструкторы, поля и т. д.
Просто посмотрите на пример:
public class Parent {
{
System.out.println("父类非静态代码块");
}
static {
System.out.println("父类静态块");
}
public Parent() {
System.out.println("父类构造器");
}
}
public class Son extends Parent {
public Son() {
System.out.println("子类构造器");
}
static {
System.out.println("子类静态代码块");
}
{
System.out.println("子类非静态代码块");
}
}
public class Test {
public static void main(String[] args) {
Son son = new Son();
}
}
результат операции:
父类静态块
子类静态代码块
父类非静态代码块
父类构造器
子类非静态代码块
子类构造器
так,Порядок создания экземпляров класса следующий:Блок статического кода/статический домен родительского класса -> блок статического кода/статический домен дочернего класса -> блок нестатического кода родительского класса -> конструктор родительского класса -> блок нестатического кода дочернего класса -> конструктор дочернего класса
В отражении разница между Class.forName и ClassLoader
И Class.forName, и ClassLoader могут загружать классы. Где они разные?ClassLoaderОтвечает за загрузку байт-кода классов Java в виртуальную машину Java. Class.forName фактически вызывает ClassLoader следующим образом:
Class<?> forName(String name, boolean initialize, ClassLoader loader)
Метод выполняет ту же функцию, и его исходный код выглядит следующим образом:
Таким образом, разница между Class.forName и ClassLoader заключается в том, что при загрузке класса class.forName имеет параметры для управления инициализацией класса.
Разница между динамическим прокси JDK и реализацией cglib
- Динамический прокси-сервер Java использует механизм отражения для создания анонимного класса, реализующего интерфейс прокси-сервера, и вызывает InvokeHandler для его обработки перед вызовом определенного метода.
- Динамический прокси-сервер cglib использует пакет с открытым исходным кодом asm, загружает файл класса класса прокси-объекта и генерирует подклассы, изменяя его байт-код.
- Динамические прокси JDK могут генерировать прокси только для классов, реализующих интерфейсы, но не для классов.
- cglib — это прокси для классов, в основном для создания подкласса для указанного класса и переопределения методов. Поскольку это наследование, лучше не объявлять класс или метод как final
Эта статья хорошо написана.Описать несколько реализаций динамических агентов Java и указать их соответствующие преимущества и недостатки.
Разница между ошибкой и исключением, CheckedException, разница RuntimeException.
Error:Указывает на ошибки времени компиляции или системные ошибки, такие как ошибки, связанные с виртуальной машиной, OutOfMemoryError и т. д., ошибки не могут быть обработаны.
Exception:Исключение кода, базовый тип, о котором заботятся программисты Java, обычно является Exception. Она может быть обработана самой программой, в чем разница между ней и ошибкой.
Его можно разделить на RuntimeException (исключение времени выполнения) и CheckedException (проверяемое исключение). Общие исключения RuntimeException:
- NullPointerException 空指针异常
- ArithmeticException 出现异常的运算条件时,抛出此异常
- IndexOutOfBoundsException 数组索引越界异常
- ClassNotFoundException 找不到类异常
- IllegalArgumentException(非法参数异常)
Исключения общих проверенных исключений:
- IOException (操作输入流和输出流时可能出现的异常)
- ClassCastException(类型转换异常类)
Если вам интересно, вы можете прочитать эту статью, которую я написал ранее:Обязательным для Java-программистов: десять ключевых точек знаний об исключениях
Что такое механизм CAS, как решить проблему ABA?
CAS включает три операнда
- 1. Адрес памяти V, который необходимо прочитать и записать
- 2. Ожидаемое исходное значение A для сравнения
- 3. Новое значение B, которое нужно записать Если значение V ячейки памяти совпадает с ожидаемым старым значением A, процессор автоматически обновит значение ячейки до нового значения B.
Идея CAS: При обновлении считается, что значение в позиции V по-прежнему равно значению A. Если оно равно, считается, что оно не было изменено другими потоками, и его можно обновить до B ценность. В противном случае считается, что оно было изменено другими потоками, а не обновлено до значения B, и возвращается самое последнее значение текущей позиции V.
Заинтересованные друзья могут глянуть мою статью, CAS мысль для решения практических задач:Практика оптимистической блокировки CAS для решения проблем параллелизма
Разница между глубоким копированием и поверхностным копированием
мелкая копия
Ссылочный адрес объекта копируется, и два объекта указывают на один и тот же адрес памяти, поэтому, если какое-либо значение будет изменено, другое значение изменится соответственно.
глубокая копия
Скопируйте объект и его значение, и два объекта изменят любое из значений, а другое значение не изменится.
Говорить о сериализации и десериализации
- Сериализация относится к преобразованию объектной последовательности байтов, преобразованной для десериализации объектов, высосанных из процесса последовательности байтов.
- Сериализация объектов Java заключается в преобразовании объекта, реализующего интерфейс Serializable, в последовательность байтов, которую можно передавать по сети, в хранилище файлов и т. д., не беспокоясь об изменении данных на разных машинах и в разных средах в процессе передачи. байтов или любых других деталей, а затем иметь возможность полностью восстановить эту последовательность байтов в исходный объект.
Эта статья хорошо написана:Java Serializable: явно пустой интерфейс
В чем разница между == и equals?
==
- Если это базовый тип, == означает судить, равны ли их значения;
- Если это ссылочный объект, == означает, что адреса памяти, на которые указывают два объекта, одинаковы.
equals
- Если это строка, это означает, что нужно судить, совпадает ли содержимое строки;
- Если это метод объектного объекта, сравнение также является значением адреса памяти, на которое делается ссылка;
- Если ваш собственный класс переопределяет метод equals, вы можете указать, равны ли два объекта.
Расскажите о принципе AQS и компонентах синхронизации AQS.
Основные ответы на основные вопросы интервью AQS
- поддержание гос.
- очередь CLH
- уведомление ConditionObject
- Шаблон проектирования метода шаблона
- Эксклюзивные и общие режимы.
- Пользовательский синхронизатор.
- Некоторые расширения корзины семейства AQS, такие как: ReentrantLock и т. д.
Вы можете посмотреть мою статью:Анализ AQS и реальный бой
Разница между финалом, доработана (), наконец
- Final — это ключевое слово для изменения классов, переменных-членов и членов.
- Finalize — это метод класса объектов, и подклассы могут переопределять метод finalize() для повторного использования ресурсов.
- Наконец, вместе с try обычно появляется в блоке кода обработки исключений.
Как реализован синхронизированный нижний слой?
Посмотрите мою статью:Синхронный анализ - если вы готовы чистить мое сердце слой за слоем
Принцип пула потоков Java? Что такое пулы потоков? Какие типы пулов потоков есть у фабрики пулов потоков и каковы их параметры пула потоков?
Для пулов потоков Java эта блок-схема более важна:
Вы можете посмотреть мою статью:Требования к собеседованию: анализ пула потоков Java
ожидающее обновления
Какие еще есть классические вопросы для собеседования по Java? Ты тоже можешь сказать мне, ха-ха.
Ссылка и спасибо
- Разница между строкой и новой строкой()
- Клише, бесконечный цикл HashMap
- Ядро Java (5) глубокое понимание BIO, NIO, AIO
- Изучите несколько способов достижения идемпотентности
- В отражении Java разница между Class.forName и ClassLoader
- Java Serializable: явно пустой интерфейс
Личный публичный аккаунт
- Если вы хороший ребенок, который любит учиться, вы можете подписаться на мой официальный аккаунт, чтобы вместе учиться и обсуждать.
- Если вы считаете, что в этой статье есть какие-либо неточности, вы можете прокомментировать или подписаться на мой официальный аккаунт, пообщаться со мной в частном порядке, и все смогут учиться и прогрессировать вместе.