В настоящее время в вопросах для интервью на рынке есть две основные проблемы: во-первых, вопросы слишком старые и давно не обновлялись, и они все еще в состоянии до 2010 года; во-вторых, JDK был обновлен. и выпущен очень быстро в последние годы, и использование Java также Многое изменилось, и в стек технологий Java было добавлено много новых фреймворков, таких как Spring Boot, Spring Cloud и т. д., но очень мало похожих вопросы интервью.
По сравнению с этими вопросами мои 208 вопросов для интервью имеют следующие преимущества:
- Выделены самые классические вопросы для интервью в каждом модуле Java;
- Ответы точны, и каждый вопрос был тщательно выверен мной;
- Близко к самым реальным корпоративным интервью, с практическими и эффективными темами;
- Для сложных тем я добавил анализ кода и анализ принципов.
С учетом вышеперечисленных характеристик видно, что для«Наиболее 200 самых распространенных вопросов на собеседовании по Java»В этой статье я потратил много времени только с одной целью — предоставить коллекцию лучших и наиболее полных вопросов для собеседования по Java на рынке.
Эта статья — первая часть из 208 вопросов и ответов по модулю «Основы Java».
Основы Java
1. В чем разница между JDK и JRE?
- JDK: Аббревиатура для Java Development Kit, комплект для разработки Java, который предоставляет среду разработки и среду выполнения Java.
- JRE: сокращение от Java Runtime Environment, среда выполнения java обеспечивает необходимую среду для работы java.
В частности, JDK фактически включает в себя JRE, а также компилятор javac для компиляции исходного кода Java, а также множество инструментов для отладки и анализа программ Java. Проще говоря: если вам нужно запускать java-программы, просто установите JRE, а если вам нужно написать java-программы, вам нужно установить JDK.
2. В чем разница между == и equals?
== Интерпретация
Эффект == отличается для примитивных типов и ссылочных типов следующим образом:
- Базовые типы: сравните, совпадают ли значения;
- Тип ссылки: сравнение заключается в том, является ли ссылка такой же;
Пример кода:
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
Интерпретация кода: поскольку x и y указывают на одну и ту же ссылку, == также является истинным, а новый метод String() переписан, чтобы освободить место в памяти, поэтому результат == является ложным, а сравнение равных всегда значение, поэтому все результаты верны.
равнозначная интерпретация
equals по существу ==, за исключением того, что String и Integer переопределяют метод equals и превращают его в сравнение значений. См. код ниже, чтобы понять.
Давайте сначала посмотрим, что по умолчанию equals сравнивает объект с одинаковым значением, код выглядит следующим образом:
class Cat {
public Cat(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Cat c1 = new Cat("王磊");
Cat c2 = new Cat("王磊");
System.out.println(c1.equals(c2)); // false
Вывод неожиданный, он ложный? Что происходит? Вы можете увидеть исходный код equals. Исходный код выглядит следующим образом:
public boolean equals(Object obj) {
return (this == obj);
}
Оказывается, equals по сути ==.
Вопрос в том, почему два объекта String с одинаковым значением возвращают true? код показывает, как показано ниже:
String s1 = new String("老王");
String s2 = new String("老王");
System.out.println(s1.equals(s2)); // true
Точно так же, когда мы вводим метод equals для String и находим ответ, код выглядит следующим образом:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
Оказывается, String переопределяет метод equals объекта Object и изменяет сравнение ссылок на сравнение значений.
Суммировать:== — это сравнение значений для базовых типов и ссылка для ссылочных типов, а equals — это сравнение по ссылке по умолчанию, но многие классы имеют методы повторного равенства, такие как String, Integer и т. д. equals сравнивает, равны ли значения.
3. Если hashCode() двух объектов один и тот же, тогда equals() тоже должно быть истинным, верно?
Нет, hashCode() двух объектов один и тот же, и equals() не обязательно истинен.
Пример кода:
String str1 = "通话";
String str2 = "重地";
System.out.println(String.format("str1:%d | str2:%d", str1.hashCode(),str2.hashCode()));
System.out.println(str1.equals(str2));
Результат выполнения:
стр1: 1179395 | стр2: 1179395
false
Интерпретация кода: очевидно, что hashCode() для «вызова» и «тяжелого места» одинаковы, но equals() является ложным, потому что в хэш-таблице hashCode() равен, то есть значения хеш-функции из двух пар ключ-значение равны, но ha Если значение равно, это не обязательно приводит к равенству пары ключ-значение.
4. Какова роль final в java?
- Класс, украшенный final, называется окончательным классом, который не может быть унаследован.
- Окончательно декорированные методы не могут быть переопределены.
- Переменные, измененные с помощью final, называются константами.Константы должны быть инициализированы, и после инициализации их значение не может быть изменено.
5. Что такое Math.round(-1.5) в Java?
Он равен -1, потому что при взятии значения на числовой прямой среднее значение (0,5) округляется вправо, поэтому положительное 0,5 округляется в большую сторону, а отрицательное 0,5 напрямую отбрасывается.
6. Является ли String фундаментальным типом данных?
String не является базовым типом, существует 8 основных типов: byte, boolean, char, short, int, float, long, double и String — это объект.
7. Какие есть классы для работы со строками в Java? В чем разница между ними?
Классы, которые работают со строками: String, StringBuffer, StringBuilder.
Разница между String и StringBuffer и StringBuilder заключается в том, что String объявляет неизменяемый объект.Каждая операция будет генерировать новый объект String, а затем указывать указатель на новый объект String, в то время как StringBuffer и StringBuilder могут работать на основе исходного объекта. Поэтому лучше не использовать String, когда содержимое строки часто изменяется.
Самая большая разница между StringBuffer и StringBuilder заключается в том, что StringBuffer является потокобезопасным, а StringBuilder — нет, но производительность StringBuilder выше, чем у StringBuffer, поэтому StringBuilder рекомендуется использовать в однопоточной среде, а StringBuffer рекомендуется в многопоточной среде. многопоточная среда.
8. Является ли строка str="i" такой же, как строка str=new String("i")?
Не то же самое, потому что память распределяется по-разному. String str="i", виртуальная машина Java выделит его в постоянный пул, а String str=new String("i") будет выделена в куче памяти.
9. Как перевернуть строку?
Используйте метод reverse() StringBuilder или stringBuffer.
Образец кода:
// StringBuffer reverse
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("abcdefg");
System.out.println(stringBuffer.reverse()); // gfedcba
// StringBuilder reverse
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("abcdefg");
System.out.println(stringBuilder.reverse()); // gfedcba
10.Каковы общие методы класса String?
- indexOf(): возвращает индекс указанного символа.
- charAt(): возвращает символ по указанному индексу.
- replace(): замена строки.
- trim(): удалить пробелы с обоих концов строки.
- split(): разбивает строку и возвращает массив разделенных строк.
- getBytes(): возвращает байтовый массив строк.
- length(): возвращает длину строки.
- toLowerCase(): преобразовать строку в строчные буквы.
- toUpperCase(): преобразовать строку в символы верхнего регистра.
- substring(): строка перехвата.
- equals(): сравнение строк.
11. Должен ли абстрактный класс иметь абстрактные методы?
Нет, абстрактные классы не обязательно имеют абстрактные методы.
Образец кода:
abstract class Cat {
public static void sayHi() {
System.out.println("hi~");
}
}
В приведенном выше коде абстрактный класс не имеет абстрактных методов, но работает отлично.
12. В чем разница между обычным классом и абстрактным классом?
- Обычные классы не могут содержать абстрактные методы, абстрактные классы могут содержать абстрактные методы.
- Абстрактные классы не могут быть созданы напрямую, обычные классы могут быть созданы напрямую.
13. Можно ли абстрактные классы украшать окончательными?
Нет, определение абстрактного класса позволяет другим классам наследоваться. Если он определен как final, класс не может быть унаследован, что приведет к конфликту друг с другом, поэтому final не может изменять абстрактные классы. Как показано на рисунке ниже, редактор также вызовет сообщение об ошибке:
14. В чем разница между интерфейсом и абстрактным классом?
- Реализация: подклассы абстрактных классов используют расширения для наследования; интерфейсы должны использовать реализации для реализации интерфейсов.
- Конструктор: абстрактный класс может иметь конструктор, а интерфейс — нет.
- Основной метод: абстрактный класс может иметь основной метод, и мы можем его запустить; у интерфейса не может быть основного метода.
- Количество реализаций: класс может реализовывать множество интерфейсов, однако он может наследоваться только от одного абстрактного класса.
- Модификатор доступа: методы в интерфейсе по умолчанию обозначаются как public; методы в абстрактном классе могут иметь любой модификатор доступа.
15. Какие есть типы потоков ввода/вывода в java?
Разделенные по функциям: входной поток (input), выходной поток (output).
Разделяется по типу: поток байтов и поток символов.
Разница между потоком байтов и потоком символов заключается в том, что поток байтов передает входные и выходные данные в единицах байтов по 8 битам, а поток символов передает входные и выходные данные в единицах символов по 16 битам.
16. В чем разница между BIO, NIO и AIO?
- BIO: блочный ввод-вывод Синхронный блокирующий ввод-вывод — это традиционный ввод-вывод, который мы обычно используем, он характеризуется простым режимом, удобством использования и низким уровнем параллельной обработки.
- NIO: новый синхронный неблокирующий ввод-вывод — это обновление традиционного ввода-вывода.Клиент и сервер взаимодействуют через канал (канал) для достижения мультиплексирования.
- AIO: асинхронный ввод-вывод — это обновление NIO, также называемое NIO2, которое реализует асинхронный неблокирующий ввод-вывод.Работа асинхронного ввода-вывода основана на событиях и механизмах обратного вызова.
17.Каковы общие методы файлов?
- Files.exists(): проверяет, существует ли путь к файлу.
- Files.createFile(): создать файл.
- Files.createDirectory(): создать папку.
- Files.delete(): удалить файл или каталог.
- Files.copy(): копирование файлов.
- Files.move(): переместить файлы.
- Files.size(): просмотр количества файлов.
- Files.read(): прочитать файл.
- Files.write(): записать файл.
Отсканируйте QR-код ниже, чтобы получить все ответы
Рекомендуемые статьи по теме:
200+ самых распространенных вопросов на собеседовании по Java