Как вы думаете, пока вы красивы, вы будете нравиться парням? Ты думаешь, что пока у тебя есть деньги и красивые девушки, ты будешь их постить сам? Как вы думаете, сможете ли вы получить хорошую работу, будучи ученым? Скажу вам, это правда!
Оригинальный адрес:Блог Woohoo.cn на.com/ABS free/afraid/5…
Спасибо блогеру за бескорыстный обмен
Каковы примитивные типы данных в Java, каковы их размеры и соответствующие классы инкапсуляции?
- байт——1 байт——байт
- короткий — 2 байта — короткий
- int——4 байта——целое число
- длинный — 8 байт — длинный
- float — 4 байта — float
- двойной — 8 байт — двойной
- char——2 байта—— Символ
- boolean
Логический тип данных может быть либо истинным, либо ложным.
Этот тип данных представляет 1 бит, но его размер точно не определен.
В «Спецификации виртуальной машины Java» говорится: «Хотя логический тип данных определен, он обеспечивает лишь очень ограниченную поддержку. В виртуальной машине Java нет инструкций байт-кода для логических значений. Язык Java Логическое значение, которым управляет выражение заменяется типом данных int в виртуальной машине Java после компиляции, а логический массив будет закодирован в байтовый массив виртуальной машины Java, и каждый элемент логического элемента занимает 8 бит». Таким образом, мы можем сделать вывод, что логический тип занимает 4 байта в одиночку и 1 байт в массиве.
Почему виртуальная машина использует int вместо boolean? Почему бы не использовать byte или short, разве это не более эффективно для памяти?
На самом деле причина использования int заключается в том, что для современных 32-битных ЦП более эффективно обмениваться данными по 32 бита за раз.
Подводя итог, мы можем знать: официальный документ не дает точного определения логического типа, а «Спецификация виртуальной машины Java» дает определение «использовать 4 байта, когда он один, и 1 байт, когда логический массив». зависит от того, соответствует ли реализация виртуальной машины спецификации, поэтому возможны 1 байт и 4 байта. На самом деле это компромисс между пространством и временем. Класс-оболочка для логического типа — Boolean.
Поговорите о разнице между "==" и "equals()".
«Думай на Java» говорит: «Операторы отношения выдают логический результат, они вычисляют отношения между значениями операндов». "==" оценивает, совпадают ли адреса памяти двух объектов, и применяется к примитивным типам данных и типам перечисления (их переменные хранят само значение, а переменные ссылочного типа хранят ссылки); equals относится к методу класса Object, реализация заключается в сравнении адресов памяти, мы можем переопределить этот метод, чтобы настроить концепцию «равенства». Например, такие классы, как String и Date в библиотеке классов, переписывают этот метод. Подводя итог, "==" следует использовать для сравнения на равенство между типом перечисления и примитивным типом данных; для сравнения на равенство ссылочного типа следует использовать метод equals.
Каковы четыре типа ссылок в Java и сценарии их применения?
- Сильная ссылка: обычно ссылка, возвращаемая при использовании оператора new для создания объекта, является строгой ссылкой.
- Мягкая ссылка: если к объекту можно получить доступ только через мягкую ссылку, объект будет переработан при недостатке памяти и может быть использован в кэше изображения. используется дольше.
- Слабая ссылка: если к объекту можно получить доступ только по слабой ссылке, он будет переработан (даже если памяти достаточно), а также может быть использован в кэше изображения.В это время, пока растровое изображение больше не используется, он будет переработан
- Виртуальная ссылка: Виртуальная ссылка является "самой слабой" ссылкой в Java. Вы даже не можете получить объект, на который указывает ссылка, через нее. Единственная функция ее существования состоит в том, что когда объект, на который она указывает, перерабатывается, он будет добавлен в очередь ссылок, чтобы мы могли знать, когда объект, на который он указывает, будет уничтожен.
Какие методы определены в объекте?
- clone()
- equals()
- hashCode()
- toString()
- notify()
- notifyAll()
- wait()
- finalize()
- getClass()
Какова роль hashCode?
Пожалуйста, обратитесь кОсновной принцип и реализация хеш-таблицы
В чем разница между ArrayList, LinkedList, Vector?
- ArrayList: внутренне использует массив для хранения элементов, поддерживает эффективный произвольный доступ и поддерживает динамическое изменение размера.
- LinkedList: внутренне использует связанный список для хранения элементов, поддерживает быструю вставку/удаление элементов, но не поддерживает эффективный произвольный доступ.
- Vector: можно рассматривать как потокобезопасную версию ArrayList.
В чем разница между String, StringBuilder, StringBuffer?
- Строка: неизменяемая последовательность символов, для добавления к ней новых символов необходимо создать новый объект String.
- StringBuilder: изменяемая последовательность символов, поддерживающая добавление к ней новых символов (без создания новых объектов).
- StringBuffer: можно рассматривать как потокобезопасную версию StringBuilder.
Особенности и использование Map, Set, List, Queue, Stack.
- Map
: все типы данных, которые хранят пары ключ-значение в Java, реализуют этот интерфейс, представляя «таблицу сопоставления». Поддерживаются две основные операции: get(Object key) и put(K key, V value), которые используются для получения значения, соответствующего ключу, и вставки пар ключ-значение в таблицу сопоставления соответственно. - Набор: тип набора, который реализует этот интерфейс, не допускает дублирования элементов, представляющих «набор» в математическом смысле. Он поддерживает следующие основные операции: add(E e), remove(Object o), contains(Object o), которые используются для добавления элементов, удаления элементов и определения, существует ли данный элемент в наборе, соответственно.
- Список: все типы списков в структуре коллекций в Java реализуют этот интерфейс, представляя упорядоченную последовательность. Поддержка get(int index), add(E e) и других операций.
- Очередь: интерфейс очереди в Java Collections Framework, представляющий очередь "первым пришел, первым вышел". Поддержка добавления (элемента E), удаления () и других операций.
- Стек: тип данных, представляющий стек в структуре коллекций Java.Стек представляет собой структуру данных "последний вошел, первый ушел". Поддержка push(E item), pop() и других операций.
Для получения более подробных инструкций обратитесь к официальной документации.Студенты, которые не знакомы с соответствующими структурами данных, могут обратиться к «Введение в алгоритмы» или другим связанным книгам.
Разница между HashMap и HashTable
- HashTable является потокобезопасным, а HashMap — нет.
- Нулевые ключи и нулевые значения разрешены в HashMap, но не в HashTable.
Принцип реализации HashMap
Проще говоря, базовая реализация HashMap — это «хеш-таблица на основе молнии». Подробный анализ см.Анализ исходного кода HashMap Анализ исходного кода Map
Принцип реализации ConcurrentHashMap
ConcurrentHashMap — это HashMap, поддерживающий параллельное чтение и запись, его особенность в том, что его не нужно блокировать при чтении данных, и он может обеспечить как можно меньшую степень детализации блокировки при записи данных. Из-за внутреннего использования «сегментного хранилища» блокируется только «сегмент», в котором находятся записываемые данные. Подробный анализ базовой реализации ConcurrentHashMap см.Параллельное программирование на Java: ConcurrentHashMap параллельных контейнеров
В чем разница между TreeMap, LinkedHashMap, HashMap?
- Базовая реализация HashMap представляет собой хеш-таблицу, поэтому элементы, хранящиеся в ней, неупорядочены;
- Базовая реализация TreeMap представляет собой красно-черное дерево, поэтому элементы внутри него упорядочены. Сортировка основана на естественном порядке или объекте Comparator, указанном при создании TreeMap.
- LinkedHashMap можно рассматривать как HashMap, который запоминает порядок вставки элементов.
В чем разница между Collectionи Collections?
- Коллекция — это основной интерфейс в структуре коллекций Java;
- Коллекции — это инструментальный класс, предоставляемый инфраструктурой коллекций Java, который содержит большое количество статических методов для управления коллекциями или их возврата.
Для «try-catch-finally», если блок try содержит оператор «return», будет ли выполняться блок finally?
будет выполнять. Есть только два случая, когда операторы в блоке finally не будут выполняться: **
- Вызывается метод System.exit();
- JVM "упал".
Иерархия исключений в Java
Иерархия исключений в Java показана на следующей диаграмме:
Мы видим, что класс Throwable является базовым классом в иерархии исключений.
Класс Error представляет внутренние ошибки, которые находятся вне нашего контроля, Exception представляет собой исключения, а RuntimeException и его подклассы являются непроверенными исключениями.Такие исключения включают ArrayIndexOutOfBoundsException, NullPointerException и т. д. IOException и его подклассы являются проверенными исключениями, компилятор проверит, предоставили ли мы обработчики исключений для всех проверенных исключений, которые могут быть выброшены, и сообщит об ошибке, если нет. Для непроверенных исключений нам не нужно их ловить (конечно, Java позволяет нам их перехватывать, но что мы должны сделать, чтобы избежать непроверенных исключений).
Три особенности и значения объектно-ориентированной Java
Три основные характеристики: инкапсуляция, наследование, полиморфизм. Для получения подробной информации, пожалуйста, нажмителогика компьютерной программы
Значение и отличие Override, Overload
- Override означает «переопределение», то есть переопределение того же метода в родительском классе подклассом.
- Перегрузка означает «перегрузку», то есть определение нового метода с тем же именем, что и у уже определенного метода, но с другой сигнатурой**.
Разница между интерфейсом и абстрактным классом
- Интерфейс — это соглашение, и классы, реализующие интерфейс, должны следовать этому соглашению;
- Абстрактный класс — это, по сути, класс, и стоимость использования абстрактного класса выше, чем стоимость интерфейса.
- Интерфейс сравнивается с абстрактным классом следующим образом:
- Абстрактный класс может содержать свойства, методы (включая абстрактные методы и методы с конкретной реализацией) и константы; интерфейс может содержать только константы и объявления методов.
- Методы и переменные-члены в абстрактных классах могут определять видимость (например, общедоступную, приватную и т. д.), в то время как методы в интерфейсах могут быть только общедоступными (по умолчанию общедоступными).
- Подкласс может иметь только один родительский класс (конкретный класс или абстрактный класс); интерфейс может наследовать один или несколько интерфейсов, а класс также может реализовывать несколько интерфейсов.
- Когда подкласс реализует абстрактный метод в суперклассе, видимость может быть больше или равна видимости в суперклассе; в то время как видимость метода интерфейса в классе реализации интерфейса может быть только такой же, как в интерфейсе (общедоступном). .
Разница между статическим внутренним классом и нестатическим внутренним классом
Статический внутренний класс не содержит ссылку на охватывающий класс, а нестатический внутренний класс неявно содержит ссылку на охватывающий класс.
Как реализовать полиморфизм в Java
Так называемый полиморфизм относится к ссылке родительского класса на объект дочернего класса, и при вызове метода вместо реализации родительского класса вызывается реализация дочернего класса. Ключом к реализации полиморфизма является «динамическое связывание». Для получения подробной информации, пожалуйста, нажмитеВнутренний механизм реализации динамического связывания Java
Кратко опишите два метода создания нового потока в Java.
- Наследуйте класс Thread (при условии, что подклассом является MyThread), переопределите метод run(), затем создайте новый объект MyThread и вызовите для него start(), чтобы запустить новый поток.
- Реализуйте интерфейс Runnable (при условии, что классом реализации является MyRunnable), затем передайте объект MyRunnable в качестве параметра конструктору Thread и вызовите метод start() для полученного объекта Thread.
Кратко опишите метод синхронизации потоков в Java
- volatile: модель памяти Java гарантирует, что запись в одну и ту же изменчивую переменную происходит до ее чтения;
- Синхронизированный: вы можете заблокировать блок кода или метод. «Заблокированное» место называется критическим разделом. Поток, входящий в критическую секцию, получит монитор объекта, так что другие потоки, пытающиеся войти в критическую секцию, не смогут to Заблокировано при получении монитора. Поток, заблокированный в ожидании освобождения монитора другим потоком, не может быть прерван.
- ReentrantLock: поток, пытающийся получить блокировку, может быть прерван, и может быть установлен параметр тайм-аута.
Кратко опишите степень детализации блокировок в Java.
Классы, объекты, методы или блоки кода могут быть заблокированы в Java.
Дайте решение проблемы «производитель-потребитель».
Использовать очередь блокировки:
public class BlockingQueueTest {
private int size = 20;
private ArrayBlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<>(size);
public static void main(String[] args) {
BlockingQueueTest test = new BlockingQueueTest();
Producer producer = test.new Producer();
Consumer consumer = test.new Consumer();
producer.start(); consumer.start();
}
class Consumer extends Thread{
@Override
public void run() {
while(true){
try {
//从阻塞队列中取出一个元素
queue.take();
System.out.println("队列剩余" + queue.size() + "个元素");
} catch (InterruptedException e) {
}
}
}
}
class Producer extends Thread{
@Override
public void run() {
while (true) {
try {
//向阻塞队列中插入一个元素
queue.put(1);
System.out.println("队列剩余空间:" + (size - queue.size()));
} catch (InterruptedException e) {
}
}
}
}
}
Концепция дизайна и функция ThreadLocal
Роль ThreadLocal заключается в предоставлении локальных переменных в потоке, что может гарантировать независимость переменных ThreadLocal в каждом потоке при доступе к ним в многопоточной среде. Другими словами, переменная ThreadLocal каждого потока посвящена самой себе и не может быть доступна другим потокам. ThreadLocal чаще всего используется в следующем сценарии: есть параллельный доступ к не потокобезопасному объекту в многопоточной среде, и объект не нужно разделять между потоками, но мы не хотим блокировать, тогда мы можем использовать ThreadLocal, чтобы удерживать каждый поток. Существует копия этого объекта.
Общая архитектура параллельного пакета
Роль ArrayBlockingQueue, класс CountDownLatch
- CountDownLatch: позволяет набору потоков ждать, пока счетчик не достигнет 0. Применимые сценарии: когда одному или нескольким потокам необходимо дождаться определенного количества событий, прежде чем продолжить выполнение.
- ArrayBlockingQueue: очередь блокировки на основе массива, для создания которой требуется указанная емкость. Текущий поток блокируется при попытке добавить элементы в полную очередь или удалить элементы из пустой очереди. С блокирующими очередями мы можем работать по следующей схеме: рабочие потоки могут периодически помещать промежуточные результаты в блокирующую очередь, а другие потоки могут получать промежуточные результаты и выполнять дальнейшие операции. Если рабочий поток выполняется медленно (не успел вставить элемент в очередь), другие потоки, берущие элементы из очереди, будут ждать его (пытаясь взять элемент из пустой очереди и блокируясь); если рабочий поток выполняется быстрее (попытка вставить элемент в полную очередь), он будет ждать, пока другой поток извлечет элемент, прежде чем продолжить.
Разница между ожиданием() и сном()
- wait(): метод экземпляра, определенный в классе Object. Вызов метода ожидания для указанного объекта приведет к тому, что текущий поток перейдет в состояние ожидания (при условии, что текущий поток удерживает монитор объекта), в это время текущий поток освободит монитор соответствующего объекта, так что другие потоки имеют возможность получить монитор объекта. Когда другие потоки получают монитор этого объекта и выполняют необходимые операции, они могут вызвать метод уведомления, чтобы разбудить поток, который ранее находился в состоянии ожидания.
- sleep(): статический метод в классе Thread, который используется для перевода текущего потока в спящий режим, чтобы другие потоки могли выполняться. Поток, который переходит в спящий режим, не освобождает удерживаемые им блокировки.
Использование пула потоков и преимущества
- Преимущества: реализуйте повторное использование потоков, избегая накладных расходов на многократное создание и уничтожение потоков; использование пула потоков для унифицированного управления потоками может уменьшить количество параллельных потоков, и слишком много потоков часто тратится впустую на переключение контекста потока и синхронизацию потоков. время.
- Использование: мы можем вызвать конструктор ThreadPoolExecutor, чтобы создать пул потоков самостоятельно. Но обычно мы можем использовать статический фабричный метод, предоставляемый классом Executors, для более удобного создания объекта пула потоков. После создания объекта пула потоков мы можем вызвать метод submit, чтобы отправить задачу в пул потоков для выполнения; после того, как пул потоков используется, мы должны не забыть вызвать метод shutdown, чтобы закрыть его.
Сравнение эффективности между циклом for-each и обычным циклом for
Что касается этого вопроса, давайте посмотрим непосредственно на ответ, который дает нам «Эффективная Java»:
for-each делает код чище и снижает вероятность ошибок. Следующий идиоматический код работает как для коллекций, так и для массивов:
for (Element e : elements) {
doSomething(e);
}
Использование цикла for-each не снижает производительность по сравнению с обычным циклом for, даже при переборе массива. Фактически, в некоторых случаях это также может привести к небольшому повышению производительности, поскольку верхняя граница индекса массива вычисляется только один раз.
Кратко опишите разницу между Java IO и NIO
- Java IO ориентирован на поток, что означает, что нам нужно читать один или несколько байтов из потока за раз, пока не будут прочитаны все байты; NIO ориентирован на буфер, что означает, что данные будут считаны в буфер, а затем соответствующим образом обрабатывать данные в буфере.
- Java IO блокирует ввод-вывод, а NIO — неблокирующий ввод-вывод.
- В Java NIO есть нечто, называемое селектором, которое позволяет вам зарегистрировать несколько каналов с помощью селектора, а затем использовать поток для мониторинга этих каналов: если один из этих каналов готов, можно запустить операцию чтения или записи, а затем соответствующий канал считывается и записывается. Ожидая, пока канал станет доступен для чтения/записи, потоки, запрашивающие операции чтения и записи в канале, могут выполнять другие действия.
Роль и принцип отражения
В двух словах, роль отражения заключается в получении различной информации об определении класса во время выполнения, например, о том, какие свойства и методы определены. Принцип заключается в получении различной информации о нем через объект класса класса.
Механизм дженериков в Java
Для подробного ознакомления с общим механизмом, пожалуйста, нажмите прямоОбщие сведения о ключевых технологических аспектах Java
Что нового в Java 7 и Java 8
Вот два очень хороших резюме:Что нового в Java 7 Что нового в Java 8
Общие шаблоны проектирования
Так называемые «шаблоны проектирования» — это лишь некоторые из часто используемых методов проектирования программного обеспечения в объектно-ориентированном программировании, и после практических испытаний эти методы проектирования могут решить некоторые потребности в соответствующих сценариях, поэтому они стали широко популярной моделью «шаблонов проектирования». ". То есть соответствующий шаблон проектирования родился из-за каких-то острых проблем в некоторых сценариях. С этим ясно, когда мы изучаем шаблон проектирования, нам необходимо полностью понять предысторию его появления и основное противоречие, которое он решает.
Обычно используемые шаблоны проектирования можно разделить на следующие три категории:
- Режим создания: включая фабричный режим (который можно разделить на простой фабричный режим, режим фабричного метода, абстрактный фабричный режим), режим построителя, одноэлементный режим.
- Структурный шаблон: включая шаблон адаптера, шаблон моста, шаблон украшения, шаблон внешнего вида, шаблон легковеса, шаблон прокси.
- Поведенческие паттерны: включая паттерн команды, паттерн посредника, паттерн наблюдателя, паттерн состояния и паттерн стратегии. Подробное описание каждого режима см.Шаблон дизайна иллюстрации
Определение, сценарии применения и принципы работы динамических агентов
ВидетьДесять минут, чтобы понять динамический прокси-сервер Java
Основная концепция и использование аннотаций
Аннотации можно рассматривать как «расширенные аннотации», которые могут что-то объяснить компилятору и виртуальной машине. Аннотации — это код, описывающий код Java, который может анализироваться компилятором, а инструменты обработки аннотаций также могут анализировать аннотации во время выполнения. Сама аннотация является «пассивной» информацией, и она имеет смысл только в том случае, если она активно анализируется. Помимо передачи информации в компилятор/виртуальную машину, мы также можем использовать аннотации для создания некоего «шаблонного» кода.
рекомендуемая статья
- Java для создания серии блокчейнов
- Серия анализов исходного кода Spring Security
- Серия Spring Data Jpa
🙂 🙂 🙂 Подписывайтесь на апплет WeChatкурс Java-архитектораСкучно по дороге на работу и обратно? Вы все еще читаете романы и новости? Не знаете, как улучшить свои навыки? Да ладно, вот нужные вам статьи по архитектуре Java, инженеры Java читают 1.5w+, чего вы ждете?