string,charの伝達
8121 ワード
面接問題から始めます.
実行結果は
この問題は簡単で、主に値伝達と引用伝達を考察しているので、みんなよく知っていると思います.
この問題から出発して、私が主に議論したいのはstringとchar[]伝達の違いです.stringは基本データ型ではなく、リファレンス伝達であるはずですが、なぜ上記の結果が出るのでしょうか.
コードを見てみましょう
実行結果は
上の4、5、および10、11から分かるように、main中のsおよびtest中のsは、最初に渡されたときに同じアドレスを指し、sに値を割り当てると、sは別の区間を指す.問題を説明するためにchar[]伝達を見てみましょう.
結果は
char[]が伝える3つの結果は同じで、最初の面接問題の結果がわかります.
まとめ:stringが過去に伝達された後、元の変数と同じアドレスを指すが、stringに値を付与した後、stringが異なるアドレスを指す場合、これはstringの不変性であり、この点について以下のように説明することができる.
stringに値を割り当てると、まず定数プールに行ってこの変数があるかどうかを探し、ある場合はstringにこのアドレスを指し、ない場合は新しいアドレスを開きます.次のコードがあります.
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