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";//此处打断点
	}
}


调试:






















猜你喜欢

转载自blog.csdn.net/wangnanwlw/article/details/52625310