1. 程式人生 > >String和StringBuffer相關

String和StringBuffer相關

mage -- edi 實參 設置 自己 span 也會 但是

在http://www.cnblogs.com/aishangJava/p/7262577.html這裏看到了一個題目,就去嘗試了一下,代碼如下:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controller;

/**
 *
 * @author Administrator
 */
public class change {

    public static void main(String[] args) {
        String s1 
= "hello"; String s2 = "world"; StringBuffer sb1 = new StringBuffer("hello"); StringBuffer sb2 = new StringBuffer("world"); change(s1, s2); System.out.println(s1 + "---" + s2); change(sb1,sb2); System.out.println(sb1+"---"+sb2); } public
static void change(String s1, String s2) { s1 = s2; s2 = s1 + s2; } public static void change(StringBuffer sb1, StringBuffer sb2) { sb1 = sb2; System.out.println("first sb1:"+sb1); sb2.append(sb1); System.out.println("sb1:"+sb1+"\tsb2:"+sb2); } }

技術分享

百度了一下,整理一下自己的理解:

在第一個change中,改變的只是形參的值,實參並沒有改變;

第二個change中,由於StringBuffer定義時,sb1是存儲在棧空間裏的一個指向堆空間的一個地址,堆的值就是“hello”,當進行sb1=sb2的操作後,sb1中的地址就指向了sb2所指向的對象,所以在此時sb1的值為“world”,之後sb2進行append,隨之s1的值變為“worldworld”。

至於為什麽最後sb1輸出的還是"hello",百度看了一下是這麽回事:

要知道java中所有方法的實參都是傳入變量的副本,所以對於基本類型參數,改變其副本值,原始參數不受影響,而對於引用類型參數,傳入的是引用的副本,原始引用和副本引用指向同一個對象,操作副本引用指向的對象時,原始引用的對象也會隨之改變(說白了,兩個引用指向一個對象),但是 sb1=sb2,是說將這個sb1的副本引用設置為sb2的引用,使得副本引用sb1指向了sb2對象,但是原始引用sb1卻沒有參與任何操作,所以sb1不變。

String和StringBuffer相關