题目:
//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";//此处打断点
}
}
调试: