предисловие
Несколько дней назад я искал в бескрайнем океане Интернета и собрал 800 классических базовых вопросов для собеседования по Java. Несколько друзей побеседовали со мной в частном чате, чтобы получить ответы. Поэтому я чувствую, что вопросы интервью без ответов бездушны, поэтому сегодня я разберу первые 80 ответов основ~
Все вопросы интервью по Java были загружены на github, а также загружены некоторые ответы~
Общественный номер: маленький мальчик собирает улиток
Основы Java
1. Разница между равными и ==
- Если это базовый тип, == означает судить, равны ли их значения;
- Если это ссылочный объект, == означает, что адреса памяти, на которые указывают два объекта, одинаковы.
equals
- Если это строка, это означает, что нужно судить, совпадает ли содержимое строки;
- Если это метод объектного объекта, сравнение также является значением адреса памяти, на которое делается ссылка;
- Если ваш собственный класс переопределяет метод equals, вы можете указать, равны ли два объекта.
2. Разница между final, finalize, finalize
- final используется для изменения свойств, методов и классов, соответственно указывая, что свойства не могут быть переназначены, методы не могут быть переопределены, а классы не могут быть унаследованы.
- Наконец, это часть структуры оператора обработки исключений, которая обычно выглядит как try-catch-finally, а блок кода finally всегда выполняется.
- finalize — это метод класса Object. Этот метод обычно вызывается сборщиком мусора. Когда мы вызываем метод System.gc(), сборщик мусора вызывает метод finalize() для сбора мусора. JVM не гарантирует, что этот метод всегда будет использоваться.
3. Разница между перегрузкой и перезаписью
- Переопределение должно быть унаследовано, а перегрузка — нет.
- Перегрузка означает, что в одном классе может быть несколько методов с одинаковым именем, но списки параметров этих методов разные (то есть количество или типы параметров разные)
- Переопределение означает, что метод в подклассе имеет то же имя и параметры, что и метод в родительском классе.Когда этот метод вызывается через объект экземпляра подкласса, будет вызываться определенный метод в подклассе, что эквивалентно помещению метода В родительском классе точно такой же определенный метод переопределяется, что является проявлением полиморфизма объектно-ориентированного программирования.
- Модификатор переопределенного метода больше или равен методу родительского класса, то есть полномочия доступа могут быть только больше, чем у родительского класса, и не могут быть меньше, а перегрузка никак не связана с модификатором .
- В переопределенном методе вы можете генерировать меньше исключений, чем родительский класс, или генерировать дочернее исключение исключения, генерируемого родительским классом, потому что вы не можете обмануть, ха-ха~
4. Если hashCode() двух объектов один и тот же, равно ли() также верно?
Если два объекта равны, их хэш-коды должны быть равны.Если hashCode() двух объектов одинаков, equals() не обязательно истинен.
Генеральный контракт для hashCode:
- Несколько вызовов метода hashCode для одного и того же объекта должны постоянно возвращать одно и то же целое число во время выполнения приложения Java при условии, что информация, используемая для сравнения объектов на предмет равенства, не была изменена. Это целое число не обязательно должно быть постоянным от одного выполнения приложения к другому выполнению того же приложения.
- Если equals() двух объектов равны, то вызов метода hashCode для каждого из двух объектов должен давать одинаковый целочисленный результат.
- Если equals() двух объектов не равны, то вызов метода hashCode для любого из двух объектов не обязательно приводит к разным целочисленным результатам. Однако создание разных целочисленных результатов для неравных объектов может повысить производительность хэш-таблицы.
5. В чем разница между абстрактным классом и интерфейсом
- Абстрактные классы наследуются подклассами, а интерфейсы реализуются подклассами.
- Абстрактные классы могут иметь конструкторы, интерфейсы не могут иметь конструкторов.
- Абстрактный класс может иметь обычные переменные-члены, но в интерфейсе нет обычных переменных-членов, его переменные могут быть только общедоступными статическими константами.
- Класс может реализовывать несколько интерфейсов, но может наследовать только один родительский класс, который может быть абстрактным классом.
- Интерфейс можно использовать только для объявления метода, а абстрактный класс можно использовать для объявления и реализации метода.
- Уровень абстракции (от высшего к низшему): интерфейс > абстрактный класс > класс реализации.
- Абстрактные классы в основном используются для абстрагирования категорий, а интерфейсы в основном используются для абстрагирования методов и функций.
- Ключевое слово абстрактного класса — абстрактное, а ключевое слово интерфейса — интерфейс.
6. В чем разница между BIO, NIO и AIO?
Этот ответ взят из Интернета, я лично думаю, что это лучшее понимание~
- BIO: поток инициирует запрос ввода-вывода, независимо от того, готово ли ядро к операции ввода-вывода, с момента инициирования запроса поток блокируется до завершения операции.
- NIO: поток инициирует запрос ввода-вывода и немедленно возвращается; после того, как ядро готово к операции ввода-вывода, оно уведомляет поток о выполнении операции ввода-вывода, вызывая зарегистрированную функцию обратного вызова, и поток начинает блокироваться до завершения операции.
- AIO: поток инициирует запрос ввода-вывода и немедленно возвращается; после того, как память готова для операции ввода-вывода, операция ввода-вывода выполняется до тех пор, пока операция не будет завершена или не завершится сбоем, и поток уведомляется путем вызова зарегистрированной функции обратного вызова о том, что операция ввода-вывода завершено или не выполнено.
БИО - это соединение нить. , NIO — это один поток на запрос. , AIO — допустимый запрос к потоку.
- БИО: синхронизация и блокировка, режим реализации сервера - одно соединение и один поток, то есть когда у клиента есть запрос на соединение, серверу нужно запустить поток для обработки.Если соединение ничего не делает, это вызовет ненужные накладные расходы на поток.Улучшен механизм пула потоков.
- NIO: синхронный неблокирующий, режим реализации сервера — один запрос на поток, то есть запрос на соединение, отправленный клиентом, будет зарегистрирован на мультиплексоре, и мультиплексор запустит только один при опросе для соединения с вводом-выводом. запрос.поток для обработки.
- AIO: асинхронный и неблокирующий режим реализации сервера — один допустимый запрос для одного потока, и клиентский запрос ввода-вывода сначала выполняется ОС, а затем уведомляет серверное приложение о запуске потока для обработки.
7. Разница между String, Stringbuffer, StringBuilder
Нить:
- Класс String является неизменяемым классом, после создания его нельзя изменить.
- String является окончательным классом и не может быть унаследован
- Строка реализует метод equals() и метод hashCode().
Строковый буфер:
- Унаследованный от AbstractStringBuilder, это изменяемый класс.
- StringBuffer является потокобезопасным
- Данные могут создаваться динамически с помощью метода append.
StringBuilder:
- Унаследованный от AbstractStringBuilder, это изменяемый класс.
- StringBuilder нелинейно безопасен.
- Эффективность выполнения выше, чем у StringBuffer.
8. Какие основные типы данных существуют в JAVA и сколько байтов они занимают?
| базовый тип | количество цифр | байт |
|---|---|---|
| int | 32 | 4 |
| short | 16 | 2 |
| long | 64 | 8 |
| byte | 8 | 1 |
| char | 16 | 2 |
| float | 32 | 4 |
| double | 64 | 8 |
| boolean | ? | ? |
Для boolean официальная документация четко не определена, это зависит от конкретной реализации поставщика JVM. Логически понятно, что он занимает 1 бит, но на практике будет считаться КПД памяти компьютера
Заинтересованные друзья, вы можете пойти посмотретьОфициальный сайт
9. В чем разница между Comparator и Comparable?
Я видел ответ на этот вопрос на Niuke.com, и я думаю, что он написан лучше всего~
Ссылка на сайт:woohoo.now coder.com/question T пока…Источник: Niuke.com
- Comparable и Comparator используются для сравнения и сортировки элементов в коллекции, но Comparable — это сортировка, реализованная методом, определенным внутри коллекции, а Comparator — это сортировка, реализованная вне коллекции, поэтому, если вы хотите добиться сортировки, вам нужно реализовать сортировку в коллекции Определите метод интерфейса Comparator снаружи или реализуйте метод интерфейса Comparable внутри коллекции.
- Компаратор находится в пакете java.util, а Comparable — в пакете java.lang.
- Comparable — это интерфейс, который сам объект уже поддерживает для самосравнения (например, String и Integer могут самостоятельно выполнять операцию сравнения размеров и реализовали интерфейс Comparable). Пользовательский класс должен иметь возможность сортировки после добавления в контейнер списка, который может быть реализован в интерфейсе Comparable, при сортировке методом sort класса Collections, если Comparator не указан, он будет отсортирован в естественном порядке.Естественный порядок здесь заключается в реализации метода сортировки, заданного Сопоставимый интерфейс.
- А Comparator — это специальный компаратор.Когда объект не поддерживает самосравнение или функция самосравнения не может удовлетворить ваши требования, вы можете написать компаратор для завершения сравнения размеров между двумя объектами.
- Можно сказать, что один должен завершить сравнение сам по себе, а другой - разница между внешней программой для достижения сравнения. Использование Comparator — это шаблон разработки стратегии, то есть вместо изменения самого объекта используется объект стратегии для изменения его поведения. Например: если вы хотите отсортировать целые числа по размеру абсолютного значения, Integer не соответствует требованиям, вам не нужно изменять класс Integer (на самом деле вы не можете этого сделать), чтобы изменить его поведение при сортировке, просто используйте интерфейс, который реализует интерфейс Comparator. Объект для управления его порядком в строке.
10. Можно ли наследовать класс String и почему?
Во-первых, String — это финальный модифицированный класс, а финальные модифицированные классы не могут быть унаследованы.
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
Почему нельзя наследовать класс String?
Есть две причины:
- Эффективность, класс String, как один из наиболее часто используемых классов, запрещено наследовать и переопределять, что может повысить эффективность.
- В целях безопасности в классе String имеется множество низкоуровневых нативных методов, которые вызывают API операционной системы. Если метод можно переопределить, может быть внедрен вредоносный код для уничтожения программы.
11. Расскажите о принципе реализации полиморфизма в Java
- Механизмы полиморфизма включают статический полиморфизм (полиморфизм времени компиляции) и динамический полиморфизм (полиморфизм времени выполнения).
- Статический полиморфизм, такой как перегрузка, динамический полиморфизм обычно означает, что вызываемый метод может быть определен только во время выполнения.
- То, что мы обычно называем полиморфизмом, обычно относится к полиморфизму времени выполнения, то есть не определяется, какой конкретный метод вызывать во время компиляции, и это не может быть определено до времени выполнения.
- Реализация полиморфизма: подклассы наследуют родительский класс (расширяет), а класс реализует интерфейс (реализует)
- Суть полиморфизма заключается в переписывании метода родительского класса или реализации метода интерфейса для достижения различных эффектов выполнения во время выполнения.
- Вызов методов объекта в Java реализуется путем использования таблицы методов в информации о классе.Общая идея вызова ссылки на метод объекта и вызова ссылки на метод интерфейса одинакова. Когда вызывается метод объекта, JVM просматривает таблицу методов класса объекта, чтобы определить прямой адрес ссылки на метод, и вызывает метод только после получения адреса.
Например, предположим, что есть родительский класс Fruit, метод вкуса и два подкласса Apple и Pear, как показано ниже:
abstract class Fruit {
abstract String taste() ;
}
class Apple extends Fruit {
@Override
String taste() {
return "酸酸的";
}
}
class Pear extends Fruit {
@Override
String taste() {
return "甜甜的";
}
}
public class Test {
public static void main(String[] args) {
Fruit f = new Apple();
System.out.println(f.taste());
}
}
Когда программа работает, когда вызывается метод вкуса объекта Fruit f, JVM просматривает таблицу методов класса объектов Fruit, чтобы определить адрес прямой ссылки метода вкуса, независимо от того, исходит ли он от Apple или Pear, и только после определения он действительно вызывает метод вкуса соответствующего подкласса.
12. Java Generics и стирание типов
Для этого вопроса интервью вы можете прочитать мою статью~
Основные Java-программисты: общий анализ
13. В чем разница между int и Integer и реализация целочисленного кеша
Давайте рассмотрим 3 точки знаний здесь:
- int — это базовый тип данных, а int — это класс-оболочка для int.
- Значение по умолчанию для int равно 0, а значение по умолчанию для interger равно null, а использование Interger требует нулевой обработки.
- Механизм кэширования Integer: для экономии памяти и повышения производительности класс Integer реализует внутреннее кэширование и повторное использование, используя одну и ту же ссылку на объект.Класс Integer по умолчанию имеет значение от -128 до 127, которое можно изменить с помощью -XX:AutoBoxCacheMax, и этот механизм полезен только при автоупаковке, а не при использовании конструкторов для создания объектов Integer.
Взгляните на пример кеша Integer, чтобы углубить впечатление:
Integer a = 10;
Integer b = 10;
Integer c = 129;
Integer d = 129;
System.out.println(a == b);
System.out.println(c == d);
输出结果:
true
false
14. Расскажите об использовании и реализации принципа отражения и о трех методах получения отражения в Java.
Этот вопрос для интервью см. в моей статье:Разговор об отражении Java: от входа к практике, к принципу
Java получает отражениетри метода:
- Во-первых, используйте статический метод Class.forName.
- Во-вторых, используйте метод .class класса
- В-третьих, используйте метод getClass() экземпляра объекта.
15. Объектно-ориентированные функции
Три характеристики объектно-ориентированного:
- упаковка
- наследовать
- полиморфизм
16. Разница между & и &&
- Побитовое И, a&b означает преобразование a и b в двоичные числа, а затем выполнение операции И;
- & и && оба являются логическими операторами, а && также называется оператором короткого замыкания.
- Логические И, a&& b, a&b означают, что результат истинен тогда и только тогда, когда оба операнда истинны, и ложны в противном случае.
- Разница между логическим И и короткозамкнутым И огромна, хотя оба требуют, чтобы булевы значения на левом и правом концах оператора были истинными, и значение всего выражения было истинным. Однако причина, по которой && называется операцией короткого замыкания, заключается в том, что если значение выражения слева от && ложно, выражение справа будет напрямую сокращено и не будет оцениваться.
17. Что такое потоки ввода-вывода в Java?
- В Java существует два вида потоков: один — поток байтов, а другой — поток символов.
- Потоки ввода-вывода представлены четырьмя абстрактными классами (два входа и два выхода): InputStream, OutputStream, Reader, Writer.
18. Расскажите о порядке создания экземпляров классов, таких как статические данные родительского класса, конструктор, статические данные подкласса, конструктор.
Просто посмотрите на пример:
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();
}
}
результат операции:
父类静态块
子类静态代码块
父类非静态代码块
父类构造器
子类非静态代码块
子类构造器
так,Порядок создания экземпляров класса следующий:Блок статического кода/статический домен родительского класса -> блок статического кода/статический домен дочернего класса -> блок нестатического кода родительского класса -> конструктор родительского класса -> блок нестатического кода дочернего класса -> конструктор дочернего класса
19. В Java есть несколько способов создания объектов
В Java есть 5 способов создания объектов
- Объекты создаются с помощью оператора new.
- Используя отражение, используйте Class.newInstance() для создания объекта/вызова конструктора объекта класса - Constructor
- Вызовите метод clone() объекта.
- Используя метод десериализации, вызовите метод readObject() объекта java.io.ObjectInputStream.
- Использовать небезопасно
20. Как преобразовать строку в кодировке GB2312 в строку в кодировке ISO-8859-1?
public class Test {
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "捡田螺的小男孩";
String strIso = new String(str.getBytes("GB2312"), "ISO-8859-1");
System.out.println(strIso);
}
}
21. Что такое поток демона? Как реализовать поток демона
- Поток демона — это особый тип процесса, который работает в фоновом режиме.
- Он не зависит от управляющего терминала и периодически выполняет какую-либо задачу или ожидает наступления какого-либо события.
- В Java потоки сборки мусора — это специальные потоки демона.
22. В чем разница между notify() и notifyAll()?
- notify должен разбудить поток в ожидании объекта, а notifyAll — разбудить все потоки в ожидании объекта.
- Однако пробуждение не означает, что его можно выполнить, ему нужно получить объект блокировки, чтобы иметь право продолжать выполнение, а блокировка только одна, поэтому несколько потоков должны бороться за блокировку при их пробуждении. .
23. Как язык Java обрабатывает исключения и как использовать ключевые слова throws, throw, try, catch и finally?
Для этого вопроса интервью, вы можете прочитать мою статью:Обязательным для Java-программистов: десять ключевых точек знаний об исключениях
24. Расскажите об иерархии исключений Java.
Жил-был старик по имениThrowable, он родил двух сыновей, старшего сына назвалиError, второго сына зовутException.
Error
Указывает на ошибки времени компиляции или системные ошибки, такие как ошибки, связанные с виртуальной машиной, OutOfMemoryError и т. д., ошибки не могут быть обработаны.
Exception
Исключение кода, базовый тип, о котором заботятся программисты Java, обычно является Exception. Она может быть обработана самой программой, в чем разница между ней и ошибкой.
Его можно разделить на RuntimeException (исключение времени выполнения) и CheckedException (проверяемое исключение).
Общие исключения RuntimeException:
- NullPointerException 空指针异常
- ArithmeticException 出现异常的运算条件时,抛出此异常
- IndexOutOfBoundsException 数组索引越界异常
- ClassNotFoundException 找不到类异常
- IllegalArgumentException(非法参数异常)
Исключения общих проверенных исключений:
- IOException (操作输入流和输出流时可能出现的异常)
- ClassCastException(类型转换异常类)
- Checked Exception — это исключение, которое компилятор требует от вас обработки.
- Напротив, Unchecked Exceptions, которые относятся к исключениям, которые компилятор не требует принудительной обработки, включают Error и RuntimeException и их подклассы.
25. В чем разница между статическим внутренним классом и нестатическим внутренним классом
Для этого вопроса интервью, вы можете прочитать мою статью:Основные Java-программисты: разрешение внутреннего класса
- Статические внутренние классы могут иметь статические члены (методы, свойства), тогда как нестатические внутренние классы не могут иметь статические члены (методы, свойства).
- Статический внутренний класс может получить доступ только к статическим членам и статическим методам внешнего класса, в то время как нестатический внутренний класс может получить доступ ко всем членам (методам, свойствам) внешнего класса.
- Статический внутренний класс создается иначе, чем нестатический внутренний класс.
- Вызвать метод или статическую переменную внутреннего статического класса, который можно вызвать непосредственно по имени класса
26. В чем разница между String s и new String
String str ="whx";
String newStr =new String ("whx");
String str ="whx"
Сначала найдите объект "whx" в пуле констант. Если он есть, пусть str указывает на этот "whx". Если нет, создайте новый объект "whx" в пуле констант, и пусть str указывает на новый объект в константном пуле объект "whx".
String newStr =new String ("whx");
Это объект "whx", созданный в куче, а адрес памяти объекта "whx" в куче создается в стеке.
как показано на рисунке:
Эта статья в Интернете очень хороша:Разница между строкой и новой строкой()
27. В отражении разница между 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 имеет параметры для управления инициализацией класса.
28. Разница между динамическим прокси JDK и реализацией cglib
- Динамический прокси-сервер Java использует механизм отражения для создания анонимного класса, реализующего интерфейс прокси-сервера, и вызывает InvokeHandler для его обработки перед вызовом определенного метода.
- Динамический прокси-сервер cglib использует пакет с открытым исходным кодом asm, загружает файл класса класса прокси-объекта и генерирует подклассы, изменяя его байт-код.
- Динамические прокси JDK могут генерировать прокси только для классов, реализующих интерфейсы, но не для классов.
- cglib — это прокси для классов, в основном для создания подкласса для указанного класса и переопределения методов. Поскольку это наследование, лучше не объявлять класс или метод как final
Эта статья в Интернете хорошо написана,Описать несколько реализаций динамических агентов Java и указать их соответствующие преимущества и недостатки.
29. Разница между ошибкой и исключением, CheckedException, разница RuntimeException.
Error:Указывает на ошибки времени компиляции или системные ошибки, такие как ошибки, связанные с виртуальной машиной, OutOfMemoryError и т. д., ошибки не могут быть обработаны.
Exception:Исключение кода, базовый тип, о котором заботятся программисты Java, обычно является Exception. Она может быть обработана самой программой, в чем разница между ней и ошибкой.
Его можно разделить на RuntimeException (исключение времени выполнения) и CheckedException (проверяемое исключение). Общие исключения RuntimeException:
- NullPointerException 空指针异常
- ArithmeticException 出现异常的运算条件时,抛出此异常
- IndexOutOfBoundsException 数组索引越界异常
- ClassNotFoundException 找不到类异常
- IllegalArgumentException(非法参数异常)
Исключения общих проверенных исключений:
- IOException (操作输入流和输出流时可能出现的异常)
- ClassCastException(类型转换异常类)
Если вам интересно, вы можете прочитать эту статью, которую я написал ранее:Обязательным для Java-программистов: десять ключевых точек знаний об исключениях
30. Разница между глубоким и поверхностным копированием
мелкая копия
Ссылочный адрес объекта копируется, и два объекта указывают на один и тот же адрес памяти, поэтому, если какое-либо значение будет изменено, другое значение изменится соответственно.
глубокая копия
Скопируйте объект и его значение, и два объекта изменят любое из значений, а другое значение не изменится.
31. В чем разница между JDK и JRE?
- JDK: сокращение от Java Development Kit, Java Development Kit, который предоставляет среду разработки и среду выполнения Java.
- JRE: Аббревиатура для Java Runtime Environment, Java Runtime Environment, которая обеспечивает необходимую среду для запуска Java.
32. Каковы общие методы класса String?
- indexOf(): возвращает индекс указанного символа.
- charAt(): возвращает символ по указанному индексу.
- replace(): замена строки.
- trim(): удалить пробелы с обоих концов строки.
- split(): разбивает строку и возвращает массив разделенных строк.
- getBytes(): возвращает байтовый массив строк.
- length(): возвращает длину строки.
- toLowerCase(): преобразовать строку в строчные буквы.
- toUpperCase(): преобразовать строку в символы верхнего регистра.
- substring(): строка перехвата.
- equals(): сравнение строк.
33. Расскажите о сценариях и реализации пользовательских аннотаций
- У меня раньше был такой бизнес-сценарий, использование Redis для управления частотой вызовов интерфейса и использование пользовательских аннотаций.
- Добавьте аспекты к методу через АОП (механизм динамического прокси) и получите аннотации, содержащиеся в методе, с помощью отражения.Если он содержит пользовательские аннотации ключевых слов, он проверит и перехватит запрос через Redis.
Что касается аннотаций, рекомендуется взглянуть на главу аннотаций идей программирования на Java ~
34. Какие шаблоны проектирования вам знакомы?
Шаблоны проектирования делятся на три категории:
- Шаблон создания: шаблон фабричного метода, абстрактный фабричный шаблон, одноэлементный шаблон, шаблон построителя, шаблон прототипа (5 видов)
- Структурные шаблоны: шаблон адаптера, шаблон декоратора, шаблон прокси, шаблон фасада, шаблон моста, шаблон композиции, шаблон легковеса. (7 видов)
- Поведенческие паттерны: паттерн стратегии, паттерн метода шаблона, паттерн наблюдателя, итеративный подшаблон, паттерн цепочки ответственности, паттерн команды, паттерн меморандума, паттерн состояния, паттерн посетителя, паттерн посредника, паттерн интерпретатора. (11 видов)
Лучше всего накапливать его в обычное время, как писать одноэлементный режим (7 методов реализации), заводской режим, режим разработки метода шаблона, режим стратегии, режим декоратора и режим прокси~
Лично я думаю, вы можете прочитать статью о шаблоне проектирования Hollis God, она очень хорошо написана!Шаблоны проектирования (2) — шаблон Singleton
35. В чем разница между абстрактной фабрикой и шаблоном фабричного метода?
36. Что такое передача по значению и передача по ссылке?
- Передача по значению предназначена для примитивных переменных, копия переменной передается, и изменение копии не влияет на исходную переменную.
- Передача по ссылке обычно предназначена для объектных переменных, и передается копия адреса объекта, а не сам исходный объект. Следовательно, операции над объектом, на который ссылаются, также изменят исходный объект.
37. Можно ли получить доступ к нестатической переменной в статической среде?
Статическая переменная принадлежит классу в Java, и ее значение одинаково во всех экземплярах. Когда класс загружается виртуальной машиной Java, инициализируются статические переменные. Поскольку статические члены принадлежат классам, они загружаются в память области статических методов при загрузке класса. Когда класс загружается, в это время могут не создаваться экземпляры. Без экземпляров доступ к нестатическим членам невозможен. . Загрузка класса предшествует созданию экземпляра, поэтому в статической среде доступ к нестатическим невозможен!
38. Поддерживает ли Java множественное наследование и почему?
Множественное наследование не поддерживается, причины:
- Из соображений безопасности, если подкласс наследует несколько родительских классов с одним и тем же методом или свойством, подкласс не будет знать, какой из них унаследовать.
- Java предоставляет интерфейсы и внутренние классы для достижения множественного наследования и устранения недостатков одиночного наследования.
39. Какой самый эффективный способ вычислить 2 умножить на 8?
2 << 3
- Сдвиг числа влево на n бит эквивалентен умножению числа на 2 в n-й степени.
- Затем, чтобы умножить число на 8, просто сдвиньте его влево на 3 бита.
- ЦП напрямую поддерживает операцию смещения, и эффективность является самой высокой.
40. Можно ли переопределить конструкторы?
Конструкторы не могут наследоваться, потому что имя класса каждого класса отличается, а имя конструктора совпадает с именем класса, поэтому наследования нет. И поскольку конструкторы не могут быть унаследованы, они не могут быть соответственно переопределены.
41. Можно ли хранить китайский иероглиф в переменной char и почему?
В Java тип char занимает 2 байта, а Java по умолчанию использует кодировку Unicode. Код Unicode состоит из 16 бит, поэтому код Unicode занимает два байта. В Java как китайские, так и английские буквы представлены кодировкой Unicode. Поэтому в Java переменная типа char может хранить китайский иероглиф.
char ch = '啦';
System.out.println("char:" + ch);
42. Как реализовать клонирование объектов?
- Реализуйте интерфейс Cloneable и переопределите метод clone().
- Метод clone() объекта Object является поверхностной копией, то есть, если свойство в классе имеет настраиваемый тип ссылки, копируется только ссылка, а не объект, на который указывает ссылка.
- Класс свойств объекта также реализует интерфейс Cloneable, и свойства также клонируются вручную при клонировании объекта для выполнения глубокой копии.
- Объедините сериализацию (интерфейс JDK java.io.Serializable, формат JSON, формат XML и т. д.) для завершения глубокого копирования.
43. Какие методы определены в объекте?
- getClass(); Получить информацию о структуре класса
- hashCode() Получить хэш-код
- equals(Object) По умолчанию значения адресов объектов сравниваются на равенство.Подклассы могут переписывать правила сравнения.
- clone() для клонирования объектов
- toString() преобразует объект в строку
- функция пробуждения notify() в нескольких потоках
- Функция notifyAll() для пробуждения всех ожидающих потоков в многопоточности
- wait() заставляет поток, удерживающий блокировку объекта, войти в ожидание
- ожидание (длительный тайм-аут) Позвольте потоку, удерживающему блокировку объекта, войти в ожидание и установить тайм-аут в миллисекундах.
- ожидание (длинный тайм-аут, int nanos) Пусть поток, удерживающий блокировку объекта, войдет в ожидание, установите тайм-аут в наносекундах
- Метод finalize() выполняется перед сборкой мусора
44. Какова роль hashCode?
- Наличие hashCode в основном используется для быстроты поиска, таких как Hashtable, HashMap и т.п. hashCode используется для определения адреса хранения объектов в структуре хранения хэшей;
- Если два объекта одинаковы, это применимо к методу equals(java.lang.Object), тогда hashCode двух объектов должен быть одинаковым;
- Если метод equals объекта переписывается, то хэш-код объекта также максимально переписывается, а объект, используемый для генерации хэш-кода, должен быть таким же, как тот, который используется в методе equals, иначе он нарушит второе указанный выше пункт;
- Один и тот же hashCode двух объектов не обязательно означает, что два объекта одинаковы, то есть он не обязательно применяется к методу equals(java.lang.Object), он может только указывать на то, что два объекта находятся в хэше структура хранения.
В этой статье очень подробно:Роль hashCode в Java
45. Сравнение эффективности между циклом for-each и обычным циклом for
На этот вопрос «Эффективная Java» дала нам ответ:
for-each делает код чище и снижает вероятность ошибок. Следующий идиоматический код работает как для коллекций, так и для массивов:
for (Element e : elements) { doSomething(e); }Использование цикла for-each не снижает производительность по сравнению с обычным циклом for, даже при переборе массива. Фактически, в некоторых случаях это также может привести к небольшому повышению производительности, поскольку верхняя граница индекса массива вычисляется только один раз.
46. Напишите несколько реализаций одноэлементного паттерна, разница между ленивым паттерном и голодным паттерном
7 видов:
- Первый (ленивый, небезопасный для потоков)
- Второй (ленивый, потокобезопасный)
- Третий тип (голодный человек)
- Четвертый (Голодный, Вариант)
- Пятый (статический внутренний класс)
- Шестое (перечисление):
- Седьмой (двойной замок)
Смотрите эту статью:Семь способов написать шаблон singleton
47. Перечислите 5 исключений во время выполнения.
- NullPointerException 空指针异常
- ArithmeticException 出现异常的运算条件时,抛出此异常
- IndexOutOfBoundsException 数组索引越界异常
- ClassNotFoundException 找不到类异常
- IllegalArgumentException(非法参数异常)
48. Могут ли 2 неравных объекта иметь одинаковый хэш-код?
Это возможно~
Генеральный контракт для hashCode:
- Несколько вызовов метода hashCode для одного и того же объекта должны постоянно возвращать одно и то же целое число во время выполнения приложения Java при условии, что информация, используемая для сравнения объектов на предмет равенства, не была изменена. Это целое число не обязательно должно быть постоянным от одного выполнения приложения к другому выполнению того же приложения.
- Если equals() двух объектов равны, то вызов метода hashCode для каждого из двух объектов должен давать одинаковый целочисленный результат.
- Если equals() двух объектов не равны, то вызов метода hashCode для любого из двух объектов не обязательно приводит к разным целочисленным результатам. Однако создание разных целочисленных результатов для неравных объектов может повысить производительность хэш-таблицы.
49. В чем разница между модификаторами доступа public, private, protected и default?
50. Расскажите о роли final в java?
- Класс, украшенный final, называется окончательным классом, который не может быть унаследован.
- Окончательно декорированные методы не могут быть переопределены.
- Переменные, измененные с помощью final, называются константами.Константы должны быть инициализированы, и после инициализации их значение не может быть изменено.
51. Сколько стоит Math.round(-1.5) в java?
Класс java.lang.Math в JDK:
- round() : возвращает округление, отрицательное десятичное число 0,5 возвращает большее целое число, например -1,5 возвращает -1.
- ceil() : возвращает большее значение между двумя целыми числами, где находится десятичная дробь, например, -1,5 возвращает -1,0.
- floor() : возвращает меньшее значение между двумя целыми числами, где находится десятичная дробь, например, -1,5 возвращает -2,0.
52. Является ли String фундаментальным типом данных?
String не является базовым типом, существует 8 основных типов: byte, boolean, char, short, int, float, long, double и String — это объект.
53. Как перевернуть строку?
- Использование обратного метода StringBuilder или StringBuffer по существу вызывает реализацию обратного метода их родительского класса AbstractStringBuilder. (JDK1.8)
- Используйте функцию chatAt для вывода в обратном порядке;
54. Опишите несколько реализаций динамических агентов, их преимущества и недостатки.
- Динамический прокси JDK
- Динамический прокси CGLIB
- Динамический прокси оригинального звука JDK поддерживается исходным звуком java и не требует никаких внешних зависимостей, но может проксировать только на основе интерфейсов.
- CGLIB проксируется по наследству, вне зависимости от того, не реализует ли целевой объект интерфейс, его можно проксировать, но он не может обработать конечную ситуацию
55. В вашем собственном коде, если вы создаете класс java.lang.String, может ли этот класс быть загружен загрузчиком классов? Почему.
Не может. Поскольку JDK учитывает безопасность, на основе родительской модели делегирования класс String JDK загружается первым.Если java.lang.String был загружен, он не будет загружен снова.
56. Расскажите о своем понимании методов hashCode и equals в объекте java.lang.Object. В каких сценариях вам нужно повторно реализовать эти два метода.
- При оценке объектов в нашей бизнес-системе иногда требуется не строгое равенство, а равенство бизнес-объектов. В этом случае собственный метод equals не может удовлетворить наши потребности, поэтому сейчас нам нужно переписать метод equals, чтобы он соответствовал потребностям нашей бизнес-системы.
- Так зачем вам переопределять метод hashCode, когда вы переопределяете метод equals? Если вы переопределяете только метод equals без переопределения метода hashCode, это нарушит второй пункт контракта: одинаковые объекты должны иметь одинаковые хэш-коды, поэтому оба метода hashCode и equals необходимо переписать.
Посмотрите эту статью в Интернете:Почему java переопределяет методы hashCode и equals
57. В jdk1.5 введены дженерики, какие проблемы решает существование дженериков.
Java 泛型(generics)是 JDK 5 中引入的一个新特性,其本质是参数化类型,解决不确定具体对象类型的问题。
Для этого вопроса интервью вы можете прочитать мою статью~Основные Java-программисты: общий анализ
58. Что такое сериализация, как сериализовать и десериализовать?
- Сериализация: процесс преобразования объекта Java в последовательность байтов.
- Десериализация: процесс восстановления последовательности байтов в объект Java.
Вы можете прочитать мою статью~Обязателен для Java-программистов: всесторонний анализ сериализации
59. Новые возможности java8.
- Лямбда-выражения: лямбда-выражения позволяют использовать функции в качестве параметров метода.
- Stream API: Недавно добавленный Stream API (java.util.stream) привносит настоящий функциональный стиль программирования в Java.
- Ссылки на методы: Ссылки на методы предоставляют очень полезный синтаксис для прямого обращения к методам или конструкторам существующих классов или объектов (экземпляров) Java.
- Метод по умолчанию. Метод по умолчанию — это метод, реализация которого реализована в интерфейсе.
- Необязательный класс. Необязательный класс стал частью библиотеки классов Java 8 для разрешения исключений нулевого указателя.
- Date Time API: улучшенная обработка дат и времени.
60. Что такое анонимный внутренний класс? Как получить доступ к переменным, определенным вне его?
Анонимные внутренние классы — это внутренние классы без имени, которые часто используются в повседневной разработке.
public class Outer {
private void test(final int i) {
new Service() {
public void method() {
for (int j = 0; j < i; j++) {
System.out.println("匿名内部类" );
}
}
}.method();
}
}
//匿名内部类必须继承或实现一个已有的接口
interface Service{
void method();
}
Анонимные внутренние классы также имеют следующие характеристики:
- без имени
- Анонимный внутренний класс должен наследоваться от абстрактного класса или реализовывать интерфейс.
- Анонимные внутренние классы не могут определять статические члены и статические методы.
- Когда формальный параметр метода, в котором он находится, должен использоваться анонимным внутренним классом, он должен быть объявлен окончательным.
- Анонимный внутренний класс не может быть абстрактным, он должен реализовывать все абстрактные методы унаследованного класса или реализованного интерфейса.
- Анонимный внутренний класс не может получить доступ к локальной переменной в методе внешнего класса, если переменная не объявлена final
Вы можете прочитать мою статью~Основные Java-программисты: разрешение внутреннего класса
61. В чем разница между break и continue?
- Break может заставить процесс выйти из тела оператора switch или завершить тело цикла этого уровня в структуре цикла, тем самым заранее завершив цикл этого уровня.
- Функция continue состоит в том, чтобы пропустить оставшиеся невыполненные операторы в теле цикла и немедленно выполнить следующее определение условия цикла, что можно понимать только как завершение текущего цикла.
62. String s = "Hello";s = s + "world!"; После выполнения этих двух строк кода изменится ли содержимое исходного объекта String?
нет. Поскольку String спроектирован так, чтобы быть неизменяемым, все его объекты являются неизменяемыми объектами.
63. Строка s="a"+"b"+"c"+"d" Сколько объектов создается?
только 1.
Компилятор Java оптимизирует выражение прямого сложения строковых констант, он не ждет операции сложения во время выполнения, а убирает плюсик во время компиляции, и напрямую компилирует в результат, где эти константы связаны. Таким образом, "a"+"b"+"c"+"d" эквивалентно прямому определению строки "abcd".
64. порядок выполнения try-catch-finally-return
описание выполнения try-catch-finally-return:
- Если исключения не возникнет, часть catch не будет выполнена.
- Независимо от того, возникнет ли исключение, finally будет выполнен.
- наконец, все еще выполняется, даже если есть возврат в попытке и поймать
- finally выполняется после вычисления выражения, следующего за return. (В это время значение после операции не возвращается, но значение, которое должно быть возвращено, сохраняется первым. Если нет возврата в finally, независимо от того, какой код в finally, возвращаемое значение не изменится, это все еще сохраняется перед.значением), и в этом случае возвращаемое значение функции определяется перед окончательным выполнением)
- Не возвращайте часть finally, иначе вы не сможете вернуться к возврату try или catch.
посмотреть пример
public static void main(String[] args) throws IOException {
System.out.println("result:" + test());
}
private static int test() {
int temp = 1;
try {
System.out.println("start execute try,temp is:"+temp);
return ++temp;
} catch (Exception e) {
System.out.println("start execute catch temp is: "+temp);
return ++temp;
} finally {
System.out.println("start execute finally,temp is:" + temp);
++temp;
}
}
результат операции:
start execute try,temp is:1
start execute finally,temp is:2
result:2
анализировать:
- Сначала выполните часть попытки, выведите журнал и выполните
++tempвыражение, temp становится равным 2, и это значение сохраняется. - Поскольку исключения не возникло, блок catch пропускается.
- Выполнить блок finally, вывести журнал, выполнить
++tempвыражение. - Возвращает значение 2, хранящееся в разделе try.
65. Новый оператор try-with-resources в Java 7. Вы его обычно используете?
try-with-resources, новая функция, предоставляемая Java7, используется для автоматического управления ресурсами.
- Ресурс — это объект, который должен быть закрыт после того, как программа израсходована.
- try-with-resources гарантирует, что каждый объявленный ресурс будет закрыт в конце оператора
- Какие объекты можно использовать в качестве ресурсов? Пока объект, реализующий интерфейс java.lang.AutoCloseable или интерфейс java.io.Closeable, в порядке.
существуетtry-with-resourcesперед появлением
try{
//open resources like File, Database connection, Sockets etc
} catch (FileNotFoundException e) {
// Exception handling like FileNotFoundException, IOException etc
}finally{
// close resources
}
Java7,try-with-resourcesПосле появления используйте ресурс для достижения
try(// open resources here){
// use resources
} catch (FileNotFoundException e) {
// exception handling
}
// resources are closed as soon as try-catch block is executed.
Java7 использует демонстрацию ресурсов
public class Java7TryResourceTest {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader(
"C:/jaywei.txt"))) {
System.out.println(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}
использовалtry-with-resourcesпреимущества
- Код стал более элегантным и содержит меньше строк.
- Автоматическое управление ресурсами, не нужно беспокоиться об утечках памяти.
66. Кратко опишите объектно-ориентированные «шесть принципов и одно правило».
- Принцип единой ответственности: класс делает только то, что должен делать.
- Принцип открытости-закрытости: объекты программного обеспечения должны быть открыты для расширения и закрыты для модификации.
- Принцип инверсии зависимостей: интерфейсно-ориентированное программирование.
- Принцип изоляции интерфейса: интерфейс должен быть небольшим и специализированным, а не большим и законченным.
- Принцип повторного использования синтетической агрегации: приоритет отдается использованию агрегации или синтетической связи для повторного использования кода.
- Закон Деметры: Закон Деметры, также известный как принцип наименьшего знания, гласит, что объект должен знать как можно меньше о других объектах.
67. Можно ли переключать работу с byte, long или String?
- переключатель работает на char byte short int
- переключатель может воздействовать на класс-оболочку, соответствующий char byte short int
- переключатель не работает с длинным двойным логическим значением с плавающей запятой и их классами-оболочками
68. Есть ли у массива метод length()? Есть ли у String метод length()?
- У массивов нет метода length(), но есть метод length;
- Строка имеет метод length()
69. Можно ли вызвать нестатический метод из статического метода?
Не может.
- Нестатические методы тесно связаны с экземплярами объекта. Только после создания объекта нестатические методы могут быть вызваны для объекта. Однако статические методы связаны с классами и могут вызываться непосредственно классом без создания объекта.
- При вызове статического метода не может быть создан объект-экземпляр.Если вызов нестатического метода выдается из статического метода, с каким объектом связан нестатический метод? Эта логика не работает
- Поэтому вызов нестатического метода не может быть выполнен внутри статического метода.
70. String s = new String("jay"); Сколько строковых объектов создается?
один или два
- Когда new String("jay"); вызывается в первый раз, строковый объект создается в куче памяти, а объект "jay" создается в пуле строковых констант.
- При втором вызове new String("jay"); в памяти кучи будет создан только строковый объект, указывающий на "jay", ранее созданный в пуле строковых констант.
Вы можете прочитать эту статью Лао Вана, она очень ясна~Перестаньте спрашивать меня, сколько объектов создает новая строка! Я докажу это вам!
71. Роль ключевых слов this и super
это:
- Внутренняя ссылка объекта на самого себя
- Решить проблему переменных-членов и локальных переменных с одинаковыми именами
- Можно вызывать переменные-члены, но нельзя вызывать локальные переменные.
- методы-члены могут быть вызваны
- Это может быть опущено в обычных методах
- Ключевое слово this не разрешено в статических методах.
супер:
- Вызов члена или метода родительского класса
- Вызов конструктора родительского класса
72. Можем ли мы привести тип int к переменной типа byte? Что произойдет, если значение больше, чем диапазон типа байта?
Да, мы можем сделать приведение, но в Java int — 32 бита, byte — 8 бит, если приведение сделать, то старшие 24 бита типа int будут отброшены.
public class Test {
public static void main(String[] args) {
int a =129;
byte b = (byte) a;
System.out.println(b);
int c =10;
byte d = (byte) c;
System.out.println(d);
}
}
输出:
-127
10
73. float f=3.4 правильно?
Неправильно, точность неточна, вы должны использовать приведение
74. Может ли интерфейс наследовать интерфейс? Реализует ли абстрактный класс интерфейс? Могут ли абстрактные классы наследовать классы сущностей?
Это все приемлемо
75. В чем разница между Reader и InputStream?
- InputStream — это суперкласс всех классов, представляющих входные потоки байтов.
- Reader — это абстрактный класс для чтения потоков символов.
76. Перечислите 6 наиболее часто используемых пакетов в JAVA.
- java.lang;
- java.util;
- java.io;
- java.sql;
- java.awt;
- java.net;
77. Каковы новые возможности JDK 7?
- Оператор попытки с ресурсом
- Обработка файлов NIO2 Файлы
- переключатель может поддерживать условия оценки строки
- родовое происхождение
- Унифицированная обработка нескольких исключений
78. В чем разница между синхронным и асинхронным?
- Под синхронизацией можно понимать ожидание возврата системой значения или сообщения после выполнения функции или метода, в это время программа блокируется и выполняет другие команды только после получения возвращенного значения или сообщения.
- Асинхронный, после выполнения функции или метода вам не нужно ждать возвращаемого значения или сообщения с блокировкой, вам нужно только делегировать асинхронный процесс системе, затем, когда система получит возвращаемое значение или сообщение, система будет автоматически запускать делегированный асинхронный процесс для завершения всего процесса.
- Синхронизация, то есть обработка в реальном времени (например, выполнение телефонного звонка)
- Асинхронная обработка, то есть обработка с разделением времени (например, отправка и получение текстовых сообщений)
Обратитесь к этой статье~Разница между синхронным и асинхронным
79. Какой тип данных обычно используется в Java для представления цены при реальной разработке?
Лучше использовать BigDecimal для представления цены в java.
Вы можете прочитать эту статью, она очень хорошо написанаБосс сказал: Кто хочет использовать двойное определение количества товаров, просто собирайтесь и уходите.
80. Какова длина int в 64-битной JVM?
Тип данных int занимает 4 байта и 32 бита, что никак не связано с количеством бит JVM.
публика
- Добро пожаловать, чтобы обратить внимание на мой личный публичный аккаунт, подружиться и учиться вместе ~