2024 Интервью на Java, эссе из восьми частей, 50 000 слов (постоянно обновляется)
2024 Интервью на Java, эссе из восьми частей, 50 000 слов (постоянно обновляется)

**

1.Объектно-ориентированное программирование на Java: инкапсуляция, наследование и полиморфизм.

**

Язык кода:java
копировать
Самый полный набор вопросов для собеседования для крупных компаний в 2024 году. Монеты C не требуются. Нажмите здесь, чтобы загрузить или открыть полный набор вопросов для собеседования на веб-странице.
https://pan.quark.cn/s/865a0bbd5720
Инкапсуляция: сокрытие магии внутренней реализации

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

Как добиться инкапсуляции?
  1. Используйте модификаторы доступа:Объявите переменные-члены класса какprivate,чтобы скрыть детали его выбора.
  2. Предоставить публичный интерфейс:проходитьpublicметод(нравитьсяgetterиsetter)предоставить доступ частным членами Исправлять。
  3. Реализуйте скрытие информации:Инкапсуляция помогает уменьшить связь,Улучшите простоту обслуживания кода.
Преимущества инкапсуляции
  • Уменьшите связанность системы:проходитьспрятаться внутривыполнить,Уменьшить внешнюю зависимость от внутренней.
  • Повышение безопасности:предотвратить внешниевызовне должен быть доступен изнутриметод。
  • Простота обслуживания и расширения:Инкапсуляция делает Исправлятьвнутреннийвыполнитьчас,Внешневызовпрозрачный。
Наследование: мощный инструмент для повторного использования кода

Наследование — это еще одна основная концепция ООП, которая позволяет одному классу (называемому подклассом или производным классом) наследовать свойства и методы другого класса (называемого родительским или базовым классом).

Как использовать наследование?
  1. Определить базовый класс:Создайтеопределение Универсальныйсвойствоиметодсорт。
  2. производный подкласс:Создайтеновыйдобрый,Он проводит самостоятельный класс,и добавить или переопределить определенное поведение.
  3. использовать**extends**Ключевые слова:на Яве,ребенокдобрыйпроходитьextendsКлючевые слованаследоватьиз родительского класса。
Преимущества наследства
  • повторное использование кода:Уменьшите дублирующийся код,Повышение эффективности разработки.
  • Создайте иерархию:иметь助Всоздаватьпрозрачныйсортнаследоватьсистема。
  • Реализация полиморфизма:наследоватьда Реализация Основы полиморфизма.
Полиморфизм: гибкое планирование поведения

Полиморфизм — это третья основная концепция ООП, которая позволяет объектам разных классов отвечать на одно и то же сообщение, но конкретное поведение будет варьироваться в зависимости от фактического типа объекта.

Как реализовать полиморфизм?
  1. Определить интерфейс или абстрактный класс:Создайтеопределениегруппаметодизинтерфейсили абстрактный класс。
  2. Реализация полиморфизмадобрый:другойсортвыполнитьтакой жеизинтерфейсилинаследоватьстакой жеодинабстрактныйдобрый,Но предлагает другой интерьер, отвечающий требованиям.
  3. Используйте полиморфизм:проходитьинтерфейсилиотецдобрыйизвестииспользоватьвызовметод,Фактически выполняется соответствующий метод фактического типа объекта.
Преимущества полиморфизма
  • Повышение гибкости:позволять Волядругойизвыполнитьделатьдляодин Проходитьиспользоватьизинтерфейслечить。
  • Повышение масштабируемости:существовать Нет Исправлятьсейчасиметькодиз Состояние Вниз,Могут быть введены новые классы.
  • развязка:Волядобрыйиз ХОРОШОдляивыполнитьразделение,Улучшите сопровождаемость кода.

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

**

2. Разница между перегрузкой и перезаписью

**

Перегрузка

Перегрузка означает, что в одном классе можно определить несколько методов с одинаковым именем, но списки их параметров (тип и количество параметров) должны быть разными. Перегрузка — это проявление полиморфизма времени компиляции.

Перегрузкаиз Функции:

  1. Список параметров другой:Перегрузкаизметоддолженсуществоватьпараметризколичествоилидобрый По типуиметь Местоокруг Не。
  2. Возвращаемый тип не используется в качестве основы для перегрузки.:только Тип возвратадругой Список Способ сопоставления параметров не является Перегрузкой.
  3. Модификаторы доступа разные:Несмотря на тометодиз Модификаторы доступа разные, также могут образовывать Перегрузку.
  4. происходит в том же классе:Перегрузкадатакой жеодиндобрыйсерединаизметод Тяжелыйопределение。
  5. Анализ времени компиляции:компиляторсуществоватькомпилироватьчасв соответствии ссигнатура метода(методимяи Список параметров)решатьвызов Который Перегрузкаизметод。

Переопределение

переписать означает предоставление метода в подклассе, который имеет точно такую ​​же сигнатура метода, что и в родительском классе. переписать — это проявление Полиморфизма среды выполнения.

переписатьиз Функции:

  1. Та же подпись метода:ребенокдобрыйсерединапереписатьизметоддолжениотецдобрыйсерединаодеялопереписатьизметод Инструментиметьтакой жеизметодимяи Список параметров。
  2. Тип возвращаемого значения тот же или подтип:ребенокдобрыйметодиз Тип возврат должен совпадать с типом метода родительского класса. возврат тот же или подтип (ковариантный тип возврата)。
  3. Тот же или менее ограничительный доступ:ребенокдобрыйметодизправа доступ нельзя сравнивать с правами метода родительского класса Доступ более строгий.
  4. Происходит между родительским и дочерним классами:переписатьс участиемиздаотецребенокдобрыймеждуизсвязь。
  5. Анализ времени выполнения:JVMсуществовать运ХОРОШОчасв соответствии свернослониздействительныйдобрыйформарешатьвызов Которыйметод。
  6. может быть**final**、**static**или**private**Блокировка метода:нравитьсяфруктыотецдобрыйсерединаизметодобъявляется какfinal,тогда его нельзя будет использовать, переписав;нравитьсяфруктыобъявляется какstatic,тогда вам нужно переобъявить его в подклассе, используя тот же модификатор,это называется прятаться;нравитьсяфруктыобъявляется какprivate,тогда его нельзя будет использовать, переписав,Потому что частный метод не виден подклассам.

Краткое описание различий:

  • Объем:Перегрузкадатакой жеодиндобрыйиздругойметод,переписать — метод между родительским и дочерним классами.
  • Список параметров:Перегрузка Требовать Список параметров другой,Запрос на перезапись. Список параметров идентичен.
  • Тип возврата:Перегрузкаметодиз Тип возврат может быть разным,переписатьметодиз Тип возврат должен быть тем же или подтипом.
  • Реализация полиморфизмаиз Способ:Перегрузкадакомпилироватьчас Полиморфизм,переписать — это полиморфизм времени выполнения.
  • Время звонка:Перегрузка Зависит откомпиляторсуществоватькомпилироватьчасв соответствии ссигнатура Метод определения, перезаписи определяется JVM во время выполнения на основе типа объекта.

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

**

Принципы архитектурного проектирования

**

1. Принцип единой ответственности

Принцип единой ответственности (SRP) — важный принцип объектно-ориентированного проектирования. Он требует, чтобы у класса была только одна причина для его изменения. Другими словами, класс должен иметь только одну ответственность. Преимущество этого состоит в том, чтобы сделать дизайн класса более понятным, удобным в сопровождении и уменьшить влияние на другие классы.

Давайте проиллюстрируем принцип простым примером. единой ответственностиизотвечатьиспользовать。Предположим, мы разрабатываем систему управления студентами.,один из нихStudentдобрый Ответственный Указывает студентовизбазовыйинформация,Как показано ниже:

Язык кода:java
копировать
public class Student {
    private String name;
    private int age;
    private String address;

    // Конструктор、getterиsetterметодждать
}

этотStudentдобрый Ответственный Указывает студентовизбазовыйинформация,Укажите имя, возраст и адрес. Согласно принципу единой ответственности,Мы можем разделить его на отдельные классы,Каждый класс отвечает за свою ответственность. Например,мы можемк СоздайтеStudentInfoдобрый Приходить Ответственныйуправлятьстудентизбазовыйинформация,Как показано ниже:

Язык кода:java
копировать
public class StudentInfo {
    private String name;
    private int age;
    private String address;

    // Конструктор、getterиsetterметодждать    // Другая информация, связанная с основной информацией о студентах
}

Разделив обязанности,Мы можем лучше управлять и расширить систему управления студентами. так,Когда нам нужно изменить логику обработки основной информации учащихся,Просто нужно ИсправлятьStudentInfoдобрый,не затрагивая другие классы.

2. Принцип открытости-закрытости

Принцип открытости-закрытости (OCP) — это основной принцип разработки программного обеспечения. Он требует, чтобы программные объекты (классы, модули, функции и т. д.) были открыты для расширения и закрыты для модификации. Другими словами, мы должны расширять функциональность системы, добавляя новый код, а не изменяя существующий код.

Давайте проиллюстрируем принцип на примере открытости-закрытостиизотвечатьиспользовать。Допустим, у нас есть система обработки заказов.,один из нихOrderдобрый Ответственный Технологический заказодинизсоздаватьиплатить,Как показано ниже:

Язык кода:java
копировать
public class Order {
    private String orderId;
    private double amount;
    private boolean isPaid;

    // Конструктор、getterиsetterметодждать    public void createOrder() {
        // Логика создания заказов
    }

    public void makePayment() {
        // Логика платежных поручений
    }
}

Сейчас,Нам нужно добавить в заказ новую функцию: отправку покупателю письма с подтверждением. По принципу открытости-закрытости,我их Нетотвечать该прямойловить ИсправлятьOrderдобрыйизкод Приходитьвыполнитьэтотновый Функция,идаотвечать该проходить Расширять Приходитьвыполнить。мы можемк СоздайтеновыйсортOrderConfirmation,Ответственный Логика отправки письма с подтверждением,Как показано ниже:

Язык кода:java
копировать
public class OrderConfirmation {
    public void sendConfirmationEmail(String orderId) {
        // Логика отправки письма с подтверждением
    }
}

Таким образом, мы следуем принципу открытости-закрытости,проходить РасширятьOrderConfirmationдобрый Приходить Добавить письмо с подтверждением отправкииз Функция,и Нетда ИсправлятьOrderдобрыйизкод。

3. Принцип замещения Рихтера.

Принцип замены Лискова (LSP) — важный принцип объектно-ориентированного проектирования. Он требует, чтобы объекты подкласса могли заменять объекты родительского класса, не влияя на корректность программы. Другими словами, подкласс должен иметь возможность полностью заменить родительский класс и использоваться, не нарушая корректности программы.

Давайте проиллюстрируем Принцип на примере. замещения Рихтераизотвечатьиспользовать。Предположим, мыиметьодинграфикадобрыйизнаследоватьсистема,один из нихRectangleдобрый Представляет прямоугольник,Как показано ниже:

Язык кода:java
копировать
public class Rectangle {
    protected int width;
    protected int height;

    public Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int calculateArea() {
        return width * height;
    }
}

Сейчас,мы надеемсясуществоватьграфикадобрыйизнаследоватьсистемасерединадобавить водинновыйсортSquareПредставляет собой квадрат。в соответствии с Принцип замещения Рихтера,Мы должны гарантировать, что объект дочернего класса (квадрат) может заменить объект родительского класса (прямоугольник), не вызывая ошибок. Однако,нравитьсяфрукты我ихпрямойловить СоздайтеSquareдобрыйнаследоватьсRectangleдобрый,ипереписатьsetWidthиsetHeightметод,приведет к нарушению Принцип замещения Рихтера, потому что ширина и высота квадрата должны быть равны.

Чтобы следовать Принципу замещения Рихтера,Мы можем перепроектировать систему надзора,Например СоздайтеShapeдобрыйделатьдляотецдобрый,RectangleиSquareдобрый分НенаследоватьShapeдобрый,иобщийодинабстрактныйметодcalculateArea,Как показано ниже:

Язык кода:java
копировать
public abstract class Shape {
    public abstract int calculateArea();
}

public class Rectangle extends Shape {
    protected int width;
    protected int height;

    public Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }

    // getterиsetterметод

    public int calculateArea() {
        return width * height;
    }
}

public class Square extends Shape {
    protected int side;

    public Square(int side) {
        this.side = side;
    }

    // getterиsetterметод

    public int calculateArea() {
        return side * side;
    }
}

Таким образом мы поддерживаем согласованность иерархии наследования и гарантируем, что объект подкласса (квадрат) может заменить объект родительского класса (прямоугольник), не вызывая ошибок.

4. Принцип обращения зависимостей.

Принцип инверсии зависимостей (DIP) — важный принцип объектно-ориентированного проектирования. Он требует, чтобы модули высокого уровня не зависели от модулей низкого уровня, но оба должны опираться на абстракции. Другими словами, мы должны разделить модули высокого уровня и модули низкого уровня посредством абстракции и полагаться на абстракцию, а не на конкретную реализацию.

Давайте проиллюстрируем принцип на примере инверсии зависимостейизотвечатьиспользовать。Допустим, мы разрабатываем систему обработки заказов.,один из нихOrderProcessorдобрый Ответственный Технологический заказодин,Как показано ниже:

Язык кода:java
копировать
public class OrderProcessor {
    private Database database;

    public OrderProcessor() {
        this.database = new Database();
    }

    public void processOrder(Order order) {
        // Логика обработки заказов
        database.saveOrder(order);
    }
}

В приведенном выше примере,OrderProcessorдобрыйпрямойловитьполагаться ВИнструменттелоизDatabaseдобрый,в результате получаются модули высокого уровня(OrderProcessor)с низкоуровневыми модулями(Database)Существует тесная связь между。

Чтобы следовать принципу инверсии зависимостей,мы можемкпроходитьвести入абстрактный Приходитьразвязкамодуль высокого уровняимодуль низкого уровняизполагатьсясвязь。мы можемк СоздайтеабстрактныйизDatabaseинтерфейс,позволятьOrderProcessorдобрыйполагаться В该интерфейси Нетда Инструменттеловыполнитьдобрый,Как показано ниже:

Язык кода:java
копировать
public interface Database {
    void saveOrder(Order order);
}

