string,charの伝達

8121 ワード

面接問題から始めます.
 1 public class test1{

 2     String str=new String("good");

 3     char[] ch={'a','b','c'};

 4     public static void main(String[] args){

 5         test1 ex=new test1();

 6         ex.change(ex.str,ex.ch);

 7         System.out.println(ex.str+"and");

 8         System.out.println(ex.ch);

 9     }

10     public void change(String str,char ch[]){

11         str="test ok";

12         ch[0]='g';

13     }

14 }

実行結果は
goodand

gbc

この問題は簡単で、主に値伝達と引用伝達を考察しているので、みんなよく知っていると思います.
この問題から出発して、私が主に議論したいのはstringとchar[]伝達の違いです.stringは基本データ型ではなく、リファレンス伝達であるはずですが、なぜ上記の結果が出るのでしょうか.
コードを見てみましょう
 1 class test1{

 2     public static void main(String[] args){

 3         String s="aa";

 4         int i=System.identityHashCode(s);

 5         System.out.println(i);

 6         System.out.println("-----------------");

 7         test(s);

 8     }

 9     public static void test(String s){

10         int i=System.identityHashCode(s);

11         System.out.println(i);

12         System.out.println("-----------------");

13         s="dd";

14         int j=System.identityHashCode(s);

15         System.out.println(j);

16     }

17 }

実行結果は
366712642

-----------------

366712642

-----------------

1829164700

上の4、5、および10、11から分かるように、main中のsおよびtest中のsは、最初に渡されたときに同じアドレスを指し、sに値を割り当てると、sは別の区間を指す.問題を説明するためにchar[]伝達を見てみましょう.
 1 class test1{

 2     public static void main(String[] args){

 3         char[] a={'1'};

 4         int i=System.identityHashCode(a);

 5         System.out.println(i);

 6         System.out.println("-----------------");

 7         test(a);

 8     }

 9     public static void test(char[] s){

10         int i=System.identityHashCode(s);

11         System.out.println(i);

12         System.out.println("-----------------");

13         s[0]='d';

14         int j=System.identityHashCode(s);

15         System.out.println(j);

16     }

17 }

結果は
366712642

-----------------

366712642

-----------------

366712642

char[]が伝える3つの結果は同じで、最初の面接問題の結果がわかります.
まとめ:stringが過去に伝達された後、元の変数と同じアドレスを指すが、stringに値を付与した後、stringが異なるアドレスを指す場合、これはstringの不変性であり、この点について以下のように説明することができる.
stringに値を割り当てると、まず定数プールに行ってこの変数があるかどうかを探し、ある場合はstringにこのアドレスを指し、ない場合は新しいアドレスを開きます.次のコードがあります.
class test1{

    public static void main(String[] args){

        String s="1";

        int i=System.identityHashCode(s);

        System.out.println(i);

        System.out.println("-----------");

        String s1="1";

        int i1=System.identityHashCode(s1);

        System.out.println(i1);

    }

    

}

  

366712642

-----------

366712642