Java String作為引數的情況

weixin_34321977發表於2016-01-01

layout: post
title: Java String作為引數的情況
date: 2015-05-28
categories: blog
tags: [Java,String]
category: Java
description: java中的String作為引數是需要特別的注意.


String是不可以被修改的
一旦String物件建立之後,我們是不能修改他的值的(這裡的修改是指在記憶體的同一位置).我們可以從JDK的String類裡看到
比如substring()方法

    public String substring(int beginIndex, int endIndex) {
    if (beginIndex < 0) {
        throw new StringIndexOutOfBoundsException(beginIndex);
    }
    if (endIndex > value.length) {
        throw new StringIndexOutOfBoundsException(endIndex);
    }
    int subLen = endIndex - beginIndex;
    if (subLen < 0) {
        throw new StringIndexOutOfBoundsException(subLen);
    }
    return ((beginIndex == 0) && (endIndex == value.length)) ? this
            : new String(value, beginIndex, subLen);
}

在最後,我們發現他返回的String是重新new的一個物件,而不是在原物件的基礎上修改

基本型別做引數傳的是值,物件傳遞的是相當於引用
傳值是不會導致資料的改變的,但是當傳遞的是引用,在方法中改變了物件的某欄位,會導致方法外部的變數也改變
example:

public class Test {
public int i = 0;
public void chaneg(Test t) {
    t.i = 10;
}
public static void main(String[] args) {
    Test test = new Test();
    System.out.println(test.i);
    test.chaneg(test);
    System.out.println(test.i);
} 
}

output: 0 10

說明在方法內改變變數值導致外部改變
但是對於String當值的改變是,記憶體地址已改變
則相當於下面的example:

public class Test {
public int i = 0;
public void chaneg(Test t) {
    t = new Test();//改變記憶體地址
    t.i = 10;
}
public static void main(String[] args) {
    Test test = new Test();
    System.out.println(test.i);
    test.chaneg(test);
    System.out.println(test.i);
}
}

output: 0 0

也就是說沒有改變外部的值
總結
當在方法中該變數物件的記憶體地址之後,是不會影響外部的值,但是如果只是改變了某欄位的值,外部的值會跟著改變.

相關文章