public class OrderProcessor {
    private Database database;

    public OrderProcessor(Database database) {
        this.database = database;
    }

    public void processOrder(Order order) {
        // Логика обработки заказов
        database.saveOrder(order);
    }
}

public class MySQLDatabase implements Database {
    public void saveOrder(Order order) {
        // Логика сохранения заказов с использованием базы данных MySQL
    }
}

public class OracleDatabase implements Database {
    public void saveOrder(Order order) {
        // Логика сохранения заказов с использованием базы данных Oracle
    }
}

проходитьвести入абстрактныйизDatabaseинтерфейс,Мы будем использовать модуль высокого уровня(OrderProcessor)с низкоуровневыми модулями(Инструменттелоизбаза данныхвыполнитьдобрый)развязка,и полагается на абстракцию, а не на конкретные выборы. так,Мы можем легко переключаться между разными базами данныхвыполнить,вместо того, чтобыOrderProcessorдобрыйоказать влияние。

5. Принцип изоляции интерфейса

Принцип разделения интерфейсов (ISP) — важный принцип объектно-ориентированного проектирования, который требует, чтобы клиент не зависел от интерфейсов, которые ему не нужны. Другими словами, мы должны разделить большой интерфейс на маленькие интерфейсы и позволить клиенту полагаться только на те интерфейсы, которые ему нужны.

Давайте проиллюстрируем Принцип на примере. изоляции интерфейсаизотвечатьиспользовать。Предположим, у нас есть графический редактор,один из нихShapeинтерфейс Представлять графику,Как показано ниже:

Язык кода:java
копировать
public interface Shape {
    void draw();
    void resize();
    void rotate();
}

Сейчас,Мы хотим добавить новую функцию: цвет формы заливки. По принципу реализации интерфейса,Нам следует разделить большой интерфейс на маленькие интерфейсы.,Позвольте клиенту полагаться только на те интерфейсы, которые ему нужны. так,мы можемShapeинтерфейс Разделить наDrawableинтерфейсиResizableинтерфейс,Как показано ниже:

Язык кода:java
копировать
public interface Drawable {
    void draw();
}

public interface Resizable {
    void resize();
}

public interface Shape extends Drawable, Resizable {
    void rotate();
}

таким образом,мы будем большимиинтерфейсShapeРазделить на МаленькийинтерфейсDrawableиResizable,Позвольте клиентам зависеть только от тех интерфейсов, которые им нужны. так,Когда нам нужно добавить функцию заливки цветом,Просто нужнопозволятьграфикадобрыйвыполнитьDrawableинтерфейс Вот и все,Нет необходимости изменять существующий код.

6. Принцип синтеза и повторного использования

Принцип повторного использования композиции (CRP) — важный принцип объектно-ориентированного проектирования. Он требует использования композиции объектов вместо наследования для достижения цели повторного использования кода. Другими словами, нам следует отдавать приоритет использованию композиции объектов для построения систем, а не слишком полагаться на наследование.

Давайте проиллюстрируем Принцип на примере. синтетического повторного использованияизотвечатьиспользовать。Допустим, мы разрабатываем игру,один из нихCharacterдобрый Указывает на игрусерединаиз Роль,Как показано ниже:

Язык кода:java
копировать
public class Character {
    private Weapon weapon;

    public Character() {
        this.weapon = new Sword();
    }

    public void attack() {
        weapon.use();
    }
}

В приведенном выше примере,Characterдобрыйпроходитьнаследоватьисоздавать Инструменттелоизоружиедобрый(Sword)Приходитьвыполнить Функция атаки。Однако,Такой способ использования «наблюдать» может привести к трудностям при расширении и обслуживании системы.

Чтобы следовать Принципу синтетического повторного использования,мы можемкиспользоватьвернослонкомбинация Приходитьвыполнить Функция атаки。мы можемк СоздайтеWeaponинтерфейс,позволятьCharacterдобрыйкомбинацияодинвыполнить ПонятноWeaponинтерфейс

Разница между интерфейсом и абстрактным классом

на Яве,Интерфейси Абстрактный класс — это инструменты для выбора абстрактных понятий в объектно-ориентированном программировании. Все они могут использоваться для определения набора абстрактных методов, эти методы могут быть представлены классом проверки (реализация Класс) или подкласс (Subclass) для калибровки (предоставьте конкретную выборку). Несмотря на их сходство, между ними есть некоторые ключевые различия:

Интерфейс

  1. определение:интерфейсда Что-то вроде完全абстрактныйизконцепция,Он определяет набор абстрактных методов,Этиметодможет бытьвыполнитьдобрый Приходитьвыполнить。
  2. выполнить:одиндобрый МожеткиспользоватьimplementsКлючевые слова Приходитьвыполнитьодинили Несколькоинтерфейс。
  3. Конструктор:интерфейс Не могу иметь Конструктор。
  4. модификатор метода по умолчанию:существоватьJava 8иквпередиз Версиясередина,интерфейссерединаизметодпо умолчаниюдаpublic abstractиз,Не могу иметьметодтело。С Явы Начиная с версии 8, интерфейсы могут содержать метод по умолчанию (публичный с телом метода staticметод)истатическийметод。
  5. свойство:интерфейссерединаизсвойствопо умолчаниюдаpublic static finalиз,Это постоянно.
  6. множественное наследование:одиндобрый Можетквыполнить Несколькоинтерфейс,этотдаJavaвыполнитьмножественное наследование пути.
  7. иерархия классов:интерфейсне сформированиерархия классов。

Абстрактный класс

  1. определение:абстрактныйдобрыйда Что-то вроде Содержит абстрактный методсорт,Это может быть либо абстрактный метод, либо конкретный метод.
  2. выполнить:одиндобрый МожеткпроходитьextendsКлючевые слованаследоватьодинабстрактныйдобрый。
  3. Конструктор:абстрактныйдобрый Можеткиметь Конструктор。
  4. модификатор метода по умолчанию:абстрактныйдобрыйсередина Можеткиметьабстрактныйметод(Нетметодтело)и Инструменттелометод(иметьметодтело)。
  5. свойство:абстрактныйдобрыйсерединаизсвойство Нетпо умолчаниюизмодификатор,Требует явного объявления.
  6. множественное наследование:одиндобрыйможет тольконаследоватьодинабстрактныйдобрый,Потому что Java не поддерживает класс множественного нахождения.
  7. иерархия классов:абстрактныйдобрыйформаиерархия часть классов.

Краткое описание различий:

  • уровень абстракции:интерфейсда完全абстрактныйиз,А абстрактные классы могут содержать конкретные методы заполнения.
  • выполнить Способ:добрыйпроходитьimplementsвыполнитьинтерфейс,проходитьextendsнаследоватьабстрактныйдобрый。
  • Конструктор:интерфейс Не могу иметь Конструктор,Могут быть абстрактные классы.
  • методвыполнить:интерфейссерединаизметодпо умолчаниюдаабстрактныйиз,прямойприезжатьJava Только 8 разрешено иметь метод по умолчанию, а статические абстрактные классы могут иметь абстрактный и конкретный метод;
  • свойство:интерфейсизсвойствопо умолчаниюдапостоянный,В абстрактном классе нет модификатора по умолчанию для свойства.
  • множественное наследование:одиндобрый Можетквыполнить Несколькоинтерфейс,Но вы не можете иметь несколько абстрактных классов.
  • иерархия классов:абстрактныйдобрыйформаиерархия классов,иинтерфейсне сформирован。

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

  • Когда вы сосредотачиваетесь на кодексе поведения, а не на конкретных задачах,использоватьинтерфейс。
  • Когда вам нужно поделиться кодом,Или когда вам нужно определение какого-то конкретного методавыполнить,Используйте абстрактные классы.

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

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

Обобщение

Отношение обобщения обычно относится к отношению наследования, то есть один класс (подкласс или производный класс) наследует свойства и методы другого класса (родительского класса или базового класса). Эти отношения устанавливают отношения «есть-а».

Функции отношения обобщения:

  • наследовать:ребенокдобрыйнаследоватьотецдобрыйиз Местоиметьобщественныйизащищенныйизсвойствоиметод。
  • Полиморфизм:ребенокдобрый Можетк Расширятьилипереписатьотецдобрыйизметод,Реализация полиморфизм.
  • права доступа:ребенокдобрый Можеткдоступотецдобрыйсередина Местоиметь Нетяиметьизчлен。
  • одинокийнаследовать:на Яве,Каждый класс может иметь только один прямой родительский класс.,То есть Java не поддерживает классы Мультиплексна.

Выполнение

Отношения реализации относятся к реализации класса одного или нескольких интерфейсов. Эти отношения устанавливают отношения «может быть» или «подобно».

выполнитьсвязьиз Функции:

  • интерфейсвыполнить:одиндобрыйвыполнить Понятноинтерфейссерединаопределениеиз Местоиметьметод,отипоставлять Понятноинтерфейсзаявлениеиз ХОРОШОдля。
  • Мультиплексвыполнить:одиндобрый Можетквыполнить Несколькоинтерфейс,этотдаJavaвыполнитьмножественное наследование пути.
  • абстракция:интерфейсда完全абстрактныйиз,Они не предоставляют конкретных алгоритмов для метода.,Определялась только подпись метода.
  • гибкость:выполнитьсвязьпоставлять Понятно Что-то вродемеханизм,Классу разрешено иметь несколько абстрактных типов.

разница:

  1. Тип отношений:обобщатьсвязьда Что-то вродеособенныйизвыполнитьсвязь,Чтосерединаребенокдобрыйдаотецдобрыйизспециализация。выполнитьсвязьдадобрыйиинтерфейсмеждуизассоциация。
  2. наследовать:Отношения обобщения включают в себянаследовать,И отношения отбора не предполагают наблюдения.
  3. Мультиплекс:обобщатьсвязьсередина,JavaНе поддерживается Мультиплекснаследовать,новыполнитьсвязьпозволятьодиндобрыйвыполнить Несколькоинтерфейс。
  4. выполнить Способ:обобщатьсвязьпроходитьextendsКлючевые словавыполнить,выполнитьсвязьпроходитьimplementsКлючевые словавыполнить。
  5. Цель:Обобщение используется для построениянаследоватьсистема,выполнитьсвязьиспользовать Вопределениегруппаможет быть Несколькодобрыйвыполнитьизинтерфейс。

соединять:

  • Полиморфизм:Оба поддерживаются Полиморфизм。существоватьобобщатьсвязьсередина,Объектами подкласса можно манипулировать посредством ссылок на родительский класс в отношениях выбора;,Можеткпроходитьинтерфейсвестииспользовать Приходить操делатьвыполнить Понятноинтерфейссортизвернослон。
  • принципы проектирования:этоих Вседа Длявернослонпринципы проектированияизтелосейчас,Помогает уменьшить сцепление,Улучшите возможность повторного использования и сопровождения кода.

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

тип данных

Java — статически типизированный язык, а это означает, что типы всех переменных необходимо определять во время компиляции. Java предоставляет два основных типа данных: базовый типиссылочный тип.

базовый тип

базовый тип — самый простой тип в Java данные, которые непосредственно соответствуют наименьшей единице данных компьютера. В Java имеется восемь типов базовых тип:

  1. целочисленный типbyte, short, int, long
  2. тип с плавающей запятойfloat, double
  3. Тип персонажаchar
  4. Логический типboolean

ссылочный тип

ссылочный тип — это ссылки на объекты, они указывают на объекты в памяти. На Java, кроме базового Все, кроме типа, является ссылочным. тип,включатьдобрый、интерфейс、Массив и т. д.

Подробный анализ основных типов.

целочисленный тип

целочисленный тип используется для представления целочисленных значений.,Их размер в памяти фиксирован. Например,intдобрыйформа占использовать4байты(32Кусочек),Может представлять целые числа от -2^31приезжать2^31-1.

Язык кода:java
копировать
int number = 10; // Правильное целочисленное присваивание
int largeNumber = 2147483647; // Назначение максимального значения
// int tooLargeNumber = 2147483648; // Присваивание вне диапазона приведет к ошибке компиляции.

тип с плавающей запятой

тип с плавающей запятойиспользовать В表示иметь Маленькийчисло点изчислоценить。floatдобрыйформа占использовать4байты,иdoubleдобрыйформа占использовать8байты,Последнее обеспечивает большую точность.

Язык кода:java
копировать
float pi = 3.14f; // Назначение типа поплавка
double piDouble = 3.141592653589793; // Присвоение типа double

Тип персонажа

charдобрыйформаиспользовать В表示одинперсонажи,это занимает2байты。Тип персонаж представлен одинарными кавычками.

Язык кода:java
копировать
char letter = 'A'; // Тип Назначение персонажа

Логический тип

booleanдобрыйформаиспользовать В表示логикаценить,это Толькоиметьдва Может能изценить:trueиfalse

Язык кода:java
копировать
boolean isTrue = true; // Логический Присвоение типа

Секрет ссылочных типов

ссылочный тип — более продвинутая концепция в Java.,Они указывают на объекты в памяти. на Яве,Все объекты управляются посредством ссылок.

Язык кода:java
копировать
String name = "Java"; // Строка является ссылочным тип

преобразование типов

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

Язык кода:java
копировать
int number = 10;
long largeNumber = number; // Скрытыйпреобразование типов

Тип продвижения

в некоторых случаях,Когда в операциях участвуют значения разных типов,较Маленькийизтип данные автоматически преобразуются в больший тип данных, этот процесс называется Тип продвижения。

Язык кода:java
копировать
int number = 10;
double pi = 3.14;
double result = number / pi; // Результат - двойной тип

тип данныхизотвечатьиспользовать

В реальном программировании выберите соответствующий тип данныхдляпроизводительностьи Управление памятьюключевой Тяжелыйхотеть。Например,Если вы знаете, что значение никогда не превысит 255,Такиспользоватьbyteдобрыйформавстреча СравниватьиспользоватьintЭкономьте больше памяти。

Язык кода:java
копировать
byte smallNumber = 10; // Использовать тип байта

на Яве,базовый тип(primitive типы) и типы оберток (обертка типы) является обычной операцией. базовый тип — оригинальный тип Java данных, а тип упаковки — базовый тип инкапсуляции, это классы в пакете java.lang.

базовый тип(Primitive Types):

  • boolean
  • byte
  • short
  • int
  • long
  • float
  • double
  • char

Типы оберток:

  • Boolean
  • Byte
  • Short
  • Integer
  • Long
  • Float
  • Double
  • Character

Автобокс и распаковка:

С Явы Начиная с 5 версии в Java появилась возможность распаковки автобоксов, что позволило использовать автозовый Типы могут автоматически конвертироваться между соответствующими типами упаковки.

Автобокс:

базовый тип конвертируется в соответствующий тип упаковки.

Язык кода:java
копировать
Integer integerObject = 123; // intприжатезInteger автобокс
Автоматическая распаковка:

Упаковкапреобразование тип — соответствующий базовый тип。

Язык кода:java
копировать
int intValue = integerObject; // Integerприезжатьintиз Автоматическая распаковка

Явная упаковка и явная распаковка:

Хотя распаковка автобокса очень удобна, иногда приходится делать преобразование типа явно.

Явный бокс:

использовать УпаковкадобрыйформаизстатическийметодvalueOf()Упаковка。

Язык кода:java
копировать
Integer integerObject = Integer.valueOf(123); // Явный бокс
Явная распаковка:

использовать УпаковкадобрыйформаизxxxValueметод Распаковка。

Язык кода:java
копировать
int intValue = integerObject.intValue(); // явная распаковка

Что следует отметить:

  1. производительность:частоиз Упаковкаи Распаковка может повлиятьпроизводительность,Особенно в цикле,Потому что это предполагает создание жилых объектов и сбор мусора.
  2. нулевое значение:Упаковкадобрыйформа Можеткдляnull,ибазовый типа не могу. В разработке Автоматическая распаковкачас,если тип оболочки равен нулю,броситNullPointerException
  3. Сравнивать:Упаковкадобрыйформаиз Сравниватьс участиемприезжатьвернослонизвестииспользовать Сравнивать,Если вы хотите Скорректировать два значения обернутого типа,отвечать该использоватьequals()метод。для浮点число,Из-за проблем с точностью,Будьте осторожны при выравнивании.
  4. кэш:С Явы 5 стартов,Integerдобрыйиметьодинкэшмеханизм,Имеет целочисленные значения от -128приезжать127. При доступе к целочисленному значению в этом диапазоне,Собственно возвращает объект в кэш,Вместо того, чтобы каждый раз создавать новые объекты.

Пример:

Язык кода:java
копировать
public class BoxingUnboxingExample {
    public static void main(String[] args) {
        // автобокс
        int num = 100;
        Integer wrapper = num; // автобокс

        // Автоматическая распаковка
        int number = wrapper; // Автоматическая распаковка

        // Явный бокс
        Integer wrapper2 = Integer.valueOf(100);

        // явная распаковка
        int number2 = wrapper2.intValue();

        // Используйте метод равенства()Сравнивать для переноса значений типа
        Integer a = 10;
        Integer b = 10;
        Integer c = 200;
        boolean areEqual = (a.intValue() == b.intValue()); // true
        boolean areNotEqual = (a.equals(c)); // false
    }
}

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

Язык кода:java
копировать
   private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }
 @HotSpotIntrinsicCandidate
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

должен быть интернирован: задержан

Вставьте сюда описание изображения
Вставьте сюда описание изображения
Язык кода:java
копировать
/**
     * Cache to support the object identity semantics of autoboxing for values between
     * -128 and 127 (inclusive) as required by JLS.
     *
     * The cache is initialized on first usage.  The size of the cache
     * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
     * During VM initialization, java.lang.Integer.IntegerCache.high property
     * may be set and saved in the private system properties in the
     * jdk.internal.misc.VM class.
     */
/**
*кэш для поддержки семантики идентификации объектов для значений между автобоксами
*-128и127 (включительно), согласно требованиям JLS.
*
*кэш инициализируется при первом использовании. размер кэша
*может быть{@code-XX:AutoBoxCacheMax=<size>}Управление опциями。
*Во время инициализации виртуальной машины java.lang.Integer. IntegerCache.highсвойство
* Может быть настроен и сохранен в специальном системном свойстве.
*jdk.internal.misc. Класс ВМ.
*/

В Java-программировании,верноIntegerвернослонизсоздаватьииспользоватьдаобщийиз操делать。Однако,Многие застройщики могут не осознавать, что приезжать,проходитьдругойизметодсоздаватьIntegerвернослон,Механизм восстановления и его воздействие могут быть совершенно разными.

Механизм пула кэша

JavaдляIntegerдобрыйпоставлять Понятноодинкэшбассейн,существоватьInteger.valueOf(int i)методизвыполнитьсередина,Имеется внутренний кэш-механизм. Согласно спецификации автобокса Java,Integer.valueOf()методвстречакэшот-128приезжать127в пределах досягаемостиизIntegerвернослон。

Integer.valueOf(int i)изкэшлогика:
  • нравитьсяфрукты输入изintценитьсуществовать-128приезжать127между(включать-128и127),valueOf()методвернеткэшизвернослон。
  • нравитьсяфрукты输入изintценитьвнеэтотобъем,valueOf()метод Воля СоздайтеновыйизIntegerвернослон。
new Integer(int i)из ХОРОШОдля:
  • несмотря ни на чтоintценитьда Что,new Integer(int i)общийдавстреча СоздайтеновыйизIntegerвернослон Пример。
Вопросы производительности

использоватьInteger.valueOf()и Нетдапрямойловитьиспользоватьnewоператор может уменьшитьиспользование памятиисбор мусораизнакладные расходы,特Недакогда Обработка больших объемовIntegerвернослончас,В частности, их значения сосредоточены в вышеупомянутом кэш-диапазоне.

Реальная демонстрация кейса
Случай1:СравниватьvalueOfиnewизпроизводительность
Язык кода:java
копировать
public class IntegerCachingDemo {
    public static void main(String[] args) {
        int number = 127;

        Integer i1 = new Integer(number);
        Integer i2 = Integer.valueOf(number);

        System.out.println("i1 == i2 ? " + (i1 == i2)); // выход правда, потому что valueOf возвращает объект кэша

        int anotherNumber = 128;
        Integer i3 = new Integer(anotherNumber);
        Integer i4 = Integer.valueOf(anotherNumber);

        System.out.println("i3 == i4 ? " + (i3 == i4)); // выход false, поскольку valueOf не имеет значения, создается новый объект кэша
    }
}
Случай2:циклсоздавать МногоIntegerвернослон
Язык кода:java
копировать
public class IntegerLoopCreation {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();

        for (int i = 0; i < 200; i++) {
            // Используйте valueOf() для создания целочисленного объекта в диапазоне кэша.
            list.add(Integer.valueOf(i));
            // Использование new для создания целочисленного объекта создаст новый объект даже в пределах диапазона кэша.
            list.add(new Integer(i));
        }
    }
}

на Яве,базовый типверноотвечатьизбуфербассейн主хотетьобратитесь киздаIntegerдобрыйизкэшбассейн,потому чтодля Что他избазовый тип(нравитьсяint, long, doubleждать)и Нет Инструментиметьдобрыйпохожийизкэшмеханизм。этоткэшбассейнда Зависит отJavaвиртуальная машина(JVM)сдвигатьсяуправлятьиз,цельсуществоватьулучшатьпроизводительность,特Недасуществоватьсоздавать Многотакой же整числоценитьизIntegerвернослончас。

Integerкэшбассейниз工делать Оригинал理:

  1. диапазон кэша:в соответствии сJavaизавтобоксспецификация,Integer.valueOf(int i)иInteger.valueOf(String s)методвстречакэшот-128приезжать127(включать-128и127)изIntegerвернослон。
  2. автобокс:когдаавтобоксодинintценитьприезжатьIntegerвернослончас,Если значение находится в пределах кэша,будет использовать экземпляр в кэшпуле,и Нетдакаждый развызов Все Создайтеновыйизвернослон。
  3. Автоматическая распаковка:иавтобокс Взаимноверноотвечать,Автоматическая распаковкаодинIntegerвернослончас,Если объект является объектом в кэшпуле,Так Распаковканазадизintценить Воляпрямойловитьобратитесь к КэтоткэшизIntegerвернослон。
  4. размер кэшпула:кэшбассейниз大Маленькийдазафиксированныйиз,Не меняется при изменении размера кучи JVM.
  5. Безопасность резьбы:потому чтокэшбассейниз大Маленькийиметьпредел,А в многопоточной среде может быть несколько потоков, пытающихся получить один и тот же объект кэша.,Таким образом, JVM обеспечивает безопасность кэш-пула.

Методы, связанные с пулом кэша:

  • Integer.valueOf(int i):нравитьсяфруктыпараметрiсуществовать-128приезжать127между,этотметодвернетсякэшбассейнсерединаизIntegerвернослон。
  • Integer.valueOf(String s):Волянитьпараметр Конвертироватьдляintценить,ивозвращатьсяверноотвечатьизIntegerвернослон,Также будет использоваться кэш-пул.
  • Integer.valueOf()из Что他Перегрузка Версия:нравитьсяловить受longfloatdoubleждатьдобрыйформаизпараметр,Но они не будут использовать кэш-пул.

Сценарии использования кэш-пула:

Пул кэша в основном используется в следующих сценариях:

  1. Часто создавайте ** с одним и тем же целочисленным значениемInteger**Объект:Например,Поле идентификатора в операциях с базой данных,Или целое значение в элементе конфигурации.
  2. Класс коллекции:существоватьиспользоватьнравитьсяHashSetHashMapждать Класс коллекциичас,нравитьсяфруктыключилиценитьдаIntegerдобрыйформа,Кэш-пул может уменьшить использование памяти и повысить производительность.

Что следует отметить:

  1. лимит кэшпула:потому чтокэшбассейниз大Маленькийпредел制,Для целочисленных значений вне диапазона,каждый разсоздаватьIntegerвернослончас Всевстреча生成новыйиз Пример。
  2. использование памяти:Многоиспользоватькэшбассейн Может能встреча ВлияниеJVMизиспользование памяти,尤Чтодасуществоватьразмер кэшпула Нет足кудовлетворять потребностичас。
  3. производительностьтест:в некоторых случаях,Использование кэш-пула может повысить производительность.,но в других случаях,Значительного улучшения производительности может и не быть. поэтому,Для приложений, чувствительных к производительности,Рекомендуется провести тест производительности.

Демо-версия связанного случая:

Язык кода:java
копировать
public class IntegerCacheDemo {
    public static void main(String[] args) {
        Integer int1 = 123;
        Integer int2 = 123;

        System.out.println(int1 == int2); // выход false, потому что 123 находится вне диапазона кэш-пула

        Integer int3 = Integer.valueOf(123);
        Integer int4 = Integer.valueOf(123);

        System.out.println(int3 == int4); // выход true, потому что valueOf использует кэш-пул
    }
}

В этом примере,прямойловитьиспользоватьnew Integer(123)создаватьиздвавернослонint1иint2Нет Взаимнождать,потому чтодляэтоихдадвадругойиз Пример。ииспользоватьInteger.valueOf(123)создаватьиздвавернослонint3иint4Взаимнождать,Потому что они ссылаются на один и тот же экземпляр в кэш-пуле.

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

В Java-интервью,Stringдобрый Частыйда Интервьюеры любят обсуждатьиз Одна из тем,Потому что оно включает в себя не только основы приезжать на Java.,возвращатьсяипроизводительность Оптимизация тесно связана с。к Внизда Некоторый关ВStringиз Тяжелыйхотеть Очки знанийа такжесуществоватьразработка проектасерединаотвечатькогдаизбегатьизошибка。

JavaсерединаStringиз Очки знаний на собеседовании:

Строки являются константами; их значения не могут меняться после них.

*создавать. Строковые буферы поддерживают изменяемые строки.

*Поскольку объекты String неизменяемы, их можно использовать совместно.

  1. НеизменяемостьStringвернослон一旦создавать,Его значение невозможно изменить.
  2. Пул строковых констант:существоватьJVMсередина,Строковые константы будут храниться в Пуле строковых констант.,для экономии места в памяти.
  3. Конкатенация строк:существоватьциклсерединаиспользовать+操делать符соединятьнитьвстречапривести кпроизводительностьвопрос,потому чтодлякаждый разцикл Всевстреча СоздайтеновыйизStringвернослон。рекомендоватьиспользоватьStringBuilderилиStringBuffer
  4. equals() метод:для строки сравненияизсодержаниеданет Взаимнождать。
  5. hashCode() метод:возвращатьсянитьиз Хэшценить,Определяется содержимым строки.
  6. substring() метод:возвращатьсянитьизребенок串。
  7. indexOf() и lastIndexOf() метод:分Невозвращатьсяобратитесь к定字符илиребенок串существоватьэтотнитьсерединапервыйибольшинствоназад一次出сейчасиз索вести。
  8. trim() метод:去удалятьнить两конециз Пробелы。
  9. valueOf() метод:Воля Что他вернослон Конвертироватьдлянить形式。
  10. split() метод:в соответствии с分隔符分割нить。
  11. replace() и replaceAll() метод:分Не替换нитьсерединапервый出сейчасизи Местоиметьсоответствоватьизребенок串。
  12. toLowerCase() и toUpperCase() метод:Волянить Конвертироватьдля Маленький写иликапитал。
  13. isEmpty() метод:исследоватьнитьданетдлянулевой。
  14. length() метод:возвращатьсянитьиздлина。
  15. intern() метод:Волянитьвернослони Пул строковых константа С сравнением, если строка уже существует в пуле констант, вернуть ссылку в пул констант на объект。

