Не спрашивайте меня, как Али и Tencent контратаковали во время интервью! Последние распространенные вопросы на собеседовании по Java и основные вопросы (с подробными ответами) в 2020 году разобраны для вас.

Сборник последних общих вопросов для собеседований по Java в 2020 году (4)

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

Некоторые ответы резюмирую я, а некоторые собраны в Интернете. Не паникуйте после просмотра этих интервью! Если у вас есть больше опыта, вы можете поделиться им в комментариях. Если у вас есть ошибки, вы можете указать на них. Пожалуйста, дайте мне знать, спасибо ~

отражение

 44. Что такое отражение?


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

Можете ли вы узнать, какие атрибуты и методы у этого класса есть в среде выполнения Java для любого класса? Для любого объекта может быть вызван любой из его методов. Механизм
отражения Java в основном предоставляет следующие функции:

  •   Определите класс, к которому принадлежит любой объект во время выполнения.
  •   Создайте объект любого класса во время выполнения.
  • Оценивайте переменные-члены и методы любого класса во время выполнения.
  • Вызов любого метода объекта во время выполнения.

45. Что такое сериализация Java? При каких обстоятельствах нужна сериализация?


Проще говоря, он предназначен для сохранения состояния различных объектов в памяти (то есть переменных экземпляра, а не методов) и для чтения сохраненного состояния объекта. Хотя вы можете использовать свои собственные различные методы для сохранения состояний объекта, Java предоставляет вам механизм, который должен быть лучше вашего собственного для сохранения состояний объекта, то есть сериализацию.

При каких обстоятельствах нужна сериализация:

a) когда вы хотите сохранить состояние объекта в памяти в файл или базу данных;
b) когда вы хотите использовать сокеты для передачи объектов по сети;
c) когда вы хотите передать объекты через RMI ;

46. ​​Что такое динамический агент? Какие есть приложения?


Динамический прокси:

Если вы хотите добавить некоторую дополнительную обработку к методу в классе, реализующем интерфейс. Например, добавление журналов, добавление транзакций и т. Д. Вы можете создать прокси для этого класса, поэтому название предполагает создание нового класса.Этот класс не только содержит функции исходного метода класса, но также добавляет новый класс с дополнительной обработкой на исходной основе. Этот прокси-класс не определен, он создается динамически. Он имеет значение разъединения, гибкости и сильной масштабируемости.

Применение динамического агента:

  • Весна 的 AOP
  • Добавить дела
  • Добавить разрешения
  • Добавить журнал

47. Как реализовать динамический прокси?


Сначала должен быть определен интерфейс и класс обработки InvocationHandler (передающий объект класса, реализующего интерфейс).
Есть еще один инструментальный класс Proxy (его принято называть прокси-классом, потому что вызов его newInstance () может генерировать прокси-объект, по сути, это просто инструментальный класс, который генерирует прокси-объект). Используя InvocationHandler, соедините исходный код прокси-класса, скомпилируйте его для генерации двоичного кода прокси-класса, загрузите его с помощью загрузчика и создайте его для создания прокси-объекта и, наконец, вернитесь.

Копия объекта

48. Зачем нужно клонирование?


Если вы хотите обработать объект, но при этом хотите сохранить исходные данные для следующей операции, вам необходимо клонировать.Клон на языке Java предназначен для экземпляра класса.

49. Как реализовать клонирование объекта?


Есть два пути:

1) Реализуйте интерфейс Cloneable и перепишите метод clone () в классе Object;

2). Реализуйте интерфейс Serializable и реализуйте клонирование посредством сериализации и десериализации объекта, что может обеспечить истинное глубокое клонирование. Код выглядит следующим образом:
Ниже приводится тестовый код:


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class MyUtil {

    private MyUtil() {
        throw new AssertionError();
    }

    @SuppressWarnings("unchecked")
    public static <T extends Serializable> T clone(T obj) throws Exception {
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bout);
        oos.writeObject(obj);

        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bin);
        return (T) ois.readObject();

        // 说明:调用ByteArrayInputStream或ByteArrayOutputStream对象的close方法没有任何意义
        // 这两个基于内存的流只要垃圾回收器清理对象就能够释放资源,这一点不同于对外部资源(如文件流)的释放
    }
}
```

import java.io.Serializable;

/**
 * 人类
 * @author nnngu
 *
 */
class Person implements Serializable {
    private static final long serialVersionUID = -9102017020286042305L;

    private String name;    // 姓名
    private int age;        // 年龄
    private Car car;        // 座驾

    public Person(String name, int age, Car car) {
        this.name = name;
        this.age = age;
        this.car = car;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
    }

}
```

 

/**
 * 小汽车类
 * @author nnngu
 *
 */
class Car implements Serializable {
    private static final long serialVersionUID = -5713945027627603702L;

    private String brand;       // 品牌
    private int maxSpeed;       // 最高时速

    public Car(String brand, int maxSpeed) {
        this.brand = brand;
        this.maxSpeed = maxSpeed;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public int getMaxSpeed() {
        return maxSpeed;
    }

    public void setMaxSpeed(int maxSpeed) {
        this.maxSpeed = maxSpeed;
    }

    @Override
    public String toString() {
        return "Car [brand=" + brand + ", maxSpeed=" + maxSpeed + "]";
    }

}


 

class CloneTest {

    public static void main(String[] args) {
        try {
            Person p1 = new Person("郭靖", 33, new Car("Benz", 300));
            Person p2 = MyUtil.clone(p1);   // 深度克隆
            p2.getCar().setBrand("BYD");
            // 修改克隆的Person对象p2关联的汽车对象的品牌属性
            // 原来的Person对象p1关联的汽车不会受到任何影响
            // 因为在克隆Person对象时其关联的汽车对象也被克隆了
            System.out.println(p1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

Примечание. Клонирование на основе сериализации и десериализации - это не только глубокое клонирование, но, что более важно, с помощью общих ограничений вы можете проверить, поддерживает ли клонируемый объект сериализацию. Эта проверка выполняется компилятором, а не в Во время выполнения возникает исключение. Это решение, очевидно, лучше, чем использование метода clone класса Object для клонирования объектов. Всегда лучше выявить проблему во время компиляции, чем оставить ее во время выполнения.

 50. В чем разница между глубокой копией и мелкой копией?


Неглубокая копия просто копирует ссылочный адрес объекта. Два объекта указывают на один и тот же адрес памяти, поэтому, если какое-либо значение будет изменено, другое значение изменится соответственно. Это неглубокая копия (например: assign ())

Глубокая копия предназначена для копирования объекта и значения, два объекта изменяют любое значение, а другое значение не изменится. Это глубокая копия (например: JSON.parse () и JSON.stringify (), но этот метод не может скопировать функцию Типы)

В конце концов

В любом случае, помимо навыков проведения собеседований и опыта проведения собеседований с компаниями, сильные навыки и хороший опыт работы с проектами также являются их козырями и уверенностью. Совместное использование основных технологий производителями первого уровня

 Мне потребовалось много времени, чтобы разобрать некоторые учебные материалы. То, что я опубликовал выше, является верхушкой айсберга в материалах. Надеюсь, я смогу вам помочь! Нажмите, чтобы узнать секретный код вместе: csdn

 

Вот и все, что касается сегодняшнего контента. Я поделюсь с вами другими статьями, посвященными чистой галантереи, и надеюсь, что действительно помогу вам. Ваша поддержка - моя самая большая мотивация!

                                                                      

рекомендация

отblog.csdn.net/weixin_50333534/article/details/108741273