Чем больше вы знаете, тем больше вы не знаете
Ставьте лайк и смотрите снова, формируйте привычку
эта статьяGitHub github.com/JavaFamilyОн был включен, есть интеллект-карта точек интервью производителей первой линии, а также я организовал много своих документов. Добро пожаловать в Star и совершенствуйтесь. Каждый может обратиться в испытательный центр для ознакомления. Я надеюсь мы можем иметь что-то вместе.
предисловие
Помните, читатели Чунцинской почты и телекоммуникаций, о которых я говорил на прошлой неделе?
Я также был очень рад узнать, что он принял предложение, и хотел поделиться своим опытом собеседования и вопросами интервью, чтобы каждый мог знать, на что похоже текущее собеседование на стажировку.
Что очень хорошо, так это то, что он делает свое собственное резюме каждый раз, когда берет интервью. Как только я сказал это, он сразу же дал мне документ. Отличный мальчик, я могу знать, почему он получил так много предложений.
Для всей статьи я изначально хотел опубликовать процесс интервью, затем опубликовать вопросы интервью и все, чтобы я мог написать статью.
Но вы обязательно назовете меня отморозком, безответственным, и дадите мне ответ, не дав мне ответа.
Я пришла сюда от теплого человека, и наконец написала тебе ответ, не люби меня, результата нет.
текст
Было прохладное осеннее утро, Анжела Бинбинг, как всегда, заснула, храпя, храпя и храпя.
Динь-динь-динь, ⏰ прозвенел будильник, Анджела Бинг-Бинг, как обычно, закрыла глаза, коснулась телефона и выключила его, она уже собиралась уснуть.
Внезапно Анджела Бинбин кое о чем подумала: «Сегодня еще интервью с Baidu и Jingdong, и я чуть не проспала».
В мгновение ока Анджела Бинбинг уже сидела в конференц-зале рядом с JD.com и Baidu. (Я объединил проблемы на одной стороне двух компаний и сделал дедупликацию)
Дверь открылась, и к вам подошел мужчина средних лет с пузатым животом в клетчатой рубашке с поцарапанным макинтошем, глядя на свои лысые волосы, думая, что он, должно быть, топ-архитектор Нимы!
Представьтесь, молодой человек, и расскажите о проектах, которые вы уже сделали.
Привет, интервьюер, меня зовутАнджела Бинг БингВ этом году мне 23 года. Я из Цзуньи, Гуйчжоу. Я окончил Техническое профессиональное училище Ланьсян по специальности электронная информационная инженерия. В этом году я работаю два года. До этого я проходил стажировку в Huawei. проблема.
Нынешняя компания Tmall Global, которая в основном отвечает за исследования и разработки группы деятельности и выступает в качестве лидера группы.В течение одного года компании он участвовал в более чем 30 больших и малых мероприятиях, а мероприятия принесли В 9 раз GMV компании превысил 10 млн. Ответственные действия и проекты в основном используют дизайнерские идеи микросервисов и методы распределенного развертывания.
Обычно используемым промежуточным программным обеспечением являются Redis, RocketMq, ElasticSearch, Logstash, Canal, Dubbo и т. Д., У них есть глубокие исследования и понимание исходного кода Dubbo, а подражание Dubbo с Netty также написали инфраструктуру, подобную Rpc, которая теперь находится в открытом доступе. GitHub и имеет 20 000 звезд.
Кроме того, в свободное время он будет вести технические блоги и должен иметь определенное количество поклонников на крупных блог-форумах.
У меня есть некоторое понимание всех бизнес-процессов электронной коммерции, у меня есть собственное понимание обработки онлайн-проблем и настройки производительности, и я хорошо знаком с процессом исследований и разработок и проектирования в бизнесе.
Я решил уйти в отставку по личным причинам. Если мне посчастливится присоединиться к вашей компании и работать вместе, я думаю, что смогу начать работу и добиться результатов как можно скорее. Вышеизложенное является моим представлением себя. Спасибо, интервьюер.
Tip:Все вышеперечисленные представления о себе являются вымышленными, просто чтобы дать вам демонстрацию представления о себе в интервью, вопросы интервью - это вопросы интервью Анжелы Сяобин.
Анджела Бинг Бинг? Я вижу в вашем резюме, что вы работали руководителем проекта, и вы выполняли эту работу после того, как были руководителем группы. Расскажите нам о том, чему вы научились.
Привет красавчик интервьюер,после прихода в компанию я стал лидером группы из-за переноса проекта.Это не так круто как я думал,потому что раньше я отвечал за свои дела.Теперь мне нужно иметь общую картину Также есть контроль за ходом проекта, просмотр кода и планов членов команды.
Одноклассники в группе очень хорошие, если я хочу их удержать, мне приходится заставлять себя постоянно заниматься, поэтому в этот раз очень болезненно, но успехи есть.
Вы видели исходный код HashMap?
Что ж, я видел это, потому что в реальном процессе разработки карта по-прежнему является относительно распространенным вопросом на собеседовании.
Весь процесс метода put() HashMap в JDK1.7.
JDK1.8 имеет эти изменения.
Каковы проблемы с безопасностью потоков в HashMap в JDK1.7? Каковы причины?
После JDK1.8, как связать метод адреса и какова длина связанного списка, он будет преобразован в красно-черное дерево.
Когда количество узлов равно , красно-черное дерево вернется в связанный список.
Почему вы выбрали 8 в качестве порога преобразования связанного списка в красно-черное дерево?
Согласно распределению Пуассона, когда коэффициент загрузки по умолчанию равен 0,75, вероятность того, что количество элементов в одном хеш-слоте равно 8, меньше одного на миллион, поэтому 7 используется как водораздел, а когда он равен 7, он не преобразуется, а если он больше или равен 8, то при выполнении преобразования он преобразуется в связанный список, когда он меньше или равен 6.
В чем разница между HashMap и HashTable?
Вы узнали о ConcurrentHashMap?
Как ConcurrentHashMap обеспечивает потокобезопасность после JDK1.8?(CAS+synchronized), здесь я также спрашиваю разницу между синхронизированными и реентерабельными блокировками.
Каковы оптимизации по сравнению с JDK1.7?
Я писал о знаниях о HashMap и ConcurrentHashMap, поэтому повторять работу не буду, просто посмотрите мои статьи, связанные с HashMap и ConcurrentHashMap (в основном то же самое, что я представил, в зависимости от того, что принадлежит мне):
Говоря о синхронизированном, в чем разница между синхронизированным перед загрузкой статического ключевого слова и перед обычным методом?
Synchronized изменяет нестатический метод, который фактически блокирует объект, вызывающий метод, широко известный как «блокировка объекта».
Synchronized изменяет статический метод, который фактически блокирует объект этого класса, широко известный как «блокировка класса».
- Только один ключ блокировки объекта может быть взаимоисключающим, чтобы обеспечить уникальность общих переменных.
- Блокировка статического метода и блокировка метода экземпляра по умолчанию не совпадают. Если синхронизация должна сделать две блокировки одинаковыми.
- Что касается блокировки метода того же класса, то она исходит от объекта, вызывающего метод.Если объект, вызывающий метод, тот же, то и блокировка должна быть такой же, иначе она не та. Например, new A().x() и new A().x() имеют разные объекты и разные блокировки.Если A — простой процент, они могут быть взаимоисключающими.
- Блокировка статического метода, которая может быть взаимоисключающей со всеми другими блокировками статического метода.
- Блокировка статического метода имеет тот же эффект, что и блокировка xx.class, которая непосредственно принадлежит классу.
Увидев, что вы знакомы с синглтонами, представьте шаблон синглтона и расскажите о разнице между ленивым и голодным синглтоном? (почерк)
Введение в синглтоны:
намерение:Гарантирует наличие только одного экземпляра класса и предоставляет к нему глобальную точку доступа.
Основное решение:Глобально используемый класс часто создается и уничтожается.
Когда использовать:Если вы хотите контролировать количество экземпляров и экономить системные ресурсы.
Как решить:Определить, есть ли в системе уже этот синглтон, если есть, вернуть его, если нет — создать.
Ключевой код:Конструкторы частные.
Приложения:
- В классе только один учитель.
- Windows является многопроцессорной и многопоточной.При работе с файлом неизбежно, что несколько процессов или потоков работают с файлом одновременно, поэтому обработка всех файлов должна выполняться через уникальный экземпляр.
- Некоторые диспетчеры устройств часто проектируются как одноэлементный режим, например, компьютер имеет два принтера, и необходимо обработать то, что два принтера не могут печатать один и тот же файл при выводе.
преимущество:
- В памяти находится только один экземпляр, что снижает нагрузку на память, особенно при частом создании и уничтожении экземпляров (например, кэш домашней страницы Школы менеджмента).
- Избегайте многократного использования ресурсов (например, операций записи в файл).
недостаток:Здесь нет интерфейса, нет наследования и конфликтует с принципом единой ответственности Класс должен заботиться только о внутренней логике, а не о том, как реализовать ее снаружи.
используемые сцены:
- Требуется уникальный серийный номер производства.
- Счетчик в WEB не нужно добавлять в базу данных каждый раз, когда она обновляется, а сначала кэшируется с помощью синглтона.
- Созданный объект должен потреблять слишком много ресурсов, таких как подключение ввода-вывода к базе данных и т. д.
Меры предосторожности:Метод getInstance() должен использовать синхронизированную блокировку синхронизации (Singleton.class), чтобы предотвратить одновременный ввод нескольких потоков и вызвать многократное создание экземпляра экземпляра.
ленивый
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
голодный человек
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
Как обеспечить потокобезопасность в ленивом стиле?
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
Каковы способы создания потокобезопасных синглетонов?
Блокировка с двойной проверкой/блокировка с двойной проверкой (DCL, блокировка с двойной проверкой)
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
Зарегистрированный/статический внутренний класс
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
перечислить
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
Расскажите о модели памяти JVM? (каждый модуль говорит)
Область метода
Область методов в основном состоит в том, чтобы поместить аналогичные определения классов, константы, скомпилированный код, статические переменные и т. д. В JDK1.7 реализация HotSpot VM заключается в том, чтобы поместить ее в постоянное поколение, преимущество которого заключается в возможности использовать heap напрямую.Для управления используется алгоритм GC, но недостаток в том, что часто происходит переполнение памяти, то есть исключение PermGen Space.Поэтому в JDK1.8 HotSpot VM отменяет постоянную генерацию и заменяет ее метапространством, которое напрямую использует локальную память.Теоретически компьютер может использовать столько памяти, сколько ему нужно, поэтому больше никаких исключений PermGen Space.
куча
Здесь выделяется память почти всем объектам, массивам и т. д., и на них приходится большая доля памяти JVM, они же являются основной позицией для сборки мусора GC, обычно мы относим к новому поколению, старому поколению и перманентному поколению. Эта область будет объяснена позже, почему требуется генерация.
Стек виртуальной машины (стек Java)
Когда JVM выполняет метод, она создает в этой области кадр стека для хранения различной информации о методе, такой как возвращаемое значение, таблица локальных переменных и различные ссылки на объекты.После выполнения извлеките стек из стека.
Стек собственных методов
Аналогичен стеку виртуальной машины, но разница специально предусмотрена для метода Native.
Регистр счетчика программ
Занимая небольшую площадь, мы знаем, что код выполнения JVM выполняет байт-код построчно, поэтому нам нужен счетчик для записи количества выполняемых в данный момент строк.
Знакомы с алгоритмом сборки мусора? Подскажите какие алгоритмы сборки мусора?
пометить как очищенный
Алгоритм маркировки-очистки делит сборку мусора на две фазы:Отметить фазу и очистить фазу.
Первый проход на этапе маркировкиКорневой узел (GC Roots), пометить все объекты, начиная с корневого узла, неотмеченные объекты являются мусорными объектами без ссылок. Затем, на этапе очистки, очищаются все неотмеченные объекты.
алгоритм репликации
Просканируйте из корневого узла коллекции, отметьте все уцелевшие объекты, скопируйте эти уцелевшие объекты в новый участок памяти (нижний участок памяти на рисунке), а затем скопируйте исходный участок памяти (участок памяти на рисунке) Часть памяти выше) вся переработана
разметка
Эффективность алгоритма репликации основана на предположении, что существует меньше выживших объектов и больше мусорных объектов.
Это часто происходит в молодом поколении, но чаще встречается в старшем поколении, где большинство объектов являются живыми объектами. Если алгоритм репликации по-прежнему используется, стоимость репликации также будет высокой из-за большого количества уцелевших объектов.
Алгоритм сбора поколений
Алгоритм сбора по поколениям — это алгоритм повторного использования, который в настоящее время используется виртуальными машинами., что решает проблему того, что сортировка по разметке не применяется к старым поколениям, разделяя память на поколения. Как правило, область кучи делится на постоянное поколение и молодое поколение.Есть еще одно поколение за пределами области кучи, которое называется постоянным поколением.
В разных поколениях используются разные алгоритмы, поэтому используется наиболее подходящий алгоритм.Выживаемость нового поколения низкая, и можно использовать алгоритм репликации. Уровень выживаемости объектов старости высок, и для его размещения нет дополнительного места, поэтому можно использовать только алгоритм очистки меток или алгоритм сортировки меток.
Как определить, должен ли объект быть переработан.
Чтобы решить проблему циклической ссылки, java использует метод прямой достижимости, в основном черезRoots
Объект используется в качестве отправной точки для поиска, а путь, пройденный поиском, называется «цепочкой ссылок».Roots
Когда нет связанной цепочки ссылок, это доказывает, что объект недоступен.Конечно, объект, который определен как недостижимый, не обязательно становится перерабатываемым объектом.
Объект, который определен как недостижимый, должен пройти как минимум два процесса маркировки, чтобы стать объектом, пригодным для вторичной переработки.Если во время этих двух процессов маркировки по-прежнему нет возможности ускользнуть, чтобы стать объектом, пригодным для вторичной переработки, он в основном становится объектом, подлежащим переработке. он может быть переработан на самом деле зависит в основном отfinalize()
Связан ли метод с объектом в цепочке ссылок, если вfinalize()
Если в методе есть ассоциация, то самоспасение прошло успешно, и измененный объект не может быть переработан, наоборот, если ассоциации нет, он дважды успешно помечен, и его можно назвать мусором, подлежащим переработке.
В дополнение к сборке мусора есть такие задания, которые вызовут слишком высокую загрузку процессора (на самом деле, вот сценарий, который заключается в описании тех заданий в дополнение к сборке мусора, которые заставят онлайн-процессор занять 90% - 100, и дайте процесс устранения неполадок.).
Расскажите о характеристиках сборщика мусора CMS и сборщика G1, а также о процессе сбора.
Сборщик CMS — это сборщик, целью которого является получение кратчайшего времени паузы сбора. На основе алгоритма «маркировка-развертка» процесс его работы выглядит следующим образом:
начальная отметка
одновременная маркировка
перемаркировать
-
Параллельная очистка
Два шага начальной маркировки и повторной маркировки по-прежнему необходимы, чтобы «остановить мир». Первоначальная маркировка предназначена только для маркировки объектов, с которыми GC Roots может напрямую ассоциироваться. Это очень быстро читается. Параллельная стадия маркировки заключается в выполнении GC Roots Tracing и этап повторной маркировки. Он предназначен для исправления записи метки той части объекта, которая вызывает перемещение метки из-за того, что пользовательская программа продолжает работать во время параллельной маркировки. Время паузы на этом этапе обычно составляет немного длиннее начальной отметки, но намного короче параллельной отметки.
CMS — отличный сборщик с основными преимуществами: одновременный сбор, малая пауза.
недостаток:
Сборщик CMS очень чувствителен к ресурсам ЦП. В параллельной фазе, хотя это и не приведет к остановке пользовательского потока, это приведет к замедлению работы приложения, поскольку часть потока будет занята, и общая пропускная способность будет снижена.
Сборщик CMS не может обрабатывать плавающий мусор, и может произойти сбой «сбой параллельного режима», что приведет к полной сборке мусора.
Плавающий мусор: поскольку пользовательский поток все еще выполняется в параллельной фазе очистки CMS, новый мусор будет естественным образом генерироваться по мере работы программы.После процесса маркировки этой части мусора CMS не может обрабатывать их в текущей коллекции, поэтому он должен оставить его для очистки следующего GC. Этот мусор является "плавающим мусором".
- CMS — сборщик, реализованный по алгоритму «пометки-развертки», подверженный большому количеству космического мусора. Когда фрагментов пространства слишком много, это доставит много хлопот при выделении больших объектов.Часто в старости еще остается много места, но он не может найти достаточно большое непрерывное пространство для размещения текущего Объект должен инициировать полный сборщик мусора.
G1 — это сборщик мусора для серверных приложений. G1 имеет следующие особенности:
Параллелизм и параллелизм: G1 может в полной мере использовать аппаратные преимущества ЦП и многоядерной среды, а также использовать несколько ЦП (ЦП или ядро ЦП), чтобы сократить время паузы Stop-The-World. Некоторым другим сборщикам изначально необходимо приостановить действие GC, выполняемое потоком Java, но сборщик G1 все же может позволить программе Java продолжать выполнение параллельным образом.
Коллекция поколений: хотя G1 может независимо управлять всей кучей GC без сотрудничества с другими сборщиками, он по-прежнему сохраняет концепцию генерации. Он может обрабатывать вновь созданные объекты и старые объекты, которые сохранились некоторое время и пережили несколько GC, по-разному, чтобы получить лучшие результаты сбора.
Пространственная интеграция: В отличие от алгоритма «отметить-очистить» CMS, G1 является сборщиком, основанным на алгоритме «отметить-очистить» в целом; с локальной точки зрения, он основан на алгоритме «копирования».
Предсказуемая пауза: это еще одно большое преимущество G1 перед CMS.Сокращение времени паузы является общей задачей G1 и CMS, но в дополнение к достижению низкой паузы, G1 также может установить предсказуемую модель времени паузы, которая позволяет пользователям использовать или явно указанный в пределах временного среза длиной M миллисекунд,
Шаги операции G1:
1. Начальная маркировка 2. Параллельная маркировка 3. Окончательная маркировка 4. Отбор и переработка
String a = "abc" ; то же, что и String b = new String("abc" ); Зачем? Каковы их соответствующие области памяти?
Разные
постоянный пул
Относится к некоторым данным, определенным во время компиляции и сохраненным в скомпилированном файле байт-кода, включая константы в классах, методах, интерфейсах и т. д., хранящие строковые константы и константы базового типа (public static final).
куча
Он в основном сохраняет ссылки на базовые типы данных (или встроенные типы) (char, byte, short, int, long, float, double, boolean) и объекты.Данные можно использовать совместно, а скорость уступает только регистрам и быстрее чем кучи.
Поэтому они ложны, когда ==
Расскажите о процессе создания объекта JVM.
Символическая ссылка на класс, расположенный в пуле констант
↓
Проверьте, был ли загружен, разрешен и инициализирован класс, представленный символической ссылкой →
↓ ↓
Выделить память (после загрузки класса определяется потребность в памяти) ← Загрузить
↓
Выберите метод распределения в зависимости от того, является ли куча Java обычной (метод GC).
↙ ↘
список свободных от коллизий указателей
↓
Гарантии параллелизма при выделении памяти (атомарность обновлений указателя)
↙ ↘
CAS+сбой повторной попытки TLAB в разных пространствах в соответствии с разделением потоков -XX:+UseTLAB -XX:-UseTLAB
↓
Пространство памяти инициализируется значением 0, что гарантирует возможность использования поля экземпляра объекта без присвоения начального значения.
↓
Задайте информацию о заголовке объекта (заголовок объекта): указатель ссылки, метаданные, хэш-значение, возраст генерации GC, связанные с блокировкой
↓
выполнить объектный метод
Поговорим о разнице между байтом a = 127, байтом b = 127; a+=b и a = a+b соответственно.
a+=b будет отрицательным.
a=a+b сразу сообщит об ошибке.
Вызвано принудительным продвижением типа
Вы знакомы с mysql?Расскажите об уровне изоляции mysql и связанных с этим проблемах.
Читать незафиксированные
На этом уровне изоляции все транзакции могут видеть результаты выполнения других незафиксированных транзакций. Этот уровень изоляции редко используется в практических приложениях, потому что его производительность ненамного выше, чем у других уровней. Чтение незафиксированных данных также известно как грязное чтение.
Чтение зафиксировано
Это уровень изоляции по умолчанию для большинства систем баз данных (но не для MySQL по умолчанию). Он удовлетворяет простому определению изоляции: транзакция может видеть только изменения, сделанные зафиксированными транзакциями. Этот уровень изоляции также поддерживает так называемое неповторяемое чтение (Nonrepeatable Read), поскольку другие экземпляры одной и той же транзакции могут иметь новые фиксации во время обработки экземпляра, поэтому один и тот же выбор может возвращать разные результаты.
Повторяемое чтение
Это уровень изоляции транзакций MySQL по умолчанию, который гарантирует, что несколько экземпляров одной и той же транзакции будут видеть одни и те же строки данных при одновременном чтении данных. Теоретически, однако, это приводит к другой острой проблеме: фантомному чтению. Проще говоря, фантомное чтение означает, что когда пользователь читает диапазон строк данных, другая транзакция вставляет новую строку в строку диапазона. InnoDB и механизм хранения Falcon решают эту проблему с помощью механизма управления многоверсионным параллелизмом (MVCC, Multiversion Concurrency Control).
Сериализуемый (сериализуемый)
Это самый высокий уровень изоляции, и он решает проблему фантомного чтения, принудительно упорядочивая транзакции, чтобы они не конфликтовали друг с другом. Короче говоря, он добавляет общую блокировку на каждую прочитанную строку данных. На этом уровне может возникнуть множество тайм-аутов и конфликтов при блокировках. Эти четыре уровня изоляции реализуются разными типами блокировок, поэтому при чтении одних и тех же данных могут возникнуть проблемы. Например:
- Чистое чтение: транзакция обновила часть данных, а другая транзакция в это время читала ту же часть данных.По какой-то причине выполняется предыдущая операция RollBack, и данные, считанные последней транзакцией, будут неверными.
- Неповторяющееся чтение: данные несовместимы между двумя запросами транзакции, которые могут быть исходными данными, обновленными транзакцией, вставленной между двумя запросами.
- Фантомное чтение: число данных несовместимо в двух запросах транзакции. Например, одна транзакция запросила несколько столбцов данных (строки), а другая транзакция в это время вставила новые столбцы данных. В следующем запросе транзакции из , есть несколько столбцов данных, которые не запрашиваются. Если данные вставляются и вставляются другой транзакцией в это время, будет сообщено об ошибке.
Что такое MVCC и для чего он нужен?
MVCC (Mutil-Version Concurrency Control) — это многоверсионный контроль параллелизма. MVCC — это метод управления параллелизмом, который обычно используется в системах управления базами данных для реализации параллельного доступа к базе данных.
В движке Mysql InnoDB это относится к процессу, в котором транзакции с двумя уровнями изоляции фиксированного чтения (READ COMMITTD) и повторяющегося чтения (REPEATABLE READ) обращаются к записям в цепочке версий для операций SELECT.
Это позволяет другим транзакциям изменять эту запись, и каждое изменение в любом случае будет записано в цепочке версий. SELECT может обращаться к цепочке версий для получения записей, что реализует параллельное выполнение операций чтения-записи и записи-чтения и повышает производительность системы.
Как оптимизировать нашу базу данных?
Чтобы оптимизировать запросы, старайтесь избегать полного сканирования таблицы.Во-первых, вам следует подумать о создании индексов для столбцов, участвующих в том, где и упорядочить по.
Вы должны стараться избегать определения нулевого значения для полей в предложении where, иначе движок откажется от использования индекса и выполнит полное сканирование таблицы.
Вы должны стараться избегать использования оператора != или в предложении where, иначе движок откажется от использования индекса и выполнит полное сканирование таблицы.
Вы должны стараться избегать использования или в предложении where для подключения условий.Если поле имеет индекс, а поле не имеет индекса, это заставит движок отказаться от использования индекса и выполнить полное сканирование таблицы.
in и not in также следует использовать с осторожностью, иначе это приведет к полному сканированию таблицы.
например, нечеткое полное совпадение также приведет к полному сканированию таблицы
Расскажите о разнице между mybaits и hibernate.
Общая основа:
MyBaits и HiBernate используют фреймворки объектно-реляционного сопоставления ORM, и оба являются фреймворками данных уровня персистентности.
разница:
- HiBernate — это тяжеловесный фреймворк, а MyBaits — облегченный фреймворк.
- Инкапсуляция JDBC в HiBernate относительно глубокая, а его возможности для разработки SQL не очень высоки: ему нужно только управлять объектами с помощью операторов Hql для выполнения операций сохранения данных.
- MyBaits тоже инкапсуляция JDBC, но она не такая глубокая как Hibernate.Его операторы SQL все есть в конфигурации.Вы можете переписать SQL в конфигурации для достижения оптимизации данных,что более удобно реализовать.
- При работе с большими данными рекомендуется использовать MyBaits, что более удобно для оптимизации операторов SQL.
Отношения перехода в состояние гибернации.
Последний документ Hibernate определяет четыре состояния для объектов Hibernate (изначально они были тремя состояниями, и в основном во время интервью задавались вопросы о трех состояниях), а именно: переходное состояние (новое или временное), постоянное состояние (управляемое или постоянное), свободное состояние (отсоединено) и удаленное состояние (удалено, нет удаленного состояния в трех состояниях, определенных в предыдущей документации Hibernate), как показано на рисунке ниже, удаленное состояние в предыдущей документации Hibernate считается мгновенным состоянием.
-
Переходное состояние: когда создается новый объект объекта, объект находится в переходном состоянии, то есть объект представляет собой только область памяти, в которой хранятся временные данные. Если ни одна переменная не ссылается на этот объект, он будет утилизирован сборщиком мусора JVM. механизм.
Данные, сохраненные этим объектом, не имеют ничего общего с базой данных, если только объект переходного состояния не связан с базой данных с помощью методов сеанса save(), saveOrUpdate(), persist(), merge(), а данные вставляются или обновляются. в базу данных.Объект преобразуется в постоянный объект.
-
Постоянное состояние: Экземпляры объектов постоянного состояния имеют соответствующие записи в базе данных и имеют постоянный идентификатор (ID).
После выполнения операции удаления объекта постоянного состояния соответствующая запись в базе данных будет удалена, после чего объект постоянного состояния больше не имеет соответствующей связи с записью базы данных, а объект постоянного состояния становится удаленным состоянием (которое может быть удалено). рассматривать как переходное состояние).
После изменения постоянного объекта он не будет немедленно синхронизирован с базой данных, пока транзакция базы данных не будет зафиксирована.
-
Свободное состояние: когда сеанс выполняет close(), clear(), evict() или flush(), объект-сущность переходит из постоянного состояния в свободное состояние.Хотя объект имеет постоянное и согласованное идентификационное значение с соответствующей записью в базе данных, поскольку объект был удален из сеанса, объект не находится в управлении сохраняемостью, поэтому он находится в свободном состоянии (также называемом неконтролируемым состоянием).
Объект свободного состояния очень похож на объект временного состояния, за исключением того, что он также содержит постоянный идентификатор.
Расскажите о том, как Spring понимает, как IOC и АОП используются в проекте.
Spring — это фреймворк с открытым исходным кодом, управляющий слой в модели MVC, который может справиться с быстрыми изменениями требований. Основная причина в том, что он имеет преимущество Аспектно-ориентированного программирования (АОП). IOC), объекты, используемые в системе не все создаются при загрузке системы, но объекты этого класса создаются при вызове класса, тем самым улучшая производительность системы.
Благодаря этим двум замечательным свойствам многие J2EE-компании предпочитают Spring, например, в Alili он является наиболее часто используемой технологией, связанной со Spring.
Плюсы весны:
Связь между компонентами уменьшается, и реализуется разделение между различными уровнями программного обеспечения.
Доступны многочисленные легкодоступные службы, такие как управление транзакциями, службы обмена сообщениями, ведение журналов и т. д.
Контейнеры предоставляют технологию АОП, упрощающую реализацию таких функций, как перехват разрешений и мониторинг во время выполнения.
Технология AOP в Spring — это режим динамического прокси в режиме разработки.Вам нужно только реализовать интерфейс динамического прокси InvocationHandler, предоставляемый jdk, и все методы проксируемого объекта берет на себя InvocationHandler.Реальные задачи обработки.
В аспектно-ориентированном программировании вам также необходимо понимать такие понятия, как pointcut, аспекты, уведомления и переплетение.
Две реализации АОП, и скажите, какая из них более эффективна и почему.
Есть два способа: один — это динамический прокси-сервер JDK, а другой — способ CGLib.
Конкретный принцип реализации динамического прокси JDK:
Создайте свой собственный обработчик вызова, реализовав интерфейс InvocationHandlet;
Создайте динамический прокси, указав объект ClassLoader и набор интерфейсов для класса Proxy;
Конструктор динамического прокси-класса получается через механизм отражения, и его единственным типом параметра является тип интерфейса вызывающего процессора;
Создайте экземпляр динамического прокси-класса через конструктор и вызовите объект-процессор в качестве параметра во время построения;
Динамический прокси-сервер JDK – это интерфейсно-ориентированный режим прокси-сервера. Если целевой прокси-сервер не имеет интерфейса, то Spring ничего не может сделать. Spring создает новый анонимный класс реализации прокси-интерфейса с помощью механизма отражения Java и переписывает расширение АОП. метод.
Динамический прокси CGLib:
CGLib — это мощная и высокопроизводительная библиотека классов для создания кода, которая может динамически расширять классы Java во время выполнения. Spring наследует классы для динамического проксирования через CGlib во время выполнения, переписывает методы родительского класса и реализует аспектно-ориентированное программирование АОП.
Сравните два:
Динамические прокси JDK ориентированы на интерфейс.
Динамический прокси CGLib реализуется путем наследования прокси-класса в нижней части байт-кода (если прокси-класс модифицируется с помощью ключевого слова final, он не работает, извините).
представление:
Что касается производительности между ними, производительность прокси-объекта, созданного динамическим прокси-сервером JDK, не очень высока в предыдущей версии JDK.Хотя производительность динамического прокси-объекта JDK была значительно улучшена в старшей версии, но это также подходит не для всех сценариев.
В основном это отражается в следующих двух показателях:
Производительность динамического прокси-объекта, созданного CGLib, намного выше, чем у динамического прокси-сервера JDK в реальном времени выполнения: некоторые исследования показали, что она примерно в 10 раз выше;
Однако время, затрачиваемое CGLib на создание объектов, намного больше, чем у динамического прокси JDK.Некоторые исследования показали, что разрыв примерно в 8 раз;
Поэтому для одноэлементных прокси-объектов или прокси с пулами экземпляров лучше использовать динамический прокси CGLib, так как нет необходимости часто создавать прокси-объекты, в любом случае больше подходит динамический прокси JDK.
Скажем, какой-нибудь механизм распространения транзакций Spring.
Существует несколько видов общения:
public interface TransactionDefinition {
int PROPAGATION_REQUIRED = 0;
int PROPAGATION_SUPPORTS = 1;
int PROPAGATION_MANDATORY = 2;
int PROPAGATION_REQUIRES_NEW = 3;
int PROPAGATION_NOT_SUPPORTED = 4;
int PROPAGATION_NEVER = 5;
int PROPAGATION_NESTED = 6;
}
- PROPAGATION_REQUIRED: Если текущей транзакции нет, создайте новую транзакцию. Если транзакция уже существует, присоединитесь к ней. Это самый распространенный выбор.
- PROPAGATION_SUPPORTS: текущая транзакция поддерживается, и если текущей транзакции нет, она будет выполняться без транзакций.
- PROPAGATION_MANDATORY: использовать текущую транзакцию, создать исключение, если текущей транзакции нет.
- PROPAGATION_REQUIRES_NEW: создать новую транзакцию. Если есть текущая транзакция, приостановить текущую транзакцию.
- PROPAGATION_NOT_SUPPORTED: выполнение операции нетранзакционным способом и приостановка текущей транзакции, если текущая транзакция существует.
- PROPAGATION_NEVER: выполняется без транзакций, выдает исключение, если в данный момент есть транзакция.
- PROPAGATION_NESTED: если транзакция в настоящее время существует, выполняется во вложенной транзакции. Если текущих транзакций нет, сделайте что-то похожее на PROPAGATION_REQUIRED.
Обычно используются в основном Required, RequiresNew, Nested three.
- Требуется: простое понимание состоит в том, что метод транзакции будет определять, есть ли транзакция, если есть транзакция, он будет использовать существующую, а если нет, перезапустит ее.
- RequiresNew: простое понимание заключается в том, чтобы открыть новую транзакцию.Если есть текущая транзакция, приостановить текущую транзакцию. Вновь открытая транзакция не имеет ничего общего с предыдущей транзакцией.У нее есть собственная блокировка и уровень изоляции, и она может быть зафиксирована и откатана независимо.Во время выполнения внутренней транзакции внешняя транзакция приостанавливается.После внутренней транзакции выполняется, внешняя транзакция возобновляет выполнение.
- Вложенные: простое понимание вложенных транзакций.Если внешняя транзакция откатывается, вложенная транзакция также будет откатываться! ! ! Когда внешняя транзакция фиксируется, она будет зафиксирована при вложенности. Откат вложенной транзакции не влияет на внешнюю транзакцию. Подтранзакция — это вложенная транзакция транзакции верхнего уровня.Точка сохранения будет установлена до выполнения подтранзакции, и откат вложенной транзакции вернет к этой точке сохранения, что не вызовет отката родителя сделка.
Если вы хотите, чтобы транзакции выполнялись вместе, вы можете использовать Required для удовлетворения большинства сценариев.Если вы не хотите, чтобы результат выполненной подтранзакции влиял на фиксацию родительской транзакции, вы можете установить для подтранзакции значение RequiresNew .
Ты хочешь что-нибудь спросить у меня?
Есть ли у нас Jingdong\Baidu обычно такая деятельность, как обмен технологиями?
Вы можете быть уверены, что мы по очереди будем делиться различными технологическими стеками с разными коллегами.
Хорошо, тогда я в порядке, с нетерпением жду возможности поработать с вами.
Суммировать
Все вопросы - настоящие вопросы интервью, предоставленные фанатами. Я проверил все вопросы и обобщил ответы. На самом деле, вы можете видеть, что многие вопросы являются содержанием моих обычных статей, и я в основном следую идеям интервью, написанным.
Вопросы для собеседования очень простые. Как вы думаете, собеседование на JD.com на самом деле не сложное? Мы хорошо готовимся к тем, на которые можем войти случайно. Все они простые.
Обратите внимание, не потеряйтесь
Хорошо всем, это все содержание этой статьи. Я Ао Бин. Я вдохновлен стать блоггером, которого все запомнят. Люди, которые могут видеть здесь, всеталант.
Каждую неделю я буду обновлять несколько статей, связанных с интервью и общими технологическими стеками ведущих интернет-компаний, большое спасиботалантМы можем видеть здесь, если эта статья хорошо написана, я думаю, что «Ао Бин» ячто-тоеслиПожалуйста, лайкните 👍 Пожалуйста, следите за ❤️ поделитесь пожалуйста 👥Это правда для меняочень полезно! ! !
Проституция нехороша, творить нелегко,Ваша поддержка и признание — самая большая мотивация для моего творчества, увидимся в следующей статье!
Ао Бин | Текст [Оригинал]
Если в этом блоге есть какие-либо ошибки, пожалуйста, критикуйте и советуйте, это очень ценится!
Статья постоянно обновляется каждую неделю, вы можете искать в WeChat "Третий принц Ао Бин"Читать и запрашивать обновления в первый раз (на одну-две статьи раньше, чем в блоге), эту статьюGitHub github.com/JavaFamilyОн был включен, есть карта разума точек интервью заводов первого уровня, а также я организовал много своих документов. Добро пожаловать в Звезду и совершенствуйтесь. Каждый может обратиться в тестовый центр для ознакомления. Надеюсь мы можем иметь что-то вместе.