java中字符串的问题。

最近在学java,学到字符串这里,有些疑问请高手释疑,不胜感谢!java中字符串最关键的概念就是其不可变性(immutable),即字符串的内容不能在原位处更改,当我们对... 最近在学java,学到字符串这里,有些疑问请高手释疑,不胜感谢!

java中字符串最关键的概念就是其不可变性(immutable),即字符串的内容不能在原位处更改,当我们对字符串进行操作时,实际上是在创建新的字符串,用来保存原字符串修改后的’‘版本‘’,但本质仍是建立新的字符串,原字符串不变。下面是一个字符串逆序(reverseString)的程序:
public void run(){
println("This program reverse a string.");

String str =readline("Enter a string: ");

String rev=reverseString(str);

println(str+"spelled backwards is"+rev);
}
private String reverseString(string str){
String result="";
for(int i=0;i<str.length();i++){

result=str.charAt(i)+result; //将后一个字符连接在前一个字符前面

}

return result;

}
这里, String result="";定义了字符串result,按照上面所说不是不能进行修改吗?为什么后面用for循环,
result=str.charAt(i)+result;这样做?这里的“+”是加号还是连接符?就算是修改,这里也是对字符串result本身进行了直接修改,不符合字符串最关键的概念不可变性,求高手大神帮助一下吧!O(∩_∩)O
展开
 我来答
sui159753
2014-12-12 · TA获得超过226个赞
知道小有建树答主
回答量:207
采纳率:100%
帮助的人:131万
展开全部
----------------------------------------------------------
其实java虚拟机对这种String result=result+"xxx";这种情况,java虚拟机其实是用的StringBuilder来最终实现的。字符串表面上是可以进行叠加,其实最终是虚拟机自己用StringBuilder来实现的。
-------------------------------------------------------------
String类型每进行一次操作就会new一个新对象。String a ="name"是这样子的:new一个对象,内容是“name”,放在地址A1处,让变量a指向这个A1地址。a = "age":new一个新对象,内容是“age”,放在一个新地址A2,让变量a指向A2。结果打印出来的自然是“age”了。这个时候地址A1处的内容还是“name”,没有变(String为不可变字符串是指这个意思)。另外,这个时候地址A1处的对象(“name”)由于没有变量指向它(变量a已经指向A2),永远无法访问了所以变成了垃圾,等待系统回收。

参考

一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。

如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。 在 StringBuilder 上的主要操作是 append 和 insert 方法。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。 例如,如果 z 引用一个当前内容为“start”的字符串生成器对象,则该方法调用 z.append("le") 将使字符串生成器包含“startle”,而 z.insert(4, "le") 将更改字符串生成器,使之包含“starlet”。 通常,如果 n引用 StringBuilder 的实例(StringBuilder n = new StringBuilder();),则 n.append(x) 和 n.insert(n.length(), x) 具有相同的效果。 每个字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。 将StringBuilder的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用StringBuffer。[1] StringBuilder类可以用于在无需创建一个新的字符串对象情况下修改字符串。StringBuilder不是线程安全的,而StringBuffer是线程安全的,但其在单线程中的性能比StringBuffer高。
夜玄冬
2014-12-12 · 超过71用户采纳过TA的回答
知道小有建树答主
回答量:230
采纳率:100%
帮助的人:138万
展开全部
+号就是重新创建了一个新的字符串再赋值给变量名result,所以string拼接效率很低.一般可以用StringBuffer.append拼接.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
龙鱼anc
2014-12-12 · 超过21用户采纳过TA的回答
知道答主
回答量:174
采纳率:0%
帮助的人:75.4万
展开全部
无论是微巢还是其他v信第三方服务商,都是一个平台
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zx198799
推荐于2016-09-23 · TA获得超过1224个赞
知道小有建树答主
回答量:509
采纳率:100%
帮助的人:274万
展开全部
java的String是不能被修改的。

至于result=str.charAt(i)+result; 看上去好像result被修改了,实际上不是。

Java是怎么做的呢?
首先,在内存中创建了一个新的String,并且把这个String初始化为str.charAt(i)+result。
然后,把这个新的String的引用赋给了result,而result原来引用的那个String被当做垃圾回收了。
所以,最后你看到的效果好像是result被修改了,其实底层有更复杂一些的实现细节。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2014-12-12
展开全部
当我们对字符串进行操作时,实际上是在创建新的字符串,用来保存原字符串修改后的’‘版本‘’,但本质仍是建立新的字符串,原字符串不变。

------
result=str.charAt(i)+result;

+连接符

每次进行上面操作都会新建一个result,名字相同但是已经不是原来的result了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式