java面試

java 傳值

public static func(int a,String b,String c){
   a=a+1;
   b.trim()//去除字符串首尾的空字符
   c=b;
}
publci static void main(String[] args){
    int a = 0;
    String b = "Hello World";
    String c = "OK";
    func(a,b,c);
    System.out.println(""+a+","+b+","+c);
    }

這段程序的輸出結果是: 0,Hello World,OK。
a顯然是兩個不同的局部變量,並且直接就是把值複製給函數參數變量,b和c雖然是引用類型,但是也是一樣,把指針指向的地址複製給函數參數變量,但是都沒有對其指向的數據進行修改。
改下代碼再來分析

public static func(int a,String b,String c){
   a=a+1;
   b+="java";
   c=b;
}
publci static void main(String[] args){
    int a = 0;
    String b = "Hello World";
    String c = "OK";
    func(a,b,c);
    System.out.println(""+a+","+b+","+c);
    }

輸出結果還是: 0,Hello World,OK。
重點在b+="java";這裏是讓函數的裏的b變量指向了新的字符串Hello Worldjava。並沒有改變原來指向的值。
那麼要如何改變傳進來的值呢,使用StringBuilder類。

package javabasic;

public class Delivery {

    public static void func(int a,StringBuilder b,StringBuilder c){
        a++;
        b.append("java");
        c.delete(0, 10);
        c.append("perfect");
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        int a = 0;
        StringBuilder b = new StringBuilder("Hello world");
        StringBuilder c = new StringBuilder("OK");
        func(a,b,c);
        System.out.println(a+","+b+","+c);
    }

}

字符串對象

以下創建了幾個對象

String A ,B ,C;
A = "a";
B = "b";
A = A+B;
StringBuffer D =new StringBuffer("abc");
D = D.append("567");

我的答案是:”a” “b” “ab” “abc” “567” StringBuffer D, 總共6個

關於java 的字符串對象有兩點要注意:
1.所有字符串常量都放在字符串池中,是不可以改變的。
String a = “abc”; String b = “abc”;
a , b 指向同一個對象。
2.創建字符串對象的方法有,用”” 或 new,new 出來的對象不會放到字符串池中。所以new String(“abc”);會創建兩個對象(“abc”沒有在字符串池中);

自己的理解是不對的,看下最新的解釋,需要學過編譯原理
首先, 明確一下 創建對象 的具體含義. 按我的理解, 如果字符串是 字符常量, 那麼這個字符串對象是在編譯時候確定好的, 它是存放在常量池中的, 因此就不算是創建了一個字符串對象, 而如果有 String b = new String(“abc”) 之類的操作, 那麼可以認爲是創建了字符串對象, 並與變量 b 關聯.

根據上面的定義, 那麼有: “a”, “b”, “abc”, “567” 都是常量, 放在常量池中的, 因此就不算是創建對象了.

那麼來看一下代碼:源碼:

1: String a,b,c;
2: a = "a";
3: b = "b";
4: a = a+b;
5: StringBuffer d = new StringBuffer("abc");
6: d = d.append("567");

爲了方便起見, 我手動給每一行編號了.再來看一下對應的字節碼:

Code:
  stack=3, locals=5, args_size=1
     0: ldc           #2                  // String a
     2: astore_1
     3: ldc           #3                  // String b
     5: astore_2
     6: new           #4                  // class java/lang/StringBuilder
     9: dup
    10: invokespecial #5                  // Method java/lang/StringBuilder."<init>":()V
    13: aload_1
    14: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
    17: aload_2
    18: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
    21: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
    24: astore_1
    25: new           #8                  // class java/lang/StringBuffer
    28: dup
    29: ldc           #9                  // String abc
    31: invokespecial #10                 // Method java/lang/StringBuffer."<init>":(Ljava/lang/String;)V
    34: astore        4
    36: aload         4
    38: ldc           #11                 // String 567
    40: invokevirtual #12                 // Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
    43: astore        4
    45: return

由字節碼可以看出, 源碼的第四行 a = a+b 翻譯爲如下代碼:

StringBuilder builder = new StringBuilder();
builder.append(a);
builder.append(b);
a = builder.toString();

那麼這裏就新建了一個對象 new StringBuilder(), 接着調用 builder.toString() 方法, 它源碼如下:

@Override
public String toString() {
    // Create a copy, don't share the array
    return new String(value, 0, count);
}

於是 builder.toString() 方法創建了一個 String 對象, 因此目前我們已經創建了 兩個對象 了.

接着第五行 StringBuffer d = new StringBuffer(“abc”) 毫無疑問是 創建了對象 StringBuffer, 於是我們就有 三個對象 了. 有一點需要注意的是 StringBuffer d 從始至終都沒有調用 toString 方法, 因此就不會有多餘的 String 創建出來.

總結:

“a”: 字符串常量, 不算創建對象
“b”: 字符串常量, 不算創建對象
builder 對象: 在執行 a = a+b 時創建.
“ab”: 由 StringBuilder.toString() 創建.
“abc”: 字符串常量, 不算創建對象
“567”: 字符串常量, 不算創建對象
d: 通過 new StringBuffer(“abc”) 創建.
因此最終有三個對象創建了.

發佈了31 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章