1. 程式人生 > >java的按值傳遞

java的按值傳遞

java沒有指標,在java中都是按值傳遞

但是java中有物件引用,這裡按值傳遞的是引用的地址

1.java記憶體分配

StringBuilder s = new StringBuilder("abc");
public void test(StringBuilder stringBuilder) {
    stringBuilder = new StringBuilder("abcde");//輸出abcde
    stringBuilder.append("123");//輸出abc123
}

s是在棧上,而“abc”是在堆上分配的。當s作為引數傳遞時,傳遞的是s的值,s的值其實就是“abc”的地址,也就是s是指向“abc”的。

這就明白了,s按值傳遞時,傳了一個s的拷貝,s的拷貝也指向“abc”,所以在函式中new一個新的物件時,實際是s的拷貝指向一個新的地址,與s無關。而如果是改變s拷貝指向的資料時,則s指向的資料同樣改變。

2.基本資料型別的裝箱型別

其實基本資料型別的裝箱型別內部的value都是final,也就是不可改變的

當你再次給其賦值時,其實是新建了一個物件,並讓其指向了這個新的物件

比如大家都是知道string是不可變的,但string有replace/substring等方法貌似能夠改變其值,其實不是的,看下原始碼就知道了,其實原始碼也就是新建物件返回而已,也就是讓它指向了一個新的物件

3.hashcode  equals  ==

hashcode相等,equals不一定相等;equals相等,hashcode一定相等

==比較的是值,equals比較的是物件本身(參考按值傳遞的值的意思)