A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© NO? 中级黑马   /  2014-4-2 00:36  /  874 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

字符串String s1 = “abc”;
那么对这个字符串进行substring和replace操作,字符串缓冲区是不是多两个新的字符串
是不是相当于
String s2 = new String(s1.substring(1));
String s3 = new String(s1.replace("bc", "xyz"));
如果字符串缓冲区已经存在s2 和 s3这俩字符串,是不是只是将旧的指引转移到他们俩身上了 而没有创建新的

评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1

查看全部评分

4 个回复

倒序浏览
首先说 s1是一个对象 对象调用方法,调用的两个方法 分别产生了一个字符串 然后再把字符串的地址赋给s2,s3,而s1是不变的
回复 使用道具 举报
String s1 = “abc”;这种 就是像你说的 字符缓冲区有就引用地址赋值给s1

String s2 = new String(“abc”); 带new的都是新建一个
回复 使用道具 举报
改变的只是指针的地址,没有new也就没有创建新的对象
回复 使用道具 举报
我觉得你应该先搞清楚
String s="aaa" 和 String s=new String("aaa")底层都做了什么。

String s = “aaa”;(采用字面值方式赋值)
1)  查找 String Pool(字符串池)中是否存在“aaa”这个对象,如果不存在,则在 String Pool 中创建
一个“aaa”对象,然后将 String  Pool 中的这个“aaa”对象的地址返回来,赋给引
用变量s,这样s会指向String Pool中的这个“aaa”字符串对象
2)  如果存在,则不创建任何对象,直接将 String Pool中的这个“aaa”对象地址返回来,
赋给 s 引用。
String s = new String(“aaa”);
1)  首先在String Pool 中查找有没有“aaa”这个字符串对象,如果有,则不在 String Pool
中再去创建“aaa”这个对象了,直接在堆中(heap)中创建一个“aaa”字符串对
象,然后将堆中的这个“aaa”对象的地址返回来,赋给 s 引用,导致 s 指向了堆中
创建的这个“aaa”字符串对象。
2)  如果没有,则首先在 String Pool中创建一个“aaa“对象,然后再在堆中(heap)创
建一个”aaa“对象,然后将堆中的这个”aaa“对象的地址返回来,赋给 s 引用,
导致 s 指向了堆中所创建的这个”aaa“对象。

总之String是常量,其对象一旦创建完毕就无法改变。无论你对它进行任何的改变操作,都会生成新
的 String对象,而不是向原有的 String对象追加内容。

评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马