Ошибки, которых следует избегать при разработке проекта:

  1. Избегайте создания строк в циклах:нравитьсявперед Место述,Это приводит к большому потреблению памяти и сбору мусора.
  2. избегатьиспользовать**new String("...")**:этотвстречасоздавать Нет必хотетьизновыйнитьвернослон,ииспользоватьоригинальныйстроковый литерал Можеткпрямойловитьвестииспользовать Пул строковых Объекты в константе.
  3. Избегайте использования строки Сравнитьиспользовать**==**оператор:этотвстречаисследоватьссылка на объектданет Взаимнождать,и Нетданитьизсодержание。отвечать该использоватьequals()метод。
  4. Избегайте пропуска ** в строковых операциях.null**исследовать:существоватьвызовнитьизметод До,отвечатьубеждатьсянить Нетдляnull,кизбегатьNullPointerException
  5. избегатьиспользовать**String** как ключ коллекции:потому чтоStringиз Неизменяемость,это Нетчастоподходящий合делатьдлясобиратьизключ。нонравитьсяфрукты你использовать ПонятноодиннаследоватьсStringиз Может变добрыйделатьдляключ,Тогда требование неизменности коллекции может быть нарушено.
  6. Избегайте использования в многопоточной среде**StringBuffer**:StringBufferизметод Нетда Безопасность резьбыиз。существоватьэтотдобрый Состояние Вниз,отвечатьиспользоватьStringBuilder(нравитьсяфруктынитьизобщий Нет Тяжелыйхотеть)илиReentrantLockиAtomicReferenceждатьтакой же步механизм。
  7. избегатьиспользовать**String** для хранения конфиденциальной информации:потому чтонитьна Яведак Хранится в виде открытого текстаиз,Информация может попасть в журналы, дампы кучи или отладки.
  8. избегатьиспользовать**String**Выполнение операций, чувствительных к производительности.:Например,Нетхотетьсуществовать Многочисло据начальствоиспользоватьStringВыполнить поиск подстроки,Вместо этого рассмотрите возможность использования специализированной библиотеки.,Например, Apache Commons Lang.
  9. Избегайте**switch**заявлениесерединаиспользовать**String**:ХотяJava 7начинатьподдерживатьсуществоватьswitchзаявлениесерединаиспользоватьString,Но в ситуациях, чувствительных к производительности,использоватьif-elseможет быть более эффективным。
  10. избегатьиспользовать**String**Внутреннее знание классов для оптимизации кода:Например,Полагайтесь на Неизменяемость строки, чтобы избежать синхронизации.,Это может привести к созданию кода, который будет сложно понять и поддерживать.

проходитьверно ЭтиStringВзаимно关из Очки знанийиобщийизошибкаиметьглубокийпонимать,Можете продемонстрировать свое владение основами Java во время собеседований.,В то же время это также может улучшить качество кода при разработке проектов.

Язык кода:java
копировать
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
/**
     * The value is used for character storage.
     *Это значение используется для хранения символов.
     * @implNote This field is trusted by the VM, and is a subject to
     * constant folding if String instance is constant. Overwriting this
     * field after construction will cause problems.
     *
     * Additionally, it is marked with {@link Stable} to trust the contents
     * of the array. No other facility in JDK provides this functionality (yet).
     * {@link Stable} is safe here, because value is never null.
     */
    @Stable
    private final byte[] value;
/**
*{@code Класс String} представляет строку. все
*Строковые литералы в программах Java, такие как {@code "abc"},
*выполнить — пример данной категории.
</p>
*Строки являются константами; их значения не могут меняться после них.
*создавать. Строковые буферы поддерживают изменяемые строки.
*Поскольку объекты String неизменяемы, их можно использовать совместно.。Например
*<blockquote><pre>
*String str="abc";
*</pre></blockquote><p>
*Эквивалент:
*<blockquote><pre>
*char-data[]={'a','b','c'};
*String стр = новая строка (данные);
*</pre></blockquote><p>
*Вот еще несколько советов о том, как использовать строки:
*<blockquote><pre>
*System.out.println(“abc”);
*Строка cde="cde";
*System.out.println(“abc”+cde);
*String c = "abc".substring(2,3);
*String d=cde.substring(1,2);
*</pre></blockquote>
</p>
*Класс {@code String} включает метод для проверки
*Последовательность одиночных символов, для строки Сравнивать, для
* Поиск строки, извлечение подстроки и создание
* Копия строки, в которой все символы переведены в верхний регистр или
*нижний регистр. Отображение регистра основано на стандартной версии Unicode.
*По {@link java.lang.Character Символ} указан класс.
</p>
*Язык Java обеспечивает специальную поддержку строк.
*Оператор конкатенации(+&),использовать Виз Конвертировать
*Преобразуйте другие объекты в строки. Дополнительная информация о строках
*Подключайтесь и конвертируйте,Видеть<i>The Java&trade;языкспецификация</i>。
*
*<p>удалять Нет Другойиметьиллюстрировать,В противном случае это будет{@code null} параметр, передаваемый конструктору
* или метод приведет к {@link NullPointerException}
*Бросили.
*
*<p>{@code String} представляет строку в формате UTF-16.
*Чтосередина<em>Дополнительные персонажи</em>Зависит от<em>Представительство агента
*верно</em>(Видетьunicodeчасть
*{@код Character}добрыйсерединаизпредставление персонажа</a>
*Подробнее).
*Значение индекса относится к кодовой единице {@code-char}, поэтому оно добавляется
*Символы в {@code В String используются две позиции}.
*<p>{@code String} класс обеспечивает обработку
*Кодовые точки Unicode (т.е. символы) и
* Обрабатывает единицы кода Юникода (т. е. значения {@code-char}).
*
*<p>удалять Нет Другойиметьиллюстрировать,в противном случаедля строки сравненияизметод Не используйте локаль
*Принято к сведению. {@связь метод, предоставляемый классом java.text.Colletor}
* Детализированная, чувствительная к локали строка Сравнивать.
*
*@implNote Оператор конкатенации строк выборочно оставлен
*По усмотрению компилятора Java, если компилятор в конечном итоге соответствует
*приезжать<i>Java&trade;языкспецификация</i>。Например,{@code javac} компилятор
*Вы можете использовать {@code StringBuffer}、{@code String Builder}、{@codeStringBuffer}Приходитьвыполнитьоператор,
*или{@код java.lang.invoke.StringConcatFactory}, в зависимости от версии JDK. этот
* Преобразование строк калибровки обычно осуществляется с помощью метода {@code-toString},
* По {@code-Object}определению и всем классам Java на соответствие.
*
*@authorLee Boynton
*@authorАртур van Hoff
*@authorМартин Buchholz
*@authorUlf Zibis
*@См. java.lang.Object#toString()
*@См. java.lang.StringBuffer
*@См. java.lang.StringBuilder
*@См. java.nio.charset. Кодировка
*@С версии 1.0
*@jls 15.18.1Конкатенация строковый оператор+
*/

на Яве,Базовый тип данных(primitive types)самда Безопасность резьбы, потому что они неизменяемы. Это означает, что когда-то базовый тип После создания данных их значение невозможно изменить. Однако, когда несколько потоков совместно используют и изменяют одну и ту же базу Безопасность появится при обращении к данным резьбывопрос. Ниже приведен основной тип в Java. данных:

  1. boolean - Логический тип имеет только два возможных значения: true и false.
  2. byte - 8-битное целое число со знаком в диапазоне от -128 приезжать 127。
  3. short - 16-битное целое число со знаком в диапазоне от -32,768 приезжать 32,767。
  4. int - 32-битное целое число со знаком в диапазоне от -2,147,483,648 приезжать 2,147,483,647。
  5. long - 64-битное целое число со знаком в диапазоне от -2^63 приезжать 2^63-1。
  6. float - 32-битное число одинарной точности с плавающей запятой.
  7. double - 64-битное число двойной точности с плавающей запятой.
  8. char - 16-битные символы Юникода.

Это основы данныхизпеременнаяда Безопасность резьбы, поскольку их значения не могут быть изменены после присвоения. Но если у вас есть указатель на эти основные типы Ссылка на массив данных, и несколько потоков могут получить доступ к этому массиву, то этот массив не является Безопасностью. резьбы, потому что разные потоки могут независимо изменять разные элементы массива.

Кроме того, хотя базовый тип данныхсамда Безопасность потоки, но эти типы операций, связанных с перемещением (например, вычисления и обновления), могут привести к ошибке в безопасности в многопоточной среде. Проблемы с резьбами, особенно когда несколько потоков пытаются одновременно изменить одну и ту же переменную. Чтобы обеспечить безопасность резьбы,Может能需хотетьиспользоватьтакой же步код块、Замок、Атомарные переменные(нравитьсяAtomicInteger)или Что他иконтроль волосмеханизм。

Пример:

Язык кода:java
копировать
public class ThreadSafeExample {
    private int counter = 0;

    public void increment() {
        counter++; // Неатомарная операция, которая может вызвать проблемы в многопоточной среде.
    }
}

// правильныйиз Безопасность темы, способ использования атомарных классов
public class AtomicExample {
    private AtomicInteger counter = new AtomicInteger(0);

    public void increment() {
        counter.incrementAndGet(); // Атомарные операции,Безопасность резьбы
    }
}

В первом примере,хотяintдобрыйформасамда Безопасность резьбыиз,нодаcounter++操делать Нетда Оригиналребенокиз,Это означает, что в многопоточных средах могут возникнуть условия гонки. Во втором примере,использоватьAtomicIntegerубеждаться ПонятноincrementAndGet()操делатьиз Оригиналребеноксекс,Таким образом можно избежать проблемы безопасности резьбы.

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

Язык кода:java
копировать
@Override
    @HotSpotIntrinsicCandidate
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }

на Яве,StringStringBufferиStringBuilderда三добрыйдругойсорт,У них разные способы обработки строк. Вот их основные особенности:

String

  • НеизменяемостьStringвернослон一旦создавать,Его значение невозможно изменить.этот意味着任что Исправлять操делать ВсевстречапроизводитьодинновыйизStringвернослон。
  • Пул строковых констант:строковый литерал(нравиться"hello")Проходитьчастохранилищесуществовать Пул строковых константа, это помогает экономить память.
  • производительность:потому что Что Неизменяемость,производительность ниже, когда строки часто изменяются,Потому что каждая модификация создает новый объект.
  • Безопасность резьбыStringдобрыйда Безопасность резьбыиз,потому чтодля Что状态не могуодеяло Изменять。StringStringBufferиStringBuilderStringBuffer
  • изменчивостьStringBufferвернослон Можеткодеяло Исправлять,Все операции модификации выполняются над одним и тем же объектом.,вместо создания новых объектов.
  • Безопасность резьбыStringBufferда Безопасность резьбыиз,Это означает, что его метод синхронизирован,Может использоваться в многопоточной среде.
  • производительность:потому чтотакой же步изнакладные расходы,StringBufferсуществоватьодин Среда потокасередина СравниватьStringBuilderмедленный。
  • Сценарии использования:когда Строковые операция выполняется в многопоточной среде и требует гарантий безопасности. резьбычас,отвечатьиспользоватьStringBuffer

StringBuilder

  • изменчивость:иStringBufferдобрыйпохожий,StringBuilderвернослон也Можеткодеяло Исправлять。
  • Не потокобезопасноStringBuilderНетда Безопасность резьбыиз,Его метод синхронизирован,Таким образом, производительность выше в однопоточной среде.
  • производительность:потому что Неттакой же步изнакладные расходы,StringBuilderсуществоватьодин Среда потокасерединаизпроизводительностьлучше, чемStringBuffer
  • Сценарии использования:когда Строковые операция проводится в однопоточной среде и не требует учета Безопасности резьбычас,отвечатьиспользоватьStringBuilder

Сравнение производительности

  • Для однопоточной работы,StringBuilderПроходитьчастодабольшинство佳выбирать,Потому что он предлагает лучшую производительность.
  • Для многопоточных операций при необходимости убедитесь, что Безопасность резьбы,МожеткиспользоватьStringBuffer

Пример кода

Язык кода:java
копировать
String str1 = "Hello";
String str2 = str1 + " World"; // Создал новый объект String.

StringBuffer sb = new StringBuffer("Hello");
sb.append(" World"); // Изменить исходный объект

StringBuilder sbd = new StringBuilder("Hello");
sbd.append(" World"); // Изменить исходный объект

В этом примере,использоватьStringруководить Конкатенация строкчас,каждый разсоединять操делать ВсевстречапроизводитьодинновыйизStringвернослон。иStringBufferиStringBuilder则позволятьсуществовать Оригиналиметьвернослонначальстворуководить Исправлять,Избегает создания нескольких объектов.

в заключение

выбиратьиспользоватьStringStringBufferвозвращатьсядаStringBuilder取决ВИнструменттелоизотвечатьиспользоватьсцена:

  • использоватьString,Когда вам нужен неизменяемый строковый объект,И когда содержимое строки не изменяется часто.
  • использоватьStringBuffer,Когда нужно выполнить Строковые операции в многопоточной среде,и Требовать Безопасность резьбычас。
  • использоватьStringBuilder,Когда вы выполняете Строковые операции в однопоточной среде,И при достижении производительности.
Язык кода:java
копировать
 /**
     * Returns a canonical representation for the string object. Возвращает каноническое представление строкового объекта.
     * <p>
     * A pool of strings, initially empty, is maintained privately by the
     * class {@code String}.
     * <p>
     * When the intern method is invoked, if the pool already contains a
     * string equal to this {@code String} object as determined by
     * the {@link #equals(Object)} method, then the string from the pool is
     * returned. Otherwise, this {@code String} object is added to the
     * pool and a reference to this {@code String} object is returned.
     * <p>
     * It follows that for any two strings {@code s} and {@code t},
     * {@code s.intern() == t.intern()} is {@code true}
     * if and only if {@code s.equals(t)} is {@code true}.
     * <p>
     * All literal strings and string-valued constant expressions are
     * interned. String literals are defined in section 3.10.5 of the
     * <cite>The Java&trade; Language Specification</cite>.
     *
     * @return  a string that has the same contents as this string, but is
     *          guaranteed to be from a pool of unique strings.
     * @jls 3.10.5 String Literals
     */
    public native String intern();

на Яве,String.intern()методдаодин Нетчасто Тяжелыйхотетьизхарактеристика,этои Пул строковых констант(String Pool)тесно связанный。к Внизда关ВString.intern()методизподробный Очки знаний:

Пул строковых констант

Пул строковых константдаJavaвиртуальная машина(JVM)использовать ПриходитьхранилищенитьпостоянныйипроходитьString.intern()методпроизводитьизнитьиз Памятьокругдомен。Его главная Цельдадля Понятно节省Памятьнулевоймежду,Избегайте создания одного и того же строкового литерала несколько раз.

String.intern()метод

String.intern()методизделатьиспользоватьда Воляодиннитьвернослони Пул строковых константсерединаизнитьвернослонруководить Сравнивать。нравитьсяфруктыпостоянныйбассейнсередина Уже включено Понятно该нить,Возвращает ссылку на строковый объект в пуле констант, если нет;,Затем добавьте строковый объект в пул констант приезжать.,и возвращает ссылку на этот новый строковый объект.

сигнатура метода

Язык кода:java
копировать
public native String intern()

intern()методдаStringдобрыйизчленметод,Это местный метод,использоватьnativeКлючевые словалоготип,Это означает, что лежащая в его основе алгоритм написан на C/C++ или других языках, отличных от Java.

использовать

  1. Оптимизировать использование строк:проходить Тяжелыйиспользоватьпостоянныйбассейнсерединаизнить,Уменьшите использование памяти.
  2. безопасность:в некоторых случаях,Это предотвращает подделку строки.
  3. производительность:длячастодоступизнить,использоватьintern()можно улучшитьпроизводительность,Потому что вы можете получить ссылку на строку непосредственно из пула констант.

На что следует обратить внимание

  1. Строковые константы автоматически попадают в пул констант.:проходитьстроковый литерал(нравиться"hello")создаватьизнить,Он будет автоматически помещен в Пуловые строки констант во время компиляции.
  2. Строковые переменные не попадают автоматически в пул констант.:проходитьnew String("hello")создаватьизнить,Не будет автоматически помещен в постоянный пул.,если явновызовintern()метод。
  3. intern()**методнакладные расходы**:нравитьсяфрукты Пул строковых константсередина Нетверноотвечатьизнить,intern()методвстреча Волянитьдобавить вприезжатьпостоянныйбассейн,этот Может能с участием Некоторыйпроизводительностьнакладные расходы。
  4. злоупотреблять**intern()**Может вызвать переполнение памяти.:нравитьсяфрукты无предел制地использоватьintern()метод,Может привести к тому, что пул констант будет занимать много памяти.,Даже переполнение памяти.

Пример

Язык кода:java
копировать
String s1 = "hello";
String s2 = new String("hello");
String s3 = s2.intern();

System.out.println(s1 == s2); // выход false
System.out.println(s1 == s3); // выход правда, потому что s3 вызов intern() После этого ссылка на пул констант "hello"

В этом примере,s1прямойловитьпроходитьстроковый литералсоздавать,сдвигатьсяхранилищесуществовать Пул строковых константсередина。s2проходитьnew String()создавать,Нетвстречасдвигатьсяхранилищесуществоватьпостоянныйбассейнсередина。s3проходитьвызовs2.intern()После этого ссылка на пул константнитьвернослон。

String.intern()**методдаодин Нетчастоиметьиспользоватьизхарактеристика,может помочь Оптимизировать использование строк。Однако,Разработчикам следует проявлять осторожность,Избегайте проблем с памятью, вызванных неправильным использованием. в некоторых конкретных сценариях,Например, при обработке большого количества одинаковых строк,Разумныйиспользовать**intern()**Можеткприносить Приходитьпроизводительностьначальствоизпродвигать。**

В разных JVMвыполнить, Пул строковых Место хранения констант может отличаться, но в Oracle HotSpot JVM, например, претерпел несколько изменений во время своего развития:

  1. Вечная генерация (PermGen):существоватьJava В версиях 8 и более ранних Пул строковых констант хранится в Вечной генерации (PermGen). Постоянное поколение является частью памяти JVM.,Используется для хранения метаданных класса, статических переменных и других данных, доступных только для чтения.
  2. методокруг(Metaspace):С Явы Начиная с 8-го поколения, постоянное поколение было заброшено и заменено Metaspace. Пул строковых Константа была перенесена приезжать в область памяти, называемую областью метода. Область методов используется для хранения информации о классе, статических переменных, пулов констант и т. д. Метапространство заменяет постоянное поколение и позволяет избежать проблемы переполнения памяти постоянного поколения, поскольку оно использует локальную память (Native). Память) вместо памяти виртуальной машины (куча Memory)。
  3. Область кучи:нитьвернослонсам(Прямо сейчаспроходитьnew String()создаватьизвернослон)дахранилищесуществоватьJavaкуча(Heap)серединаиз。кучадаJVMиспользовать Приходитьраспространятьиуправлятьвернослон Памятьизокругдомен。

Пул строковых константизизменять:

  • Java <= 7: Пул строковых констант Кусочек ВВечная генерация (PermGen)。
  • Java 8: Пул строковых константа была перенесена в область методов, а PermGen заменен на Metaspace.
  • Java 11: Постоянное поколение полностью удаляется, и метапространство становится единственной областью, где хранятся метаданные классов.

Практическое воздействие:

  • Управление памятью:потому что元нулевоймеждуиспользоватьизда本地Память,Поэтому не ограничен размером кучи JVM.,Это помогает снизить риск переполнения памяти.
  • производительность Тюнинг:Понятноразвязать Пул строковых Местоположение константы важно для настройки производительности JVM. Например, Пул строковых Переполнение константы может привести к Full GC, и размер метапространства также необходимо соответствующим образом настроить, чтобы избежать ошибок OOM (недостаточно памяти).

Пример кода:

Язык кода:java
копировать
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");

В этом примере:

  • str1иstr2вестииспользоватьизда Пул строковых Тот же объект в константе.
  • str3даодинпроходитьnew操делать符создаватьизновыйвернослон,Он расположен в куче Java.

HotSpot — это популярная реализация виртуальной машины Java (JVM), широко используемая для запуска приложений Java. Он был разработан Sun Microsystems (теперь часть Oracle Corporation) и распространяется как часть Oracle JDK и OpenJDK. HotSpot VM известна своими технологиями оптимизации производительности, включая JIT-компилятор, сбор мусора и escape-анализ.

HotSpot VM использует несколько передовых технологий для обеспечения высокой производительности приложений Java, в том числе:

  1. модель памяти:HotSpotпоставлять Понятноодинпередовойизмодель память, используемая для управления жизненным циклом объектов и классов.
  2. сборщик мусора:это Включать Понятномногодобрыйсборщик мусора,Например, последовательный, параллельный, параллельная разметка (CMS), G1 и т. д.,Эти ресайклеры оптимизированы для различных сценариев применения.
  3. Компилятор «точно в срок»:HotSpotдержатьиметь ЭффективныйизJITкомпилятор,Возможность компилировать байт-код в машинный код на лету.,Улучшите скорость работы программы.
  4. адаптивный оптимизатор:этоможетв соответствии с程序运ХОРОШОчасиз ХОРОШОдлядвигаться态地руководитьоптимизация。
  5. Кроссплатформенная поддержка:HotSpot VMподдерживатьJVMспецификация,Возможность запуска на нескольких операционных системах,выбрать «Скомпилировать один раз»,Функция «Бег по месту проживания».
  6. сменные компоненты:HotSpotпозволять开发ВОЗв соответствии с需хотетьвыбиратьдругойизJITкомпиляторисборщик мусора。
  7. производительностьмониториуправлять:поставлять ПонятномногодобрыйинструментиAPIПриходитьмониториуправлятьвиртуальная машинаизпроизводительность。

HotSpot VM был первым выбором для разработчиков Java с момента его запуска в 1997 году и продолжает развиваться и совершенствоваться по мере развития языка Java.

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

Советы по оптимизации производительности Java: углубленный анализ JIT-компиляции, сбор мусора и escape-анализ

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

JIT-компилятор: ускоритель Java-кода

Код Java сначала компилируется в байт-код, а затем выполняется JVM. Роль JIT-компилятора заключается в компиляции «горячего» кода (часто выполняемого кода) в локальный машинный код во время выполнения, тем самым повышая эффективность выполнения.

Рабочий процесс JIT-компилятора
  1. Объяснение и исполнение:JVMпервый Объяснение и байт-код выполнения, который представляет собой легкий процесс.
  2. Обнаружение горячего кода:JVMмониторбайт-кодиз执ХОРОШО频率,Коды точек доступа определены.
  3. Оптимизация компиляции:JITкомпилятор Воля热点кодкомпилироватьдлямашинный код,и выполнять различные оптимизации.
Типы JIT-компиляторов
  • Client Compiler:подходящийиспользовать Вклиентотвечатьиспользовать,Оптимизировать время компиляции.
  • Server Compiler:подходящийиспользовать Всерверотвечатьиспользовать,Оптимизируйте эффективность выполнения кода.
Сбор мусора: очиститель памяти JVM

Механизм сборки мусора Java отвечает за автоматическое управление памятью и переработку объектов, которые больше не используются, что позволяет избежать утечек памяти и проблем с дикими указателями.

Основы сбора мусора
  1. ссылка на объект:проходитьвестииспользоватьцепь Приходитьотслеживатьвернослонданет Можетдоступ。
  2. отметка очищена:отметка Местоиметь Нет再использоватьизвернослон,Тогда ясно.
  3. Коллекция по поколениям:новое поколениеистаростьиспользоватьдругойиз Стратегия сбора мусора。
сборщик мусора
  • Serial GC:одиннитьизсборщик мусора, подходит для небольших объемов данных.
  • Parallel GC:многонитьизсборщик мусора, повысить эффективность сбора мусора.
  • CMS:кбольшинство Маленький化停顿часмеждудля Цельизсборщик мусора。
Escape-анализ: метод оптимизации производительности JVM

Escape-анализ — это метод оптимизации JVM, который используется для определения того, выходит ли область действия объекта за пределы метода.

Роль анализа побега
  1. выделено в стеке:нравитьсяфруктывернослон Нетвстречапобегприезжатьметодвнешний,Можно разместить место проживания в стеке,Сократите накладные расходы на вывоз мусора.
  2. Синхронизация пропущена:нравитьсяфруктывернослон Нетвстречапобег,Синхронизацию можно отключить Замок。
  3. Скалярная замена:Волявернослон拆развязатьдля Несколькооригинальныйдобрыйформапеременная,улучшатьпроизводительность。
Реальная демонстрация кейса

Ниже приведена простая программа на Java.,Показ метода горячей точки,Метод может быть оптимизирован JIT-компилятором.

Язык кода:java
копировать
public class HotspotExample {
    public static void main(String[] args) {
        int result = 0;
        for (int i = 0; i < 10000000; i++) {
            result += i;
        }
        System.out.println(result);
    }
}

В этом примере, поскольку цикл выполняется достаточное количество раз, JIT-компилятор, скорее всего, скомпилирует тело цикла в оптимизированный машинный код.

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

Код состояния HTTP 415 означает «Не поддерживается». Media Type”,Прямо сейчассервер无法处理просить附приноситьиз СМИтело Формат。этотошибка Проходитьчастопроисходитьсуществовать Клиент отправляетизпроситьсередина Включать Понятноодинсервер无法识Неили Не поддерживаетсяизContent-Typeголова。к Внизда Некоторый Может能привести кHTTP Причины ошибки 415:

  1. ** в заголовке запросаContent-Type**Неправильно:нравитьсяфрукты Клиент отправляетизпроситьсерединаContent-Typeголованастраиватьдлясервер Не поддерживаетсясортформа,Сравниватьнравитьсяapplication/xmlисервер期望издаapplication/json,Это приведет к ошибке 415.
  2. Неверный формат тела запроса:Несмотря на тоContent-TypeНастройте правильно,Если формат данных в теле запроса не соответствует формату, ожидаемому сервером,Например, неправильный формат данных JSON.,Также выдает ошибку 415.
  3. Проблемы обработки на стороне сервера:серверконецизкод Может能Нетправильный处理проситьтелосерединаизчисло据,или ВОЗНетправильный地настраиватьContent-Typeзаголовок ответа。
  4. Ошибка кода клиента:клиентсуществовать发送проситьчас Может能НетправильныйнастраиватьContent-Type,Или данные сериализуются неправильно перед отправкой тела запроса.

Чтобы решить эту проблему, вы можете предпринять следующие шаги:

  • Проверьте заголовки запросов:убеждаться Клиент отправляетизпросить头серединаизContent-Typeисервер期望сортформа Взаимносоответствовать。
  • Проверьте тело запроса:убеждатьсяпроситьтелосерединаизчисло据Форматправильный,Если это JSON,Убедитесь, что это действительный объект JSON.
  • Отладка на стороне сервера:исследоватьсерверконецизбревно,Проверьте, есть ли какие-либо исключения или сообщения об ошибках.,Это может указывать на причину, по которой сервер не смог обработать запрос.
  • Отладка клиента:использовать Браузериз开发ВОЗинструментилисетьмониторинструмент Приходитьисследоватьпроситьи响отвечатьизподробныйинформация,Это может помочь вам определить проблему.
  • Общайтесь с сервером:нравитьсяфруктывопрос仍然无法развязать决,Возможно, потребуется общение с разработчиками серверной части.,Понимание ожиданий и конфигураций на стороне сервера.

В справочных материалах упоминается, что HTTP встречается во время совместной отладки внешнего и внутреннего интерфейса. 415ошибкаиз Состояние,ипоставлять Понятно两добрыйразвязать决方案:назадконец Исправлятьивпередконец Исправлять。назадконец Исправлятьобратитесь киздаудалять@RequestBodyаннотация,впередконец Исправлятьобратитесь кизда Исправлятьпроситьчасизпросить头里Content-Typeдобрыйформадляapplication/json

Передача параметров Java

В Java-программировании,параметрпередачадаметодвызовизосновноймеханизм,Он определяет, как данные доставляются в метод и как метод получает и обрабатывает эти данные. Глубокое понимание передачи параметров,для编写Эффективный、Безопасностьи Может维护изкодключевой Тяжелыйхотеть。Эта статья познакомит вас Передача параметров Мир Java и изучение механизмов, лежащих в его основе. практики。

Основные понятия передачи параметров

на Яве,методизпараметрпередача主хотетьиметь两добрый形式:Передача по значениюипередать по ссылке

