日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java中什么是字符串的拷贝_关于java中字符串对象的拷贝

發布時間:2024/9/27 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中什么是字符串的拷贝_关于java中字符串对象的拷贝 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1兩種數據類型

java中有兩種數據類型:

基本數據類型

引用數據類型

基本數據類型有整型、浮點型的數字常量和字符常量,而類是引用數據類型,所謂引用就是一個對象等于另外一個對象時(前提同一類),都使用相同的內存空間。

字符串屬于常量,但卻有點特殊,它屬于引用數據類型,本文目的是探究學習java中關于?字符串對象的拷貝所存在的疑問,記錄于此以加強記憶。

另外,對象是否相等的判斷也因為“引用”這一概念讓人費解,于是有下邊關于“==”和“equals”方法的區分,假設有對象A和對象B,

A==B,不僅判斷A中成員變量和方法與B是否相同,而且判斷A和B是否引用同一內存塊,只有二者都為真,(A==B)才為true

A.equals(B),只判斷A中成員變量和方法與B是否相同,相同,則有(A.equals(B))為true

2引用類的對象賦值

一般的對象都屬于引用數據類型,舉例如下,

首先建立一個關于日期的Mydate類,構造方法區分參數的數量、類型分為三個,還有一個普通成員方法setDate,用來設置日期值。

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;

}

}

其次,主函數的源文件可以編寫為,

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("內容相同");

if(dt1 == dt2)

System.out.println("而且引用相同的內存");

}

else{

System.out.println("內容不同");

}

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("內容相同");

if(dt1 == dt2)

System.out.println("而且引用相同的內存");

}

else{

System.out.println("內容不同");

}

}

}

得到運行結果

可見,類是引用數據類型,“Mydate dt2 = dt1;”這樣賦值,傳遞的是對象引用,使得兩個對象引用同一個實例,沒有創建新的實例。

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函數的代碼如下,

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("一般對象內容相同");

if(p1.bir == p2.bir)

System.out.println("而且引用相同的內存");

}

else{

System.out.println("一般對象內容不同");

}

if(p2.name.equals(p1.name)){

System.out.println("字符串對象內容相同");

if(p1.name == p2.name)

System.out.println("而且引用相同的內存");

}

else{

System.out.println("字符串對象內容不同");

}

//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("一般對象內容相同");

if(p1.bir == p2.bir)

System.out.println("而且引用相同的內存");

}

else{

System.out.println("一般對象內容不同");

}

if(p2.name.equals(p1.name)){

System.out.println("字符串對象內容相同");

if(p1.name == p2.name)

System.out.println("而且引用相同的內存");

}

else{

System.out.println("字符串對象內容不同");

}

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函數中,我們已經new了一個person類的對象p2,表面上,p2實例和p1實例會保存在不同的內存塊,但是事實上,p2內的成員變量bir與p1內的成員變量bir保存在了相同的內存塊,即教材中說的“淺拷貝”,要實現“深拷貝”,就要在person類的構造函數中再new一個日期的對象,即“this.bir = new Mydate(bir);”,為p2中的日期分配好內存,即可實現“深拷貝”,結果是,

可見,p2的改變不會影響p1,person中的bir對象保存在了不同的內存塊。

person類的姓名賦值函數setName中,如果是“this.name = name”,結果是

也即字符串是引用型的,僅通過“=”賦值,只會復制地址,從而指向相同的內存塊。

如果是“this.name = new String(name);”,結果是

即,字符串的內容實相同的,但不是保存在同一個內存塊,實現了教材中的“深拷貝”。

可見,引用型的對象所呈現的特性和第2章一樣,對p2的改變,也會造成p1的改變。而引用型的String型,與一般的對象所不同的是,當用“=”賦值時,如果前后賦的值不同,字符串對象就會指向不同的內存塊,總的可以用下圖歸納

總結

以上是生活随笔為你收集整理的Java中什么是字符串的拷贝_关于java中字符串对象的拷贝的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。