先来一道java面试题: String s = new String(“zsx”); 问:创建了几个String Object?

*************************** 先别往下看,想想答案 *************************** 先上一个图:

如图所示,问题所示的语句创建了2个String对象和一个引用。 String s = new String(“zsx”); 相当于 String s1=”zsx”; String s=new String(s1); “zsx”作为一个常量字符串首先被创建,它被保存在“串池”中。 所谓串池,简单讲就是从程序运行开始,你创建的所有常量字符串被统一保存的地方。在串池中已经存在”zsx”这个串的情况下,如果你需要一个内容相同的串,你不需要再次创建一个,而是直接用这个就可以,这样当然是为了节省空间。(注意,一个字符串是无法被修改的,所以在程序的不同地方用不同变量引用同一个常量串没有任何危险,因为你只能读取它而不能修改它。) 然后,new String(“zsx”)也创建了一个对象,”zsx”作为传入构造方法的实际参数,其含义就是:我要创建一个串,它的内容和串池中的”zsx”内容一致! 前两步建立的对象都是保存在堆heap上的。 最后String s = new String(“zsx”); 所做的工作是:在栈stack中创建一个引用s,然后s指向上一步new出的对象所在地。结束。 我一直觉得String的内容简单的很,我早就掌握了。直到看到这题,我知道我以前真是too young,too naive。知其然而不知其所以然,谓之“菜鸟”也。 知道真相的我立马滚去学习,现将所获记录如下:

  1. String的两种创建方式
  2. String的常用方法
  3. StringBuffer、StringBuilder
  4. String与StringBuffer的对比
  5. 自己实现String的一些常用方法

2015/8/3 17:09添加: java里是没有运算符重载的,String+是StringBuffer的append()方法来实现的,如:

请把下面的程序编译后再反编译: String a = “a”; String b = “b”; String c = a + b; String d = c + 1; 得到的结果是: String a = “a”; String b = “b”; String c = (new StringBuilder(String.valueOf(a))).append(b).toString(); String d = (new StringBuilder(String.valueOf(c))).append(1).toString();

所以,重载的是 append() 方法。