其實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方法 -- 原型模式
序列化與反序列化
序列化就是把對象形成位元組流,反序列化就是通過位元組流建立對象。它主要用于兩個場景:
- 對象的持久化
- 對象的網絡傳輸
實作起來很簡單,隻要實作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
本文版權歸作者和部落格園共有。歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接!