Я обнаружил, что на многие вопросы для собеседования по Java в Интернете нет ответов, поэтому сбор и сортировка набора вопросов для собеседования по Java заняло много времени, надеюсь, это поможет всем~
Подсчитано, что чтение этой статьи займет 12 минут.
В эти дни я планирую обновлять по 15-20 вопросов каждый день. (Это поможет вам читать и понимать!) Давайте начнем с простого
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 всегда сравнивает значение, так что все результаты верны.
равнозначная интерпретация
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(): записать файл.
Хорошо, ребята, вот и все вопросы сегодняшнего интервью.
Если в этой статье есть какие-либо ошибки, пожалуйста, критикуйте и советуйте, это очень ценится!