欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java對(duì)象拷貝常見(jiàn)面試題及應(yīng)答匯總

 更新時(shí)間:2020年02月28日 15:30:57   作者:Jack方  
在本篇文章里小編給大家整理的是關(guān)于java對(duì)象拷貝常見(jiàn)面試題的相關(guān)內(nèi)容,需要的朋友們可以學(xué)習(xí)下。

為什么要使用克?。?

想對(duì)一個(gè)對(duì)象進(jìn)行處理,又想保留原有的數(shù)據(jù)進(jìn)行接下來(lái)的操作,就需要克隆了,Java語(yǔ)言中克隆針對(duì)的是類(lèi)的實(shí)例。

如何實(shí)現(xiàn)對(duì)象克???

有兩種方式:

實(shí)現(xiàn)Cloneable接口并重寫(xiě)Object類(lèi)中的clone()方法;實(shí)現(xiàn)Serializable接口,通過(guò)對(duì)象的序列化和反序列化實(shí)現(xiàn)克隆,可以實(shí)現(xiàn)真正的深度克隆,代碼如下:

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();
 
    // 說(shuō)明:調(diào)用ByteArrayInputStream或ByteArrayOutputStream對(duì)象的close方法沒(méi)有任何意義
    // 這兩個(gè)基于內(nèi)存的流只要垃圾回收器清理對(duì)象就能夠釋放資源,這一點(diǎn)不同于對(duì)外部資源(如文件流)的釋放
  }
}

下面是測(cè)試代碼:

import java.io.Serializable;
 
/**
 * 人類(lèi)
 * @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 + "]";
  }
 
}
/**
 * 小汽車(chē)類(lèi)
 * @author nnngu
 *
 */
class Car implements Serializable {
  private static final long serialVersionUID = -5713945027627603702L;
 
