Java中什么是字符串的拷贝_关于java中字符串对象的拷贝
1兩種數(shù)據(jù)類型
java中有兩種數(shù)據(jù)類型:
基本數(shù)據(jù)類型
引用數(shù)據(jù)類型
基本數(shù)據(jù)類型有整型、浮點型的數(shù)字常量和字符常量,而類是引用數(shù)據(jù)類型,所謂引用就是一個對象等于另外一個對象時(前提同一類),都使用相同的內(nèi)存空間。
字符串屬于常量,但卻有點特殊,它屬于引用數(shù)據(jù)類型,本文目的是探究學(xué)習(xí)java中關(guān)于?字符串對象的拷貝所存在的疑問,記錄于此以加強記憶。
另外,對象是否相等的判斷也因為“引用”這一概念讓人費解,于是有下邊關(guān)于“==”和“equals”方法的區(qū)分,假設(shè)有對象A和對象B,
A==B,不僅判斷A中成員變量和方法與B是否相同,而且判斷A和B是否引用同一內(nèi)存塊,只有二者都為真,(A==B)才為true
A.equals(B),只判斷A中成員變量和方法與B是否相同,相同,則有(A.equals(B))為true
2引用類的對象賦值
一般的對象都屬于引用數(shù)據(jù)類型,舉例如下,
首先建立一個關(guān)于日期的Mydate類,構(gòu)造方法區(qū)分參數(shù)的數(shù)量、類型分為三個,還有一個普通成員方法setDate,用來設(shè)置日期值。
package thisTest;
public class Mydate {
public int year;
public int month;
public int day;
public Mydate(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
}
public Mydate(){
this(1990, 1, 1);
}
public Mydate(Mydate d){
this(d.year, d.month, d.day);
}
public void setDate(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
}
}
其次,主函數(shù)的源文件可以編寫為,
package thisTest;
public class mainTest {
public static void main(String[] args) {
Mydate dt1 = new Mydate(1990, 3, 4);
Mydate dt2 = dt1;
System.out.println("--------修改前的--------");
System.out.println(dt1.year+"."+dt1.month+"."+dt1.day);
System.out.println(dt2.year+"."+dt2.month+"."+dt2.day);
if (dt1.equals(dt2)){
System.out.println("內(nèi)容相同");
if(dt1 == dt2)
System.out.println("而且引用相同的內(nèi)存");
}
else{
System.out.println("內(nèi)容不同");
}
dt2.setDate(2000, 3, 4);
System.out.println("--------修改后的--------");
System.out.println(dt1.year+"."+dt1.month+"."+dt1.day);
System.out.println(dt2.year+"."+dt2.month+"."+dt2.day);
if (dt1.equals(dt2)){
System.out.println("內(nèi)容相同");
if(dt1 == dt2)
System.out.println("而且引用相同的內(nèi)存");
}
else{
System.out.println("內(nèi)容不同");
}
}
}
得到運行結(jié)果
可見,類是引用數(shù)據(jù)類型,“Mydate dt2 = dt1;”這樣賦值,傳遞的是對象引用,使得兩個對象引用同一個實例,沒有創(chuàng)建新的實例。
3字符串類的拷貝
增加一個person的類,里邊包含人的名字name和出生日期bir,
package thisTest;
public class person {
String name;
Mydate bir;
person(String name, Mydate bir){
this.name = name;
this.bir = bir;
}
person(person p){
this(p.name, p.bir);
}
person(){
this("",null);
}
public void setName(String name){
this.name = new String(name);
}
}
mian函數(shù)的代碼如下,
public class mainTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
person p1 = new person("zhangsan", new Mydate(1990, 1, 1));
person p2 = new person(p1);
if (p1.bir.equals(p2.bir)){
System.out.println("一般對象內(nèi)容相同");
if(p1.bir == p2.bir)
System.out.println("而且引用相同的內(nèi)存");
}
else{
System.out.println("一般對象內(nèi)容不同");
}
if(p2.name.equals(p1.name)){
System.out.println("字符串對象內(nèi)容相同");
if(p1.name == p2.name)
System.out.println("而且引用相同的內(nèi)存");
}
else{
System.out.println("字符串對象內(nèi)容不同");
}
//System.out.println(p1.name+":"+p1.bir.year+"."+p1.bir.month+"."+p1.bir.day);
//修改
System.out.println("----------修改后的-----------");
p2.setName("zhangsan");
p2.bir.setDate(1993, 3, 4);
if (p1.bir.equals(p2.bir)){
System.out.println("一般對象內(nèi)容相同");
if(p1.bir == p2.bir)
System.out.println("而且引用相同的內(nèi)存");
}
else{
System.out.println("一般對象內(nèi)容不同");
}
if(p2.name.equals(p1.name)){
System.out.println("字符串對象內(nèi)容相同");
if(p1.name == p2.name)
System.out.println("而且引用相同的內(nèi)存");
}
else{
System.out.println("字符串對象內(nèi)容不同");
}
System.out.println("-----------------------------");
System.out.println(p1.name+":"+p1.bir.year+"."+p1.bir.month+"."+p1.bir.day);
System.out.println("----------修改后的-----------");
System.out.println(p2.name+":"+p2.bir.year+"."+p2.bir.month+"."+p2.bir.day);
}
}
紅框中的是成員變量bir的值,在main函數(shù)中,我們已經(jīng)new了一個person類的對象p2,表面上,p2實例和p1實例會保存在不同的內(nèi)存塊,但是事實上,p2內(nèi)的成員變量bir與p1內(nèi)的成員變量bir保存在了相同的內(nèi)存塊,即教材中說的“淺拷貝”,要實現(xiàn)“深拷貝”,就要在person類的構(gòu)造函數(shù)中再new一個日期的對象,即“this.bir = new Mydate(bir);”,為p2中的日期分配好內(nèi)存,即可實現(xiàn)“深拷貝”,結(jié)果是,
可見,p2的改變不會影響p1,person中的bir對象保存在了不同的內(nèi)存塊。
person類的姓名賦值函數(shù)setName中,如果是“this.name = name”,結(jié)果是
也即字符串是引用型的,僅通過“=”賦值,只會復(fù)制地址,從而指向相同的內(nèi)存塊。
如果是“this.name = new String(name);”,結(jié)果是
即,字符串的內(nèi)容實相同的,但不是保存在同一個內(nèi)存塊,實現(xiàn)了教材中的“深拷貝”。
可見,引用型的對象所呈現(xiàn)的特性和第2章一樣,對p2的改變,也會造成p1的改變。而引用型的String型,與一般的對象所不同的是,當(dāng)用“=”賦值時,如果前后賦的值不同,字符串對象就會指向不同的內(nèi)存塊,總的可以用下圖歸納
總結(jié)
以上是生活随笔為你收集整理的Java中什么是字符串的拷贝_关于java中字符串对象的拷贝的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美食怎么拍 让你的美食照片更加诱人的拍摄
- 下一篇: Java结合POI清洗Excel