Junior
89
questionbank
Что ты знаешь о поверхностном копировании?
Ответ от нейросети
sobes.tech AI
Поверхностное копирование (shallow copy) создает новую копию объекта, но не копирует объекты, на которые ссылаются поля исходного объекта. Скорее, копируются сами ссылки.
Особенности:
- Изменения в мутабельных объектах, на которые ссылаются копии, будут видны в исходном объекте и наоборот.
- Быстрее, чем глубокое копирование для объектов со множеством ссылок.
Реализуется, например, методом clone() (если объект реализует Cloneable) или вручную.
Пример clone():
// Создаем класс с мутабельным полем
class Address {
String city;
public Address(String city) {
this.city = city;
}
@Override
public String toString() {
return "Address{" +
"city='" + city + '\'' +
'}';
}
}
// Создаем класс с ссылкой на Address, реализуем Cloneable
class Person implements Cloneable {
String name;
Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
// Реализуем поверхностное копирование через Object.clone()
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", address=" + address +
'}';
}
}
// Пример использования
public class ShallowCopyExample {
public static void main(String[] args) throws CloneNotSupportedException {
Address originalAddress = new Address("New York");
Person originalPerson = new Person("Alice", originalAddress);
// Поверхностное копирование
Person copiedPerson = (Person) originalPerson.clone();
System.out.println("Original Person: " + originalPerson);
System.out.println("Copied Person: " + copiedPerson);
// Изменяем мутабельное поле во вложенном объекте исходного...
originalAddress.city = "Los Angeles";
// ...изменения видны и в копии, так как ссылаются на один и тот же объект Address
System.out.println("\nAfter modifying original address:");
System.out.println("Original Person: " + originalPerson);
System.out.println("Copied Person: " + copiedPerson);
}
}
Применяется, когда нет необходимости в полном дублировании всей иерархии объектов, или когда вложенные объекты являются иммутабельными.