java数组 序列化_程序猿的日常——Java基础之clone、序列化、字符串、数组
其實(shí)Java還有很多其他的基礎(chǔ)知識(shí),在日常工作技術(shù)撕逼中也是經(jīng)常被討論的問(wèn)題。
深克隆與淺克隆
在Java中創(chuàng)建對(duì)象有兩種方式:
一種是new操作符,它創(chuàng)建了一個(gè)新的對(duì)象,并把對(duì)應(yīng)的各個(gè)字段初始化成默認(rèn)值;
另一種是用clone方法,基于已有的對(duì)象創(chuàng)建一個(gè)新的對(duì)象,此時(shí)會(huì)根據(jù)原有的對(duì)象各個(gè)字段賦值給新的對(duì)象。
如果對(duì)象的字段都是基礎(chǔ)類型,沒(méi)有什么問(wèn)題,但是如果字段是對(duì)象,那么其實(shí)clone的時(shí)候復(fù)制的僅僅是對(duì)象的引用而已。
上面就是深克隆與淺克隆的區(qū)別。
在我們?nèi)粘5拈_(kāi)發(fā)中,如果涉及到克隆,就需要注意深克隆和淺克隆的區(qū)別。
如果想要實(shí)現(xiàn)深克隆,可以實(shí)現(xiàn)Cloneable接口,并且重寫(xiě)clone方法,然后一定要把涉及到深克隆問(wèn)題的內(nèi)部對(duì)象重新克隆一份。當(dāng)然如果這個(gè)對(duì)象里面還有其他的對(duì)象,那么仍然是有問(wèn)題的。
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));
}
序列化與反序列化
序列化就是把對(duì)象形成字節(jié)流,反序列化就是通過(guò)字節(jié)流創(chuàng)建對(duì)象。它主要用于兩個(gè)場(chǎng)景:
對(duì)象的持久化
對(duì)象的網(wǎng)絡(luò)傳輸
實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,只要實(shí)現(xiàn)Serializable接口即可。
String源碼
有一些Java經(jīng)驗(yàn)的都應(yīng)該了解,String字符串是不可變的,即:
String s1 = "123";
s1 = s1+"4";
其實(shí)他們倆是兩個(gè)對(duì)象。這是因?yàn)樵赟tring代碼中,有兩個(gè)變量,char的value數(shù)組,和hash值,但是它倆都是private final類型,也就是說(shuō)一旦創(chuàng)建就無(wú)法修改了。
public final class String
implements java.io.Serializable, Comparable, 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
而當(dāng)調(diào)用各種substring,replaceall等方法的時(shí)候,其實(shí)也是創(chuàng)建了新的string對(duì)象。
不過(guò)它并非不可修改的,也可以通過(guò)反射的方式修改內(nèi)容。
Java數(shù)組
關(guān)于數(shù)組,就有一個(gè)比較有意思的問(wèn)題——數(shù)組是對(duì)象么?其實(shí)在Java中所有的東西都是對(duì)象,都繼承了Object類。只不過(guò)為了方便實(shí)用,有提供了Object[]的引用方法。
詳細(xì)的可以參考這篇文章 Java數(shù)組特性
Java數(shù)據(jù)類型
Java包含了八種基本數(shù)據(jù)類型。六種數(shù)字類型,一種字符類型,一種Bool類型。
基本數(shù)據(jù)類型
包裝數(shù)據(jù)類型
位數(shù)
最小值
最大值
默認(rèn)值
byte
Byte
8位
-2^7
2^7-1
0
short
Short
16位
-2^15
2^15-1
0
int
Integer
32位
-2^31
2^31-1
0
long
Long
64位
-2^63
2^63-1
0L
float
Float
32位
1.4E-45
3.4028235E38
double
Double
64位
4.9E-324
1.7976931348623157E308
boolean
Boolean
1位
char
Char
16位
數(shù)據(jù)類型可以自動(dòng)轉(zhuǎn)換
低 ---------------------------------------------> 高
byte,short,char —> int —> long—> float —> double
總結(jié)
以上是生活随笔為你收集整理的java数组 序列化_程序猿的日常——Java基础之clone、序列化、字符串、数组的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: trunc( mysql写法_使用ora
- 下一篇: java 重启线程_java 可重启线程