天天看點

程式猿的日常——Java基礎之clone、序列化、字元串、數組

其實Java還有很多其他的基礎知識,在日常工作技術撕逼中也是經常被讨論的問題。

深克隆與淺克隆

在Java中建立對象有兩種方式:

一種是new操作符,它建立了一個新的對象,并把對應的各個字段初始化成預設值;

另一種是用clone方法,基于已有的對象建立一個新的對象,此時會根據原有的對象各個字段指派給新的對象。

如果對象的字段都是基礎類型,沒有什麼問題,但是如果字段是對象,那麼其實clone的時候複制的僅僅是對象的引用而已。

上面就是深克隆與淺克隆的差別。

在我們日常的開發中,如果涉及到克隆,就需要注意深克隆和淺克隆的差別。

如果想要實作深克隆,可以實作Cloneable接口,并且重寫clone方法,然後一定要把涉及到深克隆問題的内部對象重新克隆一份。當然如果這個對象裡面還有其他的對象,那麼仍然是有問題的。

static class Body implements Cloneable{  
    public Head head;  
    public Body() {}  
    public Body(Head head) {this.head = head;}  
  
    @Override  
    protected Object clone() throws CloneNotSupportedException {  
        Body newBody =  (Body) super.clone();  
        newBody.head = (Head) head.clone();  
        return newBody;  
    }  
      
}  
static class Head implements Cloneable{  
    public  Face face;  
    public Head() {}  
    public Head(Face face){this.face = face;}  
    @Override  
    protected Object clone() throws CloneNotSupportedException {  
        return super.clone();  
    }  
}   
public static void main(String[] args) throws CloneNotSupportedException {  
    Body body = new Body(new Head());  
    Body body1 = (Body) body.clone();  
    System.out.println("body == body1 : " + (body == body1) );  
    System.out.println("body.head == body1.head : " +  (body.head == body1.head));  
}
           

參考 詳解Java中的clone方法 -- 原型模式

序列化與反序列化

序列化就是把對象形成位元組流,反序列化就是通過位元組流建立對象。它主要用于兩個場景:

  1. 對象的持久化
  2. 對象的網絡傳輸

實作起來很簡單,隻要實作Serializable接口即可。

參考 對Java Serializable(序列化)的了解和總結

String源碼

有一些Java經驗的都應該了解,String字元串是不可變的,即:

String s1 = "123";
s1 = s1+"4";
           

其實他們倆是兩個對象。這是因為在String代碼中,有兩個變量,char的value數組,和hash值,但是它倆都是private final類型,也就是說一旦建立就無法修改了。

public final class String  
    implements java.io.Serializable, Comparable<String>, CharSequence {  
    /** The value is used for character storage. */  
    private final char value[];  
  
    /** Cache the hash code for the string */  
    private int hash; // Default to 0  
           

而當調用各種substring,replaceall等方法的時候,其實也是建立了新的string對象。

不過它并非不可修改的,也可以通過反射的方式修改内容。

參考 Java中的String為什麼是不可變的? -- String源碼分析

Java數組

關于數組,就有一個比較有意思的問題——數組是對象麼?其實在Java中所有的東西都是對象,都繼承了Object類。隻不過為了友善實用,有提供了Object[]的引用方法。

詳細的可以參考這篇文章 Java數組特性

Java資料類型

Java包含了八種基本資料類型。六種數字類型,一種字元類型,一種Bool類型。

基本資料類型 包裝資料類型 位數 最小值 最大值 預設值
byte Byte 8位 -2^7 2^7-1
short Short 16位 -2^15 2^15-1
int Integer 32位 -2^31 2^31-1
long Long 64位 -2^63 2^63-1 0L
float Float 1.4E-45 3.4028235E38
double Double 4.9E-324 1.7976931348623157E308
boolean Boolean 1位
char Char

資料類型可以自動轉換

低 ---------------------------------------------> 高

byte,short,char —> int —> long—> float —> double

作者:xingoo

出處:http://www.cnblogs.com/xing901022

本文版權歸作者和部落格園共有。歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接!