Сводка наиболее распространенных вопросов на собеседовании по Java — неделя 1

интервью Java задняя часть GitHub

Здесь я поделюсь некоторыми вопросами интервью, которые появляются очень часто.Первоначальное еженедельное обновление будет обновляться, и когда оно будет закончено и когда оно остановится.

Адрес на гитхабе: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()

  1. Если два объекта равны, хэш-код также должен быть одинаковым.
  2. Если два объекта равны, вызов метода equals для обоих объектов возвращает значение true.
  3. Два объекта имеют одинаковое значение хэш-кода, они не обязательно равны
  4. Следовательно, если метод equals переопределен, метод hashCode также должен быть переопределен.
  5. Поведение hashCode() по умолчанию заключается в создании уникальных значений для объектов в куче. Без переопределения hashCode() два объекта этого класса в любом случае не будут равны (даже если два объекта указывают на одни и те же данные)

напиши в конце

Порекомендуйте свою собственную внутреннюю документацию с открытым исходным кодом

Java-Guide: Java-интервью Таможенное руководство (Руководство по изучению Java). звезда: 1,4к.

Адрес на гитхабе:GitHub.com/snail Climb/…

Позиционирование документа: документ с открытым исходным кодом, специально подготовленный для внутренних инженеров Java.Я считаю, что независимо от того, являетесь ли вы новичком в Java или уже стали инженером Java, вы можете извлечь из этого документа что-то полезное.

Бесплатный обмен ресурсами, связанными с интервью

Последние письменные тестовые вопросы для собеседования по Java за 17 лет + Коллекция собеседований по Java + Образец резюме с рекомендациями по трудоустройству, видео + Собеседование при приеме на работу в школу Java

Подпишитесь на общедоступную учетную запись WeChat «Руководство по прохождению интервью Java» и ответьте на «Интервью», чтобы получить его бесплатно!

Ссылаться на:

blog.CSDN.net/Ищу 999/Ах…

Блог Woohoo.cn на.com/sky.net 1234…

Блог Woohoo.cn на.com/sky.net 1234…

Блог Woo Woo.cn на.com/Eason-S/Afraid/5…

Если вы хотите получать больше моих оригинальных статей и качественных обучающих ресурсов, обратите внимание на мой публичный аккаунт WeChat: "Руководство по прохождению собеседования на Java". Здесь нет рутины, я надеюсь добиться прогресса вместе с вами и учиться друг у друга.