您的位置:首页 > 职场人生

Java基础查漏补缺:(String篇)一个面试题问倒了我,原来String并不简单

2017-12-22 14:07 645 查看
先来一道java面试题:
String s = new String(“zsx”);
问:创建了几个String Object?

[b][b][b][b][b][b][b][b][b][b][b][b] 先别往下看,想想答案 [/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]
先上一个图:

如图所示,问题所示的语句创建了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。知其然而不知其所以然,谓之“菜鸟”也。
知道真相的我立马滚去学习,现将所获记录如下:

String的两种创建方式

String的常用方法

StringBuffer、StringBuilder

String与StringBuffer的对比

自己实现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() 方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java
相关文章推荐