  private String brand;    // 品牌
  private int maxSpeed;    // 最高時(shí)速
 
  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對(duì)象p2關(guān)聯(lián)的汽車(chē)對(duì)象的品牌屬性
      // 原來(lái)的Person對(duì)象p1關(guān)聯(lián)的汽車(chē)不會(huì)受到任何影響
      // 因?yàn)樵诳寺erson對(duì)象時(shí)其關(guān)聯(lián)的汽車(chē)對(duì)象也被克隆了
      System.out.println(p1);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

注意:基于序列化和反序列化實(shí)現(xiàn)的克隆不僅僅是深度克隆,更重要的是通過(guò)泛型限定,可以檢查出要克隆的對(duì)象是否支持序列化,這項(xiàng)檢查是編譯器完成的,不是在運(yùn)行時(shí)拋出異常,這種是方案明顯優(yōu)于使用Object類(lèi)的clone方法克隆對(duì)象。讓問(wèn)題在編譯的時(shí)候暴露出來(lái)總是好過(guò)把問(wèn)題留到運(yùn)行時(shí)。

深拷貝和淺拷貝區(qū)別是什么?

淺拷貝只是復(fù)制了對(duì)象的引用地址,兩個(gè)對(duì)象指向同一個(gè)內(nèi)存地址,所以修改其中任意的值,另一個(gè)值都會(huì)隨之變化,這就是淺拷貝(例:assign())深拷貝是將對(duì)象及值復(fù)制過(guò)來(lái),兩個(gè)對(duì)象修改其中任意的值另一個(gè)值不會(huì)改變,這就是深拷貝(例:JSON.parse()和JSON.stringify(),但是此方法無(wú)法復(fù)制函數(shù)類(lèi)型)

到此這篇關(guān)于java對(duì)象拷貝常見(jiàn)面試題及應(yīng)答匯總的文章就介紹到這了,更多相關(guān)java對(duì)象拷貝常見(jiàn)面試題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java方法重寫(xiě)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java方法重寫(xiě)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    在Java和其他一些高級(jí)面向?qū)ο蟮木幊陶Z(yǔ)言中,子類(lèi)可繼承父類(lèi)中的方法,而不需要重新編寫(xiě)相同的方法。但有時(shí)子類(lèi)并不想原封不動(dòng)地繼承父類(lèi)的方法,而是想作一定的修改,這就需要采用方法的重寫(xiě)。方法重寫(xiě)又稱(chēng)方法覆蓋,下文給大家介紹java方法重寫(xiě)及重寫(xiě)規(guī)則,一起學(xué)習(xí)吧
    2017-04-04
  • 分布式面試消息隊(duì)列解決消息重復(fù)保證消息順序

    分布式面試消息隊(duì)列解決消息重復(fù)保證消息順序

    這篇文章主要介紹了分布式面試問(wèn)題:分布式消息隊(duì)列如何解決消息重復(fù)并保證消息順序面試問(wèn)題解答,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • MyBatis 如何簡(jiǎn)化的 JDBC(思路詳解)

    MyBatis 如何簡(jiǎn)化的 JDBC(思路詳解)

    MyBatis 是一個(gè) 持久層 框架,用于 簡(jiǎn)化JDBC開(kāi)發(fā),這篇文章主要介紹了MyBatis 如何簡(jiǎn)化的 JDBC(思路詳解),需要的朋友可以參考下
    2023-03-03
  • Java內(nèi)存管理垃圾回收基礎(chǔ)詳解

    Java內(nèi)存管理垃圾回收基礎(chǔ)詳解

    這篇文章主要為大家介紹了Java內(nèi)存管理垃圾回收基礎(chǔ)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • SpringBoot項(xiàng)目啟動(dòng)時(shí)增加自定義Banner的簡(jiǎn)單方法

    SpringBoot項(xiàng)目啟動(dòng)時(shí)增加自定義Banner的簡(jiǎn)單方法

    最近看到springboot可以自定義啟動(dòng)時(shí)的banner,然后自己試了一下,下面這篇文章主要給大家介紹了SpringBoot項(xiàng)目啟動(dòng)時(shí)增加自定義Banner的簡(jiǎn)單方法,需要的朋友可以參考下
    2022-01-01
  • SpringBoot如何讀取配置文件中的數(shù)據(jù)到map和list

    SpringBoot如何讀取配置文件中的數(shù)據(jù)到map和list

    這篇文章主要介紹了SpringBoot如何讀取配置文件中的數(shù)據(jù)到map和list,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java遍歷字符串和統(tǒng)計(jì)字符個(gè)數(shù)的操作方法

    Java遍歷字符串和統(tǒng)計(jì)字符個(gè)數(shù)的操作方法

    這篇文章主要介紹了Java遍歷字符串和統(tǒng)計(jì)字符個(gè)數(shù)的操作方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • 解決springboot自定義配置Boolean屬性不能生效的問(wèn)題

    解決springboot自定義配置Boolean屬性不能生效的問(wèn)題

    這篇文章主要介紹了解決springboot自定義配置Boolean屬性不能生效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 淺聊一下Spring中Bean的配置細(xì)節(jié)

    淺聊一下Spring中Bean的配置細(xì)節(jié)

    我們知道,當(dāng)寫(xiě)完一個(gè)普通的 Java 類(lèi)后,想讓 Spring IoC 容器在創(chuàng)建類(lèi)的實(shí)例對(duì)象時(shí)使用構(gòu)造方法完成實(shí)例對(duì)象的依賴(lài)注入,那么就需要在配置元數(shù)據(jù)中寫(xiě)好類(lèi)的 Bean 定義,包括各種標(biāo)簽的屬性。所以本文我們來(lái)說(shuō)說(shuō)這其中的配置細(xì)節(jié),需要的朋友可以參考下
    2023-07-07
  • java設(shè)計(jì)模式之實(shí)現(xiàn)對(duì)象池模式示例分享

    java設(shè)計(jì)模式之實(shí)現(xiàn)對(duì)象池模式示例分享

    對(duì)象池模式經(jīng)常用在頻繁創(chuàng)建、銷(xiāo)毀對(duì)象(并且對(duì)象創(chuàng)建、銷(xiāo)毀開(kāi)銷(xiāo)很大)的場(chǎng)景,比如數(shù)據(jù)庫(kù)連接池、線(xiàn)程池、任務(wù)隊(duì)列池等。本代碼簡(jiǎn)單,沒(méi)有限制對(duì)象池大小
    2014-02-02

最新評(píng)論