java 基礎面試題01
阿新 • • 發佈:2019-01-11
題目:
//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";//此處打斷點
}
}
除錯: