2020 neue Java-Interviewfragen – Objektkopie
1. Warum Klonen verwenden?
Wenn Sie ein Objekt verarbeiten und die Originaldaten für nachfolgende Vorgänge behalten möchten, müssen Sie es in der Java-Sprache klonen, beispielsweise für Instanzen von Klassen.
2. Wie implementiert man das Klonen von Objekten?
Es gibt zwei Möglichkeiten:
(Empfohlenes Tutorial: Java-Eingabeprogramm)
(1) Implementieren Sie die klonbare Schnittstelle und schreiben Sie das Objekt neu Die clone()-Methode in der Klasse:
(2) Implementieren Sie die Serializable-Schnittstelle und implementieren Sie das Klonen durch Objektserialisierung und -deserialisierung, wodurch ein echtes tiefes Klonen erreicht werden kann:
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class MyUtil { private MyUtil() { throw new AssertionError(); } @SuppressWarnings("unchecked") public static <T extends Serializable> T clone(T obj) throws Exception { ByteArrayOutputStream bout = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bout); oos.writeObject(obj); ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bin); return (T) ois.readObject(); // 说明:调用ByteArrayInputStream或ByteArrayOutputStream对象的close方法没有任何意义 // 这两个基于内存的流只要垃圾回收器清理对象就能够释放资源,这一点不同于对外部资源(如文件流)的释放 } }
Das Folgende ist der Testcode:
import java.io.Serializable; /** * 人类 * @author nnngu * */ class Person implements Serializable { private static final long serialVersionUID = -9102017020286042305L; private String name; // 姓名 private int age; // 年龄 private Car car; // 座驾 public Person(String name, int age, Car car) { this.name = name; this.age = age; this.car = car; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", car=" + car + "]"; } }
/** * 小汽车类 * @author nnngu * */ class Car implements Serializable { private static final long serialVersionUID = -5713945027627603702L; private String brand; // 品牌 private int maxSpeed; // 最高时速 public Car(String brand, int maxSpeed) { this.brand = brand; this.maxSpeed = maxSpeed; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public int getMaxSpeed() { return maxSpeed; } public void setMaxSpeed(int maxSpeed) { this.maxSpeed = maxSpeed; } @Override public String toString() { return "Car [brand=" + brand + ", maxSpeed=" + maxSpeed + "]"; } }
class CloneTest { public static void main(String[] args) { try { Person p1 = new Person("郭靖", 33, new Car("Benz", 300)); Person p2 = MyUtil.clone(p1); // 深度克隆 p2.getCar().setBrand("BYD"); // 修改克隆的Person对象p2关联的汽车对象的品牌属性 // 原来的Person对象p1关联的汽车不会受到任何影响 // 因为在克隆Person对象时其关联的汽车对象也被克隆了 System.out.println(p1); } catch (Exception e) { e.printStackTrace(); } } }
Hinweis: Das auf Serialisierung und Deserialisierung basierende Klonen ist nicht nur ein tiefes Klonen, sondern, was noch wichtiger ist, Sie können durch generische Qualifizierung überprüfen, ob das zu klonende Objekt vorhanden ist Unterstützt die Serialisierung. Diese Prüfung wird vom Compiler durchgeführt und löst zur Laufzeit keine Ausnahme aus. Diese Lösung ist offensichtlich besser als die Verwendung der Klonmethode der Objektklasse zum Klonen des Objekts. Es ist immer besser, Probleme zur Kompilierzeit offenzulegen, als sie zur Laufzeit zu belassen.
(Empfohlenes Video-Tutorial: Java-Video-Tutorial)
3. Was ist der Unterschied zwischen Deep Copy und Shallow Copy?
Flache Kopie kopiert nur die Referenzadresse des Objekts. Die beiden Objekte zeigen auf dieselbe Speicheradresse. Wenn also ein Wert geändert wird, ändert sich der andere Wert entsprechend. Dies ist eine flache Kopie (. Beispiel: „assign()“
Deep Copy dient zum Kopieren des Objekts und seines Werts. Wenn ein Wert der beiden Objekte geändert wird, wird der andere Wert nicht geändert. Dies ist eine tiefe Kopie. JSON.parse() und JSON. stringify(), aber diese Methode kann keine Funktionstypen kopieren)
Weitere Empfehlungen für Interviewfragen: Java-Interviewfragen
Das obige ist der detaillierte Inhalt von2020 neue Java-Interviewfragen – Objektkopie. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

AhasMapinjavaisadatastructurethatstoreskey-valuepairsforefficityRieval, Insertion und Delettion.itusushtheKey'ShashCode () methodTodeterminestoragelocationAnlowlowsaversaveryo (1) TimEcomplexityforget () und -Argine

TocreateAndueanArrayinjava, FirstDeclarethearraywithDedatatypeNDSquarebrackets, dannInstantiate -withenewKewordorinitializeTDirectlyWithValues; 1.DeclareandCreatatype [] arrayname = newdatatype [grizatatype

YoucancreateatheadinjavabytendingTheTheadhreadClassOrimplementingTherunnableInterface.2.EutendingThreadinvolvesCreresedaclassTheatoverridestherun () methodeCallingStart () onaninstance.3.implementingRunNableRequiresDefiningTherun () methodInaklassTheatimple

Bei der Verwendung des ArgParse -Moduls können die bereitgestellten Parameter erreicht werden, indem erforderlich ist. 1. Verwenden Sie erforderliche = treu, um optionale Parameter (z. B. -Eingabe) zu setzen, um erforderlich zu sein. Wenn dies bei der Ausführung des Skripts nicht bereitgestellt wird, wird ein Fehler gemeldet. 2. Positionsparameter sind standardmäßig erforderlich, und es ist nicht erforderlich, erforderlich zu sein, die erforderliche = true; 3.. Es wird empfohlen, Positionsparameter für die erforderlichen Parameter zu verwenden. Gelegentlich werden die optionalen Parameter von erforderlich = true verwendet, um die Flexibilität aufrechtzuerhalten. 4. Erforderlich = True ist der direkteste Weg, um Parameter zu steuern. Nach der Verwendung muss der Benutzer beim Aufrufen des Skripts entsprechende Parameter bereitstellen, da das Programm ansonsten einen Fehler auffordert und beendet.

Im Springboot umfassen die Methoden zur Verarbeitungsanforderungsparameter: 1. @RequestParam verwenden, um Abfrageparameter zu erhalten, die die erforderlichen, optionalen und Standardwerte unterstützt. 2. Empfangen Sie mehrere Parameter mit demselben Namen über List oder Kartentyp. 3. Binden Sie mehrere Parameter in Kombination mit @Modelattribute an das Objekt; 4. Verwenden Sie @PathVariable, um Variablen im URL -Pfad zu extrahieren. 5. Verwenden Sie @RequestParam, um die Formdaten in der Postanforderung zu verarbeiten. 6. Verwenden Sie MAP, um alle Anforderungsparameter zu empfangen. Die korrekte Auswahl der Anmerkungen kann angeforderte Daten effizient analysieren und die Entwicklungseffizienz verbessern.

KommentarinjavareignedByTheCompilerandusedForExplanation, Notizen, ordisablingcode.therearethreetypes: 1) Single-Linde-Deals startwith // und Lastuntiltheendoftheline; 2) Multi-Linde-Bingin-Dokumentation und-undcantranmultipline; 3) Dokumentation

Thebestjavaidein2024Dependyourneeds: 1.CHOOSEINTELLIJIDEAFORPROFESSIONAL, ENTERPRISE, Orull-StackDevelopmentDuetoitsSuperiorCodeIntelligence, Frameworkintegration, andtooling.2. Useclipseforhoxhensibilsibsibilität, LegacyPro-Eigenschaften, oderweigte, oderweigende, oderweilen, oderweilen, orwhenopenen-seourzatioten, legacyprojekts, orwhenopenen-seourzatioten, legacyprojekts, orwhenopenen-seourcatiatiox

Der Kern der Verwendung des Javahttpclientapi besteht darin, einen Httpclient zu erstellen, einen httprequest zu erstellen und httPesponse zu verarbeiten. 1. Verwenden Sie httpclient.newhttpclient () oder httpclient.newbuilder (), um Zeitüberschreitungen, Proxy usw. zu konfigurieren, um Clients zu erstellen. 2. Verwenden Sie httprequest.newbuilder (), um URI, Methode, Kopfzeile und Körper zu setzen, um Anfragen zu erstellen. 3.. Senden Sie synchrone Anfragen über Client.send () oder asynchrone Anfragen über Client.sendasync (); 4. Verwenden Sie Bodyhandlers.Ofstr