Передача по значению
  • Базовый тип данных:когда Кметодпередача Базовый тип данных (таких как int, float, char и т. д.), вы фактически передаете копию этих значений. общественный class PassByValueExample { public static void main(String[] args) { int num = 10; swap(num); System.out.println(num); // Выход по-прежнему 10 } static void swap(int n) { n = 20; } }
  • Пример
Передача по ссылке
  • Тип объекта данных:длявернослониличисло组(Прямо сейчасвестииспользоватьтип данных), копия ссылки передается, но копия и исходная ссылка указывают на один и тот же объект. общественный class PassByReferenceExample { public static void main(String[] args) { int[] array = {1, 2, 3}; modifyArray(array); System.out.println(Arrays.toString(array)); // выход 4, 2, 3. Массив модифицирован } static void modifyArray(int[] arr) { arr0 = 4; } }
  • Пример
Углубленный анализ передачи параметров
Автоматическая упаковка и распаковка

В Java 5 появились функции автоупаковки и распаковки, которые особенно полезны при передаче параметров.

Язык кода:java
копировать
public class AutoboxingExample {
    public static void main(String[] args) {
        Integer integer = 100;
        increment(integer);
        System.out.println(integer); // выход 101
    }
    static void increment(Integer n) {
        n = n + 1;
    }
}
Время оценки параметров

Оценка параметров выполняется перед вызовом метода, что означает, что выражения параметров оцениваются до вызова метода.

Язык кода:java
копировать
public class ArgumentEvaluationExample {
    public static void main(String[] args) {
        int counter = 0;
        performActions(incrementCounter(), counter);
    }
    static int incrementCounter() {
        return ++counter;
    }
    static void performActions(int a, int b) {
        // ...
    }
}

В этом примере,counterсуществоватьметодвызов Доодеяло Увеличивать Понятнодважды,Потому что порядок вычисления параметров неизвестен.

Практическое применение передачи параметров и вызова методов
Переменные параметры (Varargs)

Java позволяет методам принимать переменное количество параметров, что очень полезно на практике.

Язык кода:java
копировать
public class VarargsExample {
    public static void printArgs(Object... args) {
        for (Object obj : args) {
            System.out.println(obj);
        }
    }
    public static void main(String[] args) {
        printArgs("Hello", 123, 45.67);
    }
}
Перегрузка метода и передача параметров

При перегрузке методов тип и количество параметров являются ключом к различению разных методов.

Язык кода:java
копировать
public class MethodOverloadingExample {
    int add(int a, int b) {
        return a + b;
    }
    int add(int a, int b, int c) {
        return a + b + c;
    }
    public static void main(String[] args) {
        // вызовдругойизaddметод
    }
}

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

Битва с плавающей запятой в Java: битва за точность между Float и Double

введение

На языке программирования Java,Числа с плавающей запятой используются везде.,Будь то научные вычисления, рендеринг графиков или финансовый анализ и т. д.,floatиdoubleдобрыйформа Все Играя Тяжелыйхотеть Роль。Однако,Между ними существует разница в точности и Сценариях использования.,понимать Этиразницадля编写Эффективный且准确из程序ключевой Тяжелыйхотеть。В этой статье будет подробно рассмотреноfloatиdoubleиз精度характеристика、Сценарии использованияа такжелучшие практики。

Представление чисел с плавающей запятой

Числа с плавающей запятой — это стандарт арифметики двоичных чисел с плавающей запятой, основанный на стандарте IEEE 754, который определяет метод хранения и правила работы чисел с плавающей запятой.

float: число одинарной точности с плавающей запятой
  • Количество цифр:32Кусочек
  • Бит экспоненты:8Кусочек
  • цифры мантиссы:23Кусочек
  • Диапазон представления:О±1.4E-45 приезжать ±3.4E38
double: число двойной точности с плавающей запятой
  • Количество цифр:64Кусочек
  • Бит экспоненты:11Кусочек
  • цифры мантиссы:52Кусочек
  • Диапазон представления:О±4.9E-324 приезжать ±1.8E308
Сравнение точности

потому чтоdoubleСравниватьfloatиметь Дажемногоизцифры мантиссы,потому чтоэтотdoubleиз精度Даже高,Может представлять более широкий диапазон значений,Десятичные дроби также можно представить более точно.

Пример кода
Язык кода:java
копировать
public class FloatVsDouble {
    public static void main(String[] args) {
        float f = 1.123456789f;
        double d = 1.123456789d;
        
        System.out.println("Float: " + f); // выход Float: 1.1234568
        System.out.println("Double: " + d); // выход Double: 1.123456789
    }
}

В этом примере,потому чтоfloatиз精度предел制,Некоторые числа после запятой округляются.

Сценарии использования
float
  • среда с ограниченными ресурсами:когда Памятьихранилище Нетчасто宝贵час,Например, встроенные системы или мобильные устройства.
  • рендеринг графики:существоватьграфика学середина,использоватьfloatМожно сохранить память,А человеческий глаз не чувствителен к нюансам точности.
double
  • научные вычисления:需хотеть高精度изповод,Например, физическое моделирование и анализ данных.
  • финансовые приложения:финансовые расчетысередина,Точность имеет решающее значение,Проходитьчастовстречаиспользоватьdouble
Вопросы производительности

На некоторых старых аппаратных платформах,float运算Может能СравниватьdoubleВычисляйте быстрее,потому чтодляfloatиз操делать Даже简один。носуществоватьсейчас代处理器начальство,Между ними нет большой разницы в производительности.

На что следует обратить внимание
  • Избегайте магических чисел:Нетхотетьсуществоватькодсерединапрямойловитьиспользовать浮点числоделатьдляпостоянный,Потому что это приведет к ненужной потере точности. если необходимо,использоватьBigDecimal
  • Обратите внимание на переполнение:浮点числосуществоватьловить近Что Диапазон представление может переполниться до предела.
  • ошибка округления:浮点число运算Может能встречапривести кошибка округления, это требует особого внимания при работе с числами с плавающей запятой. Почему поля не могут быть общедоступными в Java?

В Java-программировании,Инкапсуляция — это основной принцип объектно-ориентированного программирования. Инкапсуляция означает сокрытие внутреннего состояния и поведения объекта.,Доступ к внешнему миру только через общедоступный интерфейс. Однако,В реальном развитии,Мы часто видим поля некоторых классов, объявленные как общедоступные. Кажется, это нарушает принцип инкапсуляции.,Так почему же поля никогда не должны быть общедоступными? В этой статье будет рассмотрен этот вопрос,И предоставьте некоторые лучшие практики.

Важность инкапсуляции

Инкапсуляция — один из четырех основных принципов объектно-ориентированного программирования. Он имеет следующие ключевые моменты:

  1. Скрыть детали:Инкапсуляцияпозволять开发ВОЗ隐藏вернослонизвнутреннийвыполнитьдеталь,Только暴露必хотетьизинтерфейс Даватьвнешнийиспользовать。
  2. Уменьшите сложность:проходить Инкапсуляция,Можно скрыть сложные детали,делатьвнешнийвызов ВОЗНет需хотеть关心Этидеталь,Это упрощает использование.
  3. Улучшение ремонтопригодности:Инкапсуляция Можеткпредотвратить внешниекодпрямойловитьдоступи Исправлятьвернослонизвнутренний状态,Таким образом, при изменении внутренней калибровки,Может уменьшить влияние на другой код.
  4. Усиливатьбезопасность:Инкапсуляция Можеткпредотвратить внешниекодпрямойловитьдоступ敏感число据,Тем самым улучшая безопасность программы.

Проблема с публичными полями

Хотя общедоступные поля могут упростить доступ, они также создают ряд проблем:

  1. Уничтожить инкапсуляцию:мужскойиметь Полепрямойловить暴露Понятновернослонизвнутренний状态,Это нарушает принцип инкапсуляции.
  2. Увеличение сцепления:мужскойиметь Поледелатьдобрыйииспользоватьэтоизкодмеждупроизводить Понятно Нет必хотетьизмуфта,Это усложняет поддержку и повторное использование кода.
  3. Сложность контроля доступа:мужскойиметь Поле Нетконтроль доступа,Любой код может изменить их напрямую.,Это может привести к несоответствию данных или ошибкам.
  4. недостатокгибкость:нравитьсяфрукты未Приходить需хотеть Исправлять Полеизвыполнить,Благодаря прямому доступу к публичным полям,Это может привести к появлению большого объема кода, который необходимо будет изменить.

лучшие практики

Чтобы поддерживать инкапсуляцию, мы должны следовать следующим инструкциям:

  1. Используйте частные поля:Воля Местоиметь Полезаявлениедляяиметь(private),Это обеспечивает их инкапсуляцию.
  2. Обеспечить публичный доступ:проходитьобщественныйизgetterиsetterметод Приходитьдоступи Исправлятьяиметь Поле。этот样Можетксуществоватьдоступи Исправлять Полечасдобавить вдополнительныйизлогика,Например, проверка, ведение журнала и т. д.
  3. Используйте модификатор Finalistatic:нравитьсяфрукты Поледапостоянныйилистатическийиз,Использование модификатора Final и static может улучшить ясность вашего кода и производительность.
  4. Используйте аннотации:использовать@Getterи@SetterждатьLombokаннотация,Может автоматически генерировать метод getterиsetter.,Сократите шаблонный код.

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

Окончательное противостояние абстрактных классов и интерфейсов**

введение

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

Абстрактные классы: схемы частичной реализации

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

Функции
  • Содержит абстрактный метод:Нетметодтело,Подклассы должны переписать этот метод.
  • Содержит конкретную информацию:Можеткиметьвесьизметодвыполнить。
  • одиннаследовать:Javaсерединаодиннаследоватьизограничение означаетодиндобрыйможет тольконаследоватьодинабстрактныйдобрый。
Пример кода
Язык кода:java
копировать
public abstract class Animal {
    public void eat() {
        System.out.println("Eating");
    }
    public abstract void sound();
}

class Dog extends Animal {
    public void sound() {
        System.out.println("Woof");
    }
}
Интерфейс: контракт, определяющий поведение

Интерфейс — это совершенно абстрактное понятие, которое не обеспечивает никакой реализации и лишь определяет сигнатуру набора методов.

Функции
  • Не включеновыполнить:Местоиметьметодпо умолчаниюдаабстрактныйиз。
  • многовыполнить:одиндобрый Можетквыполнить Несколькоинтерфейс。
  • по умолчаниюметод:Java 8начинать,интерфейс Можетк Включатьпо умолчаниюметодвыполнить。
  • статическийметод:Java 8начинать,интерфейс Можетк Включатьстатическийметод。
Пример кода
Язык кода:java
копировать
public interface UsbDevice {
    void connect();
    void disconnect();
    default void status() {
        System.out.println("Device status is OK");
    }
}

class Smartphone implements UsbDevice {
    public void connect() {
        System.out.println("Connecting to USB");
    }
    public void disconnect() {
        System.out.println("Disconnecting from USB");
    }
}
Разница между абстрактным классом и интерфейсом
  • Дизайн Цель:абстрактныйдобрыйчастоиспользовать Вобщийкод,интерфейсиспользовать Вопределениеспособность。
  • наследоватьивыполнить:добрыйданаследоватьабстрактныйдобрыйиз,иинтерфейсдахотетьодеяловыполнитьиз。
  • Ограничение количества:одиндобрыйможет тольконаследоватьодинабстрактныйдобрый,но Можетквыполнить Несколькоинтерфейс。
  • методвыполнить:абстрактныйдобрый Можеткиметьметодвыполнить,интерфейсне могу(Java 8 назад).
  • модификатор доступа:интерфейссерединаизметодпо умолчаниюдаpublic,В абстрактных классах может быть много типов методов.
Отношения между абстрактными классами и интерфейсами
  • оба для полиморфизма:позволятьдругойсортвернотакой же一消息做出响отвечать。
  • Ни один из них не может быть создан:долженпроходитьребенокдобрыйиливыполнитьдобрый Приходитьиспользовать。
  • Все Содержит абстрактный метод:ХотяJava 8назадинтерфейс Можеткиметьпо умолчаниювыполнить,Но есть еще абстрактный метод.
Рекомендации по выбору дизайна
  • Когда внимание сосредоточено на поведении, а не на статусе:выбиратьинтерфейс。
  • Нужно поделиться кодом:выбиратьабстрактныйдобрый。
  • иерархия, требующая фиксированного поведения классов:выбиратьабстрактныйдобрый。
  • Требуется несколько коллекций вариантов поведения:выбиратьинтерфейс。

абстрактныйдобрыйиинтерфейсдаJavaДлявернослондизайнсередина Нет Можетилинедостатокизчасть。этоих各симетьуникальныйизиспользоватьи Преимущества,Понимание их различий и взаимосвязей имеет решающее значение для разработки гибких, удобных в обслуживании систем.

Краткое изложение точек суперзнания в Java

на Яве,superКлючевые словадаодин Нетчасто Тяжелыйхотетьизконцепция,этоиспользовать Ввестииспользоватькогдавпередвернослонизотецдобрыйвернослон。superКлючевые словасуществоватьнаследоватьи Полиморфизмизначальство Вниз文середина Играя关ключ Роль。В этой статье подробно разберемсяsuperКлючевые словаиз Сценарии использование связанных очков знаний.

1. Ссылка на членов родительского класса

в подклассе,Если вам нужна ссылка на членов родительского класса (включая метод, переменную и конструктор),МожеткиспользоватьsuperКлючевые слова。

1.1 Ссылочные переменные родительского класса

Язык кода:java
копировать
class Parent {
    int value = 10;
}

class Child extends Parent {
    void display() {
        System.out.println(super.value); // выход Значение переменной родительского класса
    }
}

1.2 Методы ссылки на родительские классы

Язык кода:java
копировать
class Parent {
    void display() {
        System.out.println("Parent display()");
    }
}

class Child extends Parent {
    void display() {
        super.display(); // вызовотецдобрыйизметод
        System.out.println("Child display()");
    }
}

2. Вызов конструктора родительского класса

В конструкторе подкласса,МожеткиспользоватьsuperКлючевые слова Вызов конструктора родительского класса。

Язык кода:java
копировать
class Parent {
    Parent() {
        System.out.println("Parent Constructor");
    }
}

class Child extends Parent {
    Child() {
        super(); // Вызов конструктора родительского класса
        System.out.println("Child Constructor");
    }
}

3. Вызов переопределенного метода родительского класса.

в подклассепереписатьотецдобрыйизметодчас,нравитьсяфрукты需хотеть В методе подклассавызовотецдобрыйизвыполнить,МожеткиспользоватьsuperКлючевые слова。

Язык кода:java
копировать
class Parent {
    void display() {
        System.out.println("Parent display()");
    }
}

class Child extends Parent {
    void display() {
        super.display(); // вызовотецдобрыйизdisplay()метод
        System.out.println("Child display()");
    }
}

4. Решите проблему сокрытия переменных

Когда переменные-члены подкласса имеют то же имя, что и переменные-члены родительского класса.,Переменные подкласса скроют переменные родительского класса. в это время,Если вам нужно получить доступ к переменной с тем же именем родительского класса,МожеткиспользоватьsuperКлючевые слова。

Язык кода:java
копировать
class Parent {
    int value = 10;
}

class Child extends Parent {
    int value = 20;

    void display() {
        System.out.println(super.value); // выход Значение родительского класса
    }
}

5. Разница между супер и этим

superКлючевые словаиспользовать ВСсылка на членов родительского класса,иthisКлючевые словаиспользовать Ввестииспользоватькогдавпередвернослонизчлен。в конструкторе,thisиспользовать Ввызовкогдавпереддобрыйиз Что他Конструктор,иsuperиспользовать ВВызов конструктора родительского класса。

Язык кода:java
копировать
class Parent {
    Parent() {
        System.out.println("Parent Constructor");
    }
}

class Child extends Parent {
    Child() {
        this(10); // вызовкогдавпереддобрыйиз Другойодин Конструктор
        System.out.println("Child Constructor");
    }

    Child(int value) {
        super(); // Вызов конструктора родительского класса
        System.out.println("Child Constructor with value: " + value);
    }
}

6. Суперсценарии использования

  • Когда подклассу необходимо получить доступ к членам родительского класса.
  • Когда подклассу необходимо вызвать конструктор родительского класса.
  • когдаребенокдобрый需хотетьвызовотецдобрыйизпереписатьметодчас。
  • Когда переменные-члены подкласса имеют то же имя, что и переменные-члены родительского класса.

superКлючевые слована Яведаодин Нетчасто Тяжелыйхотетьизконцепция,этопоставлять Понятноверноотецдобрыйчленизпрямойловитьдоступ。правильныйиспользоватьsuperКлючевые словаможет помочь我их编写出Даже加прозрачный、Может维护изкод。делатьдляпередовойJavaАрхитектор,мы должны глубоко понятьsuperиз Сценарии использованияилучшие практики,так что В реальном развитии Даже加иметь Эффективно и географически выгодноиспользоватьэтот一характеристика。

на Яве,superКлючевые словасуществовать Полиморфизмизначальство Вниз文середина Проходитьчастоиспользовать Ввызовотецдобрыйизметодвыполнить,Даже у подкласса переписать есть этот метод. Это особенно полезно в случае полиморфизма.,Потому что подклассы могут предоставлять свои собственные методы заполнения.,иsuperКлючевые словапозволятьребенокдобрыйсуществовать需хотетьчасвызовотецдобрыйизметод。

Полиморфизм и переопределение метода

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

использоватьsuperвызовотецдобрыйметод

В методе подкласса,МожеткпроходитьsuperКлючевые словавызовотецдобрыйизметод。этот Проходитьчастосуществоватьребенокдобрый需хотетьсуществоватьссебяизвыполнитьсерединаиспользоватьотецдобрыйметодиз ХОРОШОдлячасиспользовать。

Язык кода:java
копировать
class Animal {
    public void makeSound() {
        System.out.println("Some sound");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        super.makeSound(); // вызовотецдобрыйизmakeSoundметод
        System.out.println("Bark");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.makeSound(); // выход: Some sound Bark
    }
}

В приведенном выше примере,Dogдобрыйпереписать ПонятноAnimalдобрыйизmakeSoundметод。существоватьDogдобрыйизmakeSoundметодсередина,первыйвызов Понятноsuper.makeSound()Приходить执ХОРОШОотецдобрыйизmakeSoundметод,Затем добавил свое собственное поведение.

superи Конструктор

в конструкторе,superКлючевые словаиспользовать ВВызов конструктора родительского класса. Это связано с тем, что при создании объекта подкласса необходимо сначала инициализировать часть родительского класса. Если конструктор подкласса явно не указывает конструктора родительского класса,Javaкомпиляторвстречасдвигаться插入верно Нет женьшеня Конструкторизвызов。нравитьсяфруктыотецдобрый Нет Нет женьшеня Конструктор,ребенокдобрыйдолженв конструктореиспользоватьsuperПриходить Вызов конструктора родительского класса。

Язык кода:java
копировать
class Animal {
    public Animal() {
        System.out.println("Animal is created");
    }
}

class Dog extends Animal {
    public Dog() {
        super(); // Вызов конструктора родительского класса
        System.out.println("Dog is created");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        // выход: Animal is created
        // выход: Dog is created
    }
}

В этом примере,Dogдобрыйиз Конструкториспользоватьsuper()вызов ПонятноAnimalдобрыйиз Конструктор。

superКлючевые словасуществовать Полиморфизмсерединаиспользовать Ввызовотецдобрыйизметоди Конструктор。этопозволятьребенокдобрыйсуществоватьссебяизметодвыполнитьсерединабронироватьили Усиливатьотецдобрыйиз ХОРОШОдля。правильныйиспользоватьsuperда Реализация полиморфизмаи维护кодпрозрачныйсексиз Тяжелыйхотетьчасть。существоватьдизайндобрыйиметодчас,следует рассматриватьприезжатьчточасиспользоватьsuperПриходитьвызовотецдобрыйизвыполнить,Чтобы обеспечить ремонтопригодность кода.

«Переписывание» и «Перегрузка» на Java: Волшебное противостояние братьев-близнецов!

В мире Java есть две очень похожие, но совершенно разные концепции — Override и Overload. Они как братья-близнецы, со схожими именами, но совершенно разными характерами. Сегодня давайте вместе раскроем их тайны и посмотрим, как они творят чудеса в волшебном мире Явы.

Переопределить: магия наследования

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

Язык кода:java
копировать
class Animal {
    public void makeSound() {
        System.out.println("Some sound");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Bark");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.makeSound(); // выход: Bark
    }
}

В этом примере,Dogдобрыйпереписать ПонятноAnimalдобрыйизmakeSoundметод,когдасоздаватьDogвернослонивызовmakeSoundметодчас,встреча执ХОРОШОDogдобрыйсерединаизвыполнить,и НетдаAnimalдобрыйсерединаизвыполнить。

Перегрузка: праздник полиморфизма

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

Язык кода:java
копировать
class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public double add(double a, double b) {
        return a + b;
    }

    public int add(int a, int b, int c) {
        return a + b + c;
    }
}

public class Main {
    public static void main(String[] args) {
        Calculator calc = new Calculator();
        System.out.println(calc.add(1, 2)); // выход: 3
        System.out.println(calc.add(1.5, 2.5)); // выход: 4.0
        System.out.println(calc.add(1, 2, 3)); // выход: 6
    }
}

В этом примере,Calculatorдобрыйиметьтриaddметод,этоихиз Список параметров другой,потому чтоэтот Можетксосуществовать。когдавызовaddметодчас,компиляторвстречав соответствии свходящийизпараметрдобрыйформаиколичестворешатьвызов Которыйметод。

Разница между перезаписью и перегрузкой

Хотя и переопределение, и перегрузка связаны с именем метода, их суть различна:

  • переписать:происходитьсуществоватьнаследоватьсвязьсередина,Подкласс переписать метод родительского класса,методимя、Список параметрови Тип возврат должен быть одинаковым.
  • Перегрузка:происходит в том же классе,метод имеет то же имя,но Список параметров другой,Тип возврат может быть разным.

конечно. переписать (переопределить) и перегрузить (перегрузить) — две очень важные концепции в Java, и в разных сценариях они применяются по-разному. Ниже я проиллюстрирую их Сценарии использования конкретными примерами.

Переопределить сценарии использования

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

Сценарий 1: Конструкция рамы

Предположим, мы разрабатываем среду графического пользовательского интерфейса (GUI).,один из нихButtonдобрый,этоиметьодинdrawметодиспользовать Врисоватькнопка。Сейчас我их想хотеть СоздайтеImageButtonдобрый,этонаследоватьсButtonдобрый,ипереписатьdrawметод Приходитьрисоватьодинприноситьиметькартинаизкнопка。

Язык кода:java
копировать
class Button {
    public void draw() {
        System.out.println("Drawing a simple button.");
    }
}

class ImageButton extends Button {
    @Override
    public void draw() {
        System.out.println("Drawing an image button with an image.");
    }
}

public class Main {
    public static void main(String[] args) {
        Button button = new Button();
        ImageButton imageButton = new ImageButton();
        
        button.draw(); // выход: Drawing a simple button.
        imageButton.draw(); // выход: Drawing an image button with an image.
    }
}

В этом примере,ImageButtonдобрыйпереписать ПонятноButtonдобрыйизdrawметод,Чтобы обеспечить конкретные возможности.

Сценарий 2: Расширение библиотеки

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

Язык кода:java
копировать
class LibraryClass {
    public void performAction() {
        System.out.println("Performing a default action.");
    }
}

class ExtendedClass extends LibraryClass {
    @Override
    public void performAction() {
        System.out.println("Performing an extended action.");
    }
}

public class Main {
    public static void main(String[] args) {
        LibraryClass libraryInstance = new LibraryClass();
        ExtendedClass extendedInstance = new ExtendedClass();
        
        libraryInstance.performAction(); // выход: Performing a default action.
        extendedInstance.performAction(); // выход: Performing an extended action.
    }
}

В этом примере,ExtendedClassпереписать ПонятноLibraryClassизperformActionметод,для обеспечения дополнительного функционала.

Сценарии использования перегрузки

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

Сцена 1: Разнообразие методов использования

Предположим, мыиметьодинcalculateметод,Он может выполнять различные вычисления на основе разных параметров.

Язык кода:java
копировать
class Calculator {
    public int calculate(int a, int b) {
        return a + b;
    }

    public double calculate(double a, double b) {
        return a + b;
    }

    public int calculate(int a, int b, int c) {
        return a + b + c;
    }
}

public class Main {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        
        System.out.println(calculator.calculate(1, 2)); // выход: 3
        System.out.println(calculator.calculate(1.5, 2.5)); // выход: 4.0
        System.out.println(calculator.calculate(1, 2, 3)); // выход: 6
    }
}

В этом примере,calculateметододеяло Перегрузка Понятнотри раза,для размещения различных типов и величин параметров.

Сценарий 2: Перегрузка конструктора

Перегрузка конструктора позволяет нам создавать объекты на основе разных списков параметров.

Язык кода:java
копировать
class Person {
    private String name;
    private int age;

    public Person(String name) {
        this.name = name;
        this.age = 0;
    }

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

public class Main {
    public static void main(String[] args) {
        Person person1 = new Person("Alice");
        Person person2 = new Person("Bob", 30);
    }
}

В этом примере,Personдобрыйиметьдва Конструктор,Принимается один параметр,Другойодинловить受двапараметр。этотпозволять我ихв соответствии с需хотетьсоздаватьPersonвернослон。

на Яве,@HotSpotIntrinsicCandidateаннотациядаJDKИсходный кодсерединаиспользоватьизодинособенныйаннотация,Это связано с внутренним механизмом оптимизации виртуальной машины HotSpot. Цель этой аннотации — указать, что определенные инструкции в виртуальной машине HotSpot могут быть оптимизированы для инструкций, специфичных для ЦП.,отиулучшатьпроизводительность。

Конкретно,когдаодинметододеялоотметкадля@HotSpotIntrinsicCandidateчас,Это указывает на то, что метод может иметь эффективную выборку.,Эта настройка основана на конкретном наборе инструкций ЦП. во время выполнения,HotSpotвиртуальная машинавстречапытатьсяиспользовать Эти Эффективныйизвыполнить Приходитьстандарт заменыизJavaметодвызов,уменьшитьметодвызовизнакладные расходы и повысить эффективность исполнения.

Например,StringдобрыйсерединаизindexOfметод Сразудаодинодеялоотметкадля@HotSpotIntrinsicCandidateизметод。когдавызовString.indexOfметодчас,Если входящая строка содержит только символы Latin1,Виртуальная машина HotSpot может использовать специфичную для ЦП калибровку для выполнения этого метода.,Вместо использования интерпретатора байт-кода Java для выполнения.

Следует отметить, что,Хотяметододеялоотметкадля@HotSpotIntrinsicCandidate,Но это не значит, что данная оптимизация будет использоваться во всех случаях. на самом деле,Происходит ли такая оптимизация, зависит от множества факторов.,Включая версию JVM, конфигурацию среды выполнения, конкретную аппаратную платформу и т. д. также,Несмотря на тометододеялоотметкадля@HotSpotIntrinsicCandidate,На уровне интерпретатора (Interpreter) такой оптимизации тоже нет.

В итоге,@HotSpotIntrinsicCandidateаннотациядаJavaсерединаиспользовать Вобратитесь к示метод Может能одеялоHotSpotвиртуальная машинаоптимизацияизодинотметка,Это помогает повысить эффективность выполнения конкретного метода.,ноэтотдобрыйоптимизацияданетдействительныйпроисходитьвозвращаться需хотетьучитывать Инструменттелоиз运ХОРОШОчассредаисостояние

на Яве,отметкадля@IntrinsicCandidateизметод Проходитьчастодаобратитесь к那些В HotSpotвиртуальная машинасередина Может能одеялооптимизациядляидентификация ВCPUизобратитесь к令изметод。Этиметод Проходитьчастода Некоторый Нетчасто基础且частоодеяловызовиз操делать,нравитьсябазовый Арифметические операции типа, Операции с массивамиждать。проходить Воля Этиметодотметкадля@IntrinsicCandidate,Виртуальную машину HotSpot можно настроить во время выполнения в соответствии с конкретной аппаратной платформой и JVM.,выбиратьданетиспользоватьидентификацияизоптимизациявыполнить Приходитьстандарт заменыизJavaметодвызов。

к Внизда Некоторыйобщийизодеялоотметкадля@IntrinsicCandidateизметод:

  1. Арифметические операции для базового типа:нравитьсяintиlongдобрыйформаиздобавление、Вычитание、Умножение и деление и т.д.
  2. Операции с массивами:нравитьсяSystem.arraycopy()метод,Он используется для эффективного копирования массивов.
  3. Строковые операции:нравитьсяStringдобрыйсерединаизcharAt()length()ждатьметод。
  4. математические операции:нравитьсяMathдобрыйсерединаизsin()cos()sqrt()ждатьметод。
  5. Операции с объектами:нравитьсяObjectдобрыйсерединаизhashCode()equals()ждатьметод。

Следует отметить, что,Хотяметододеялоотметкадля@IntrinsicCandidate,Но это не значит, что данная оптимизация будет использоваться во всех случаях. на самом деле,Происходит ли такая оптимизация, зависит от множества факторов.,Включая версию JVM, конфигурацию среды выполнения, конкретную аппаратную платформу и т. д. также,Несмотря на тометододеялоотметкадля@IntrinsicCandidate,На уровне интерпретатора (Interpreter) такой оптимизации тоже нет.

В итоге,@IntrinsicCandidateаннотациядаJavaсерединаиспользовать Вобратитесь к示метод Может能одеялоHotSpotвиртуальная машинаоптимизацияизодинотметка,Это помогает повысить эффективность выполнения конкретного метода.,ноэтотдобрыйоптимизацияданетдействительныйпроисходитьвозвращаться需хотетьучитывать Инструменттелоиз运ХОРОШОчассредаисостояние

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

  1. Использование параметров JVM: 你МожеткпроходитьнастраиватьJVMпараметр ПриходитьполучатьJITкомпиляторизкомпилироватьинформация。Например,использовать-XX:+PrintCompilationпараметр МожетксуществоватьJVM运ХОРОШОчас打印出компилироватьизметодинформация。
  2. Использование JITWatch: JITWatchдаодин Может视化изинструмент,может помочьты анализируешьJVMиз Прямо сейчасчаскомпилировать ХОРОШОдля。этопроходитьанализироватьJVMизкомпилироватьбревно文件(Проходитьчасто Зависит от-XX:+PrintCompilationГенерация параметров),Предоставляет графический интерфейс, позволяющий увидеть, какой метод был скомпилирован.,И тип и причина компиляции.
  3. ИспользуйтеJFR (Java Flight Recorder): Java Flight RecorderдаJDKпоставлятьизодинпроизводительность Инструменты анализа,Он может записывать подробную информацию о среде выполнения JVM. Анализируя данные, записанные JFR,Вы можете узнать, какой метод скомпилирован,и собрали данные о производительности.
  4. Использование JMC (Java Mission Control): Java Mission ControlдаиJFRСотрудничатьиспользоватьизинструмент,Он предоставляет графический интерфейс для анализа данных, записанных JFR. Вы можете использовать JMC, чтобы увидеть, какой метод был скомпилирован.,и собрали данные о производительности.
  5. Использование опций отладки JIT-компилятора: НекоторыйJITкомпиляторпоставлять Понятно Параметры отладки,Позволяет просматривать детали компиляции скомпилированных методов. Например,использовать-XX:+PrintInliningПараметры можно распечататьметодв соответствииизинформация。
  6. Инструменты анализа с использованием JIT-компилятора: НекоторыйJITкомпиляторпоставлять Понятноспециализированныйиз Инструменты анализа,нравитьсяHotSpotизhsdisинструмент,Он может предоставить дизассемблированный код,Помогает понять скомпилированный код.

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

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

JavaсерединаизObject

на Яве,Objectдобрый Кусочек Вдобрыйнаследовать Иерархияиз顶конец,Местоиметьсортпо умолчаниюнаследоватьjava.lang.Objectдобрый。Objectдобрыйпоставлять Понятно Некоторый Проходитьиспользоватьизметод,Этиметоддля Местоиметьвернослонпоставлять Понятнобазовыйиз操делать。к ВниздаObjectдобрыйиз Некоторый主хотетьметод:

  1. protected Object clone() - создаватьивозвращаться该вернослонизодинкопировать。по умолчаниювыполнить БросатьCloneNotSupportedException
  2. boolean equals(Object obj) - Указывает, равны ли этому объекту другие объекты. Обычно используется для содержимого объектов Сравнивать.
  3. protected void finalize() - когдасборщик мусор определяется сборщиком объекта, когда выясняется, что ссылок на объект больше не существует. мусоравызовэтотметод。использовать Всуществоватьвернослонодеялопереработкавпередруководитьубирать。
  4. Class<?> getClass() - Возвращает класс времени выполнения этого объекта.
  5. int hashCode() - возвращаться该вернослониз Хэш码ценить。Проходитьчастоиequals()метод Сотрудничатьиспользовать,Чтобы гарантировать, что равные объекты имеют одинаковый хеш-код.
  6. void notify() - Пробуждает один поток, ожидающий этого объектного монитора.
  7. void notifyAll() - Пробуждает все потоки, ожидающие этого объектного монитора.
  8. String toString() - Возвращает строковое представление этого объекта.
  9. void wait() - привести ккогдавпереднитьждатьобращаться,прямойприезжать Другойодиннитьвызовэтотвернослонизnotify()илиnotifyAll()метод。
  10. void wait(long timeout) - привести ккогдавпереднитьждатьобращаться,прямойприезжать Другойодиннитьвызовэтотвернослонизnotify()илиnotifyAll()метод,или превышает указанный период ожидания。
  11. void wait(long timeout, int nanos) - привести ккогдавпереднитьждатьобращаться,прямойприезжать Другойодиннитьвызовэтотвернослонизnotify()илиnotifyAll()метод,или превышает указанный период ожидания,или ВОЗдогонять过nanosдополнительныйизнаносекунда。

Эти методы предусмотрены по следующим причинам:

  • Универсальность:для Местоиметьвернослонпоставлятьгруппабазовый操делать,Нет необходимости повторять калибровку.
  • Полиморфизм:позволятьпроходитьдогонятьдобрыйдобрыйформавестииспользоватьвызовребенокдобрыйвернослон特иметьиз ХОРОШОдля(нравитьсяпроходитьObjectвестииспользоватьвызовclone())。
  • безопасность:нравитьсяwait()иnotify()метод,Предоставляет механизм межпотокового взаимодействия.
  • Удобство:нравитьсяtoString()иequals()метод,Предоставляет настройку по умолчанию для строкового представления объектов.,Разработчикам удобно адаптироваться к конкретным потребностям.
  • Доступность:нравитьсяhashCode()метод,Поддерживает хранение и извлечение объектов в хэш-таблицах.
  • убирать:нравитьсяfinalize()метод,Хотя не рекомендуется использовать,Но предоставляет объекту возможность выполнять операции по сбору.

Пример кода

Язык кода:java
копировать
public class ExampleObject {
    public static void main(String[] args) {
        Object obj = new Object();
        System.out.println("Object hash code: " + obj.hashCode());
        System.out.println("Object class: " + obj.getClass().getName());
        System.out.println("Object as string: " + obj.toString());
    }
}

В этом примере,我ихсоздавать ПонятноодинObjectПример,ивызов ПонятноhashCode()getClass()иtoString()метод。

пониматьObjectдобрыйпоставлятьиз ЭтиметоддляJava开发ВОЗПриходитьобъяснять Нетчасто Тяжелыйхотеть,Потому что они являются краеугольным камнем языка Java.,А приезжать часто используется при написании и сопровождении кода. С помощью этих методов,Java гарантирует, что объекты разных классов могут выполнять основные операции взаимодействия.

В Java-программировании,Сравниватьдвавернослонданет Взаимнождатьдаодинобщийиз Задача。开发ВОЗ经частоиспользовать==операториequals()метод Приходитьруководить Сравнивать,ноэтоихсуществовать Функцияииспользоватьначальствоиметьсутьизокруг Не。В этой статье будет подробно рассмотреноequals()и==изокруг Не、соединения и приложения в различных сценариях.

==оператор:вестииспользоватьиз Сравнивать

==операториспользовать ВСравниватьдвавернослонизвестииспользоватьданеттакой же,То есть указывают ли они на один и тот же объект в памяти.

Пример кода
Язык кода:java
копировать
String s1 = new String("hello");
String s2 = s1;
System.out.println(s1 == s2); // выход правда, потому что s1 и s2 указать на тот же объект
equals()метод:логика Взаимнождатьиз Сравнивать

equals()методиспользовать ВСравниватьдвавернослонизлогика Взаимнождатьсекс,То есть равны ли значения их свойств. По умолчанию,Objectдобрыйизequals()метод Сравниватьвернослонизвестииспользовать,Но обычно необходимо переписать, чтобы настроить конкретную логику сравнения.

Пример кода
Язык кода:java
копировать
String s3 = new String("hello");
String s4 = new String("hello");
System.out.println(s3.equals(s4)); // выход правда, потому чтосодержание Взаимнождать

equals()и==изокруг Не

Сравниватьсодержаниеequals()Сравниватьвернослонизлогика Взаимнождатьсекс,==Сравниватьвернослонизвестииспользоватьданеттакой же。

  • переписатьequals()метод Можеткодеялопереписатьквыполнить Инструменттелоиз Сравниватьлогика,и==операторне могуодеялопереписать。
  • Тип ограничения==Можеткиспользовать ВСравниватьоригинальныйтип данных,иequals()может толькоиспользовать Ввернослон。
  • последовательность:использоватьequals()час,Необходимо соблюдать несколько принципов отношений эквивалентности.,нравитьсяс反секс、симметрия、Транзитивность ипоследовательность.
equals()и==изсоединять
  • ссылка на объект:нравитьсяфруктыдвавернослонизвестииспользоватьтакой же,Такequals()и==Всевстречавозвращатьсяtrue
  • Нетпереписать Состояние:нравитьсяфрукты Нетпереписатьequals()метод,Такequals()на самом деле Сравниватьиздавернослонизвестииспользовать,и==оператортакой же。
переписатьequals()методизлучшие практики
  1. переписать**hashCode()**:нравитьсяфруктыпереписать Понятноequals(),Следует такжепереписатьhashCode(),Равные объекты гарантированно будут иметь одинаковый хеш-код.
  2. исследовать**null**:существовать Сравниватьвпередисследоватьвернослонданетдляnull
  3. Экземпляр класса:убеждатьсявернослондаправильныйсортформа。
  4. использовать**instanceof**:существоватьруководитьпреобразование типоввперед,использоватьinstanceofисследоватьвернослониздействительныйдобрыйформа。
Реальная демонстрация кейса

к Вниздаодинправильныйпереписатьequals()иhashCode()из Пример。

Язык кода:java
копировать
public class Person {
    private String name;
    private int age;

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

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return age == person.age && name.equals(person.name);
    }

    @Override
    public int hashCode() {
        int result = name.hashCode();
        result = 31 * result + age;
        return result;
    }

    public static void main(String[] args) {
        Person p1 = new Person("John", 30);
        Person p2 = new Person("John", 30);
        System.out.println(p1.equals(p2)); // выход true
    }
}

правильныйпониматьииспользоватьequals()и==для编写правильныйизвернослон Сравниватьлогикаключевой Тяжелыйхотеть。开发ВОЗотвечать该в соответствии с Сравниватьиз Цельвыбиратьподходящийкогдаизметод,И обеспечить соблюдение соответствующих принципов программирования.

Копирование объектов Java: углубленный анализ глубокого и поверхностного копирования

В Java-программировании,Копирование объектов — обычная операция.,尤Чтодакогда需хотетькопироватьодинвернослонкподдерживать статусиз独立сексчас。Копировать точкидляглубокая копияи Мелкая копия,этоихсуществоватьвернослонизкопировать ХОРОШОдляначальствоиметьсутьиздругой。В этой статье будет подробно рассмотрено Разница между глубоким и поверхностным копированием、соединятьа такженравитьсячтона Явевыполнитьэтоих。

Мелкая копия: дублирование поверхности

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

Пример кода
Язык кода:java
копировать
public class ShallowCopyExample {
    static class Person {
        private String name;
        private Address address; // ссылочный тип

        public Person(String name, Address address) {
            this.name = name;
            this.address = address;
        }

        // Getters and setters
    }

    static class Address {
        private String city;

        public Address(String city) {
            this.city = city;
        }

        // Getters and setters
    }

    public static void main(String[] args) {
        Address address = new Address("New York");
        Person p1 = new Person("John", address);
        Person p2 = new Person("Jane", p1.address); // Неполная копия, ссылка на общий адрес

        p2.address.city = "Los Angeles";
        System.out.println(p1.address.city); // выход "Los Анджелес", адрес p1иp2 относится к одному и тому же объекту
    }
}
Глубокая копия: полная копия

Глубокое копирование рекурсивно копирует объект и все объекты, на которые он ссылается, до тех пор, пока все объекты, на которые он ссылается, не будут скопированы. Глубокая копия создает полностью независимую копию объекта.

Пример кода
Язык кода:java
копировать
public class DeepCopyExample {
    // Person и Address Определение класса То же, что и выше

    static class DeepCopyPerson extends Person {
        public DeepCopyPerson(Person original) {
            super(original.name); // копироватьбазовый тип
            this.address = new Address(original.address.city); // копироватьссылочный тип
        }
    }

    public static void main(String[] args) {
        Address address = new Address("New York");
        Person p1 = new Person("John", address);
        Person p2 = new DeepCopyPerson(p1); // глубокая копия

        p2.address.city = "Los Angeles";
        System.out.println(p1.address.city); // выход "New York", адреса p1иp2 — это разные объекты
    }
}
Разница между глубоким и поверхностным копированием
  • Глубина копирования:Мелкая копия Толькокопироватьвернослонсам,иглубокая копиякопироватьвернослони Что Местоиметьвестииспользоватьизвернослон。
  • ссылка на объект:Мелкая копияназадизвернослонобщий Понятнооригинальныйвернослонизвестииспользовать,глубокая копиятогда не делитесь。
  • накладные расходы:глубокая копия Сравнивать Мелкая копияиметь Даже大изпроизводительностьнакладные расходы, поскольку требуется копировать больше объектов.
выполнитьглубокая копияиз На что следует обратить внимание
  • Рекурсивное копирование:убеждатьсяглубокая копиярекурсивнокопировать Понятно Местоиметь Иерархияизвестииспользоватьвернослон。
  • циклическая ссылка:Обратите внимание на обработкувернослонмеждуизциклическая ссылка, избегайте бесконечной рекурсии.
  • производительностьучитывать:глубокая копия Может能встреча消耗Дажемногоизресурс,Особенно, когда граф объектов сложен или объекты большие.

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

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose