1. 程式人生 > >java 基礎面試題01

java 基礎面試題01

題目:

//1.請問執行下面的程式大致會輸出類似什麼內容?  

public class TestThisToString{  
	  public String toString(){  
		  String str = "my memory location is :" + this;
	    return str;  
	  }  
	  public static void main(String[] args)  {  
		  System.out.println("---");
	    System.out.println(new TestThisToString());  
	  }  
}  

輸出結果:

---
Exception in thread "main" java.lang.StackOverflowError
	at java.lang.System.arraycopy(Native Method)
	at java.lang.String.getChars(String.java:826)
	at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:416)
	at java.lang.StringBuilder.append(StringBuilder.java:132)
	at java.lang.StringBuilder.<init>(StringBuilder.java:110)
	at wn.comeOn.java.test.TestThisToString.toString(TestThisToString.java:4)
	at java.lang.String.valueOf(String.java:2847)
	at java.lang.StringBuilder.append(StringBuilder.java:128)
	at wn.comeOn.java.test.TestThisToString.toString(TestThisToString.java:4)
	at java.lang.String.valueOf(String.java:2847)
	at java.lang.StringBuilder.append(StringBuilder.java:128)
	at wn.comeOn.java.test.TestThisToString.toString(TestThisToString.java:4)
	at java.lang.String.valueOf(String.java:2847)
	at java.lang.StringBuilder.append(StringBuilder.java:128)
	at wn.comeOn.java.test.TestThisToString.toString(TestThisToString.java:4)
分析:

TestThisToString重寫了父類Object的toString()方法.

因是System.out.println(new TestThisToString());  則這裡會呼叫TestThisToString類的toString()方法,因為“+”號連線了一個String和一個引用,所以會發生型別轉換,將this這個型別轉換為String型,所以就要呼叫toSting() ,這就產生了一個死迴圈,所以就會StackOverflowError 記憶體溢位。

該程式碼的除錯如圖:









2.myTest1() 與 myTest2() 方法,哪個的效率相對較高?為什麼  



public class testBuilder{  
  
  public static String myTest1(){  
	return "a"+"b"+"b"+"b"+"b"+"b"+"b"  
	+"c" +"c" +"c" +"c" +"c" ;  
  }  
  public static String myTest2(){  
	StringBuilder builder = new StringBuilder();  
	builder.append("a").append("b").append("b")  
	.append("b").append("b").append("b").append("b"  
	.append("c").append("c").append("c").append("c").append("c") ;  
	return builder.toString();  
  }  
  
  
  public static void main(String[] args){  
	System.out.println(myTest1());  
	System.out.println(myTest2());  
  }  
}  
分析:

myTest1() 方法快於 myTest2();

原因:實際執行過程中 如果+的是字串 非引用 ,("+"號連線String型 的字串),+號在編譯過程中就去掉了,也就是在編譯期就成了abbbbbbccccc ,而StringBuilder的append方法還要一個一個的拼接,所以myTest1() 快。


擴充套件實際執行過程中 如果"+"號連線String型 的字串和引用,會在編譯時轉換為StringBuilder的append進行連線,如下演示:

演示程式碼:

public class w {
	public static void main(String[] args) {
		// 演示
		String a = "aaa";
		String str = a + "b" + "b" + "b" + "b";//此處打斷點
	}
}


除錯: