Здесь я поделюсь некоторыми вопросами интервью, которые появляются очень часто.Первоначальное еженедельное обновление будет обновляться, и когда оно будет закончено и когда оно остановится.
Адрес на гитхабе:GitHub.com/snail Climb/…
1. Передача по значению и по ссылке в Java (очень важно)
Первое, что нужно прояснить: «Передача объекта (массив, класс, интерфейс) передается по ссылке, а передача данных примитивного типа (целое число, с плавающей запятой, символ, логическое значение) — по значению».
Так что же такое передача по значению и передача по приложению?
передать по значениюЭто означает, что объект передается по значению, а значит, передается копия объекта, и даже если копия будет изменена, это не повлияет на исходный объект. (Потому что при передаче по значению он фактически копирует значение фактического параметра в формальный параметр.)
пройти по ссылкеЭто означает, что объект передается по ссылке, что означает, что передается не фактический объект, а ссылка на объект. Поэтому внешние изменения объекта, на который ссылаются, будут отражены во всех объектах. (Потому что при передаче по ссылке фактически копируется адресное значение фактического параметра в формальный параметр.)
Иногда интервьюер не просто спрашивает вас, «что такое передача по значению или по ссылке в Java», Сао Ниан? Вместо этого приведите пример и позвольте вам написать ответ, что также часто встречается в письменных тестовых вопросах! Итак, очень важно, см. следующий пример:
примеры передачи по значению и по приложению
1. Передача по значению
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
swap(num1, num2);
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
}
public static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
System.out.println("a = " + a);
System.out.println("b = " + b);
}
результат:
a = 20
b = 10
num1 = 10
num2 = 20
Разобрать:
В методе swap значения a и b меняются местами, не затрагивая num1 и num2. Потому что значения в a и b копируются только из num1 и num2. Другими словами, a и b эквивалентны копиям num1 и num2.Какое бы содержимое копии ни было изменено, это не повлияет на сам оригинал.
2. Передать по ссылке
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
change(arr);
System.out.println(arr[0]);
}
public static void change(int[] array) {
//将数组的第一个元素变为0
array[0] = 0;
}
результат:
1
0
Разобрать:
Будь то основная функция или метод изменения, операции представляют собой массивы, соответствующие одному и тому же значению адреса. . Поэтому внешние изменения объекта, на который ссылаются, будут отражены во всех объектах.
некоторые специальные примеры
1. Передача типа StringBuffer
// 测试引用传递:StringBuffer
@org.junit.Test
public void method1() {
StringBuffer str = new StringBuffer("公众号:Java面试通关手册");
System.out.println(str);
change1(str);
System.out.println(str);
}
public static void change1(StringBuffer str) {
str = new StringBuffer("abc");//输出:“公众号:Java面试通关手册”
//str.append("欢迎大家关注");//输出:公众号:Java面试通关手册欢迎大家关注
//str.insert(3, "(编程)");//输出:公众号(编程):Java面试通关手册
}
результат:
公众号:Java面试通关手册
公众号:Java面试通关手册
Разобрать:
В настоящее время многие люди должны задать вопрос: созданный StringBuffer, очевидно, является объектом, так почему же выходной результат остается исходным значением?
Так какchange1
Внутри метода мы создаем новый объект StringBuffer, поэтомуstr
Он указывает на другой адрес, и соответствующая операция также указывает на другой адрес.
Тогда, еслиchange1
Метод изменен на тот, что показан на рисунке ниже.Предположительно, каждый должен знать, что такое вывод.Если вы не знаете, может быть, проблема в том, что я сказал.Я подумаю над этим (шучу , ответ был дан в приведенной выше программе):
public static void change1(StringBuffer str) {
str.append("欢迎大家关注");
str.insert(3, "(编程)");
}
2. Передача строкового типа
// 测试引用传递:Sring
@org.junit.Test
public void method2() {
String str = new String("公众号:Java面试通关手册");
System.out.println(str);
change2(str);
System.out.println(str);
}
public static void change2(String str) {
// str="abc"; //输出:公众号:Java面试通关手册
str = new String("abc"); //输出:公众号:Java面试通关手册
}
результат:
公众号:Java面试通关手册
公众号:Java面试通关手册
Видно, что выполнениеstr="abc;"
все ещеstr = new String("abc");
Выходное значение str не изменяется.
Согласно тому, что мы сказали выше, когда говорили о «переносе типа StringBuffer»,str="abc;"
Следует оставить значение вывода str без изменений. Зачем? Потому что String неизменяем после создания.
3. Похожая тема
Что выводит следующая программа?
public class Demo {
public static void main(String[] args) {
Person p = new Person("张三");
change(p);
System.out.println(p.name);
}
public static void change(Person p) {
Person person = new Person("李四");
p = person;
}
}
class Person {
String name;
public Person(String name) {
this.name = name;
}
}
Очевидно, все еще выводит张三
. так какchange
метод воссоздалPerson
объект.
Тогда, если положитьchange
Метод меняется на следующий рисунок, каков результат вывода?
public static void change(Person p) {
p.name="李四";
}
Я не буду говорить ответ, я думаю, что он должен быть очень ясным после внимательного прочтения вышеприведенного содержания.
Два == и равно (важно)
==: Его функция заключается в том, чтобы определить, равны ли адреса двух объектов. То есть определяется, являются ли два объекта одним и тем же объектом. (Базовый тип данных == сравнивает значение, ссылочный тип данных == сравнивает адрес памяти)
equals(): его функция также состоит в том, чтобы определить, равны ли два объекта. Но обычно у него есть два варианта использования:
- Случай 1: класс не переопределяет метод equals(). Сравнение двух объектов этого класса через equals() эквивалентно сравнению двух объектов через "==".
- Случай 2: класс переопределяет метод equals(). В общем, мы переопределяем метод equals(), чтобы сделать содержимое двух объектов равным; если их содержимое равно, вернуть true (т. е. считать два объекта равными).
Например:
public class test1 {
public static void main(String[] args) {
String a = new String("ab"); // a 为一个引用
String b = new String("ab"); // b为另一个引用,对象的内容一样
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
if (aa == bb) // true
System.out.println("aa==bb");
if (a == b) // false,非同一对象
System.out.println("a==b");
if (a.equals(b)) // true
System.out.println("aEQb");
if (42 == 42.0) { // true
System.out.println("true");
}
}
}
инструкция:
- Метод equals в String переопределен, поскольку метод equals объекта сравнивает адрес памяти объекта, а метод equals объекта String сравнивает значение объекта.
- При создании объекта типа String виртуальная машина ищет в пуле констант существующий объект с тем же значением, что и создаваемый, и если да, то присваивает его текущей ссылке. Если нет, заново создайте объект String в пуле констант.
Три hashCode и равные (важно)
Интервьюер может спросить вас: «Вы переписали hashcode и equals, почему вам нужно переопределить метод hashCode, когда вы переопределяете equals?»
Введение в hashCode()
Что делает hashCode(), так это получает хеш-код, также известный как хэш-код; на самом деле он возвращает целое число. Роль этого хеш-кода заключается в определении позиции индекса объекта в хэш-таблице. hashCode() определен в JDK Object.java, что означает, что любой класс в Java содержит функцию hashCode().
Хеш-таблица хранит пары ключ-значение, и ее характеристика заключается в том, что соответствующее «значение» может быть быстро извлечено по «ключу». Здесь используются хэш-коды! (можно быстро найти то, что нужно)
Почему hashCode
Мы берем «Как HashSet проверяет наличие дубликатов» в качестве примера, чтобы проиллюстрировать, почему существует hashCode:
Когда вы добавляете объект в HashSet, HashSet сначала вычисляет значение хэш-кода объекта, чтобы определить, куда добавляется объект, а также сравнивает его со значениями хэш-кода других добавленных объектов. hashcode, HashSet будет считать, что объект не дублируется. Но если будут найдены объекты с одинаковым значением хэш-кода, будет вызван метод equals(), чтобы проверить, действительно ли объекты с одинаковыми хэш-кодами одинаковы. Если они совпадают, HashSet не допустит успешной операции соединения. Если он отличается, он будет перефразирован в другом месте. (Отрывок из второго издания моей просветительской книги по Java "Head fist java"). Таким образом, мы значительно уменьшаем количество равных и, соответственно, значительно улучшаем скорость выполнения.
Соответствующие положения hashCode() и equals()
- Если два объекта равны, хэш-код также должен быть одинаковым.
- Если два объекта равны, вызов метода equals для обоих объектов возвращает значение true.
- Два объекта имеют одинаковое значение хэш-кода, они не обязательно равны
- Следовательно, если метод equals переопределен, метод hashCode также должен быть переопределен.
- Поведение hashCode() по умолчанию заключается в создании уникальных значений для объектов в куче. Без переопределения hashCode() два объекта этого класса в любом случае не будут равны (даже если два объекта указывают на одни и те же данные)
напиши в конце
Порекомендуйте свою собственную внутреннюю документацию с открытым исходным кодом
Java-Guide: Java-интервью Таможенное руководство (Руководство по изучению Java). звезда: 1,4к.
Адрес на гитхабе:GitHub.com/snail Climb/…
Позиционирование документа: документ с открытым исходным кодом, специально подготовленный для внутренних инженеров Java.Я считаю, что независимо от того, являетесь ли вы новичком в Java или уже стали инженером Java, вы можете извлечь из этого документа что-то полезное.
Бесплатный обмен ресурсами, связанными с интервью
Последние письменные тестовые вопросы для собеседования по Java за 17 лет + Коллекция собеседований по Java + Образец резюме с рекомендациями по трудоустройству, видео + Собеседование при приеме на работу в школу Java
Подпишитесь на общедоступную учетную запись WeChat «Руководство по прохождению интервью Java» и ответьте на «Интервью», чтобы получить его бесплатно!
Ссылаться на:
Блог Woohoo.cn на.com/sky.net 1234…
Блог Woohoo.cn на.com/sky.net 1234…
Блог Woo Woo.cn на.com/Eason-S/Afraid/5…
Если вы хотите получать больше моих оригинальных статей и качественных обучающих ресурсов, обратите внимание на мой публичный аккаунт WeChat: "Руководство по прохождению собеседования на Java". Здесь нет рутины, я надеюсь добиться прогресса вместе с вами и учиться друг у друга.