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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘晓康 中级黑马   /  2012-4-5 20:18  /  1902 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

JDK文档中说,String变量的内容是不可改的,那么为什么我们可以写出以下的语句?

String str="ab";
str+="cd"; //这里难道不是修改了str变量的内容吗?
System.out.println(str);//输出:abcd

评分

参与人数 1黑马币 +1 收起 理由
蒙武辉 + 1

查看全部评分

6 个回复

倒序浏览
str += "cd"; 不是改变了String变量的内容 而是 把两个字符串加在一起。。  字符串是可以相加的 比如:System.out.println("ab" + "cd");输出的结果就是 "abcd"。

回复 使用道具 举报
String 长度不可变
StringBuffer长度可变
String相加 原来的不变
可变不可变的意思是说
你新建一个String型的   你第一次使用呢  他就给你分配那么长的内存堆栈  不可变长度的
你要给他重新赋值了呢   他是重新开辟了一块内存空间指针指向他
原来的内存空间  会被gc() 垃圾回收掉  这样消耗系统内存
回复 使用道具 举报
String str="ab";             //str变量引用指向ab
str+="cd"; //这里难道不是修改了str变量的内容吗?   //  str变量引用指向abcd ,ab的值并没有改变,只是str的引用指向了另外的字符串。              
System.out.println(str);//输出:abcd   
回复 使用道具 举报
String内容不可以更改,一个String对象内容的改变实际上是通过内存地址的“断开-连接”完成的,而本身没有任何变化!
String str="ab";//假定此时存放“ab”地址为A
str+="cd";//此时存放的地址发生改变,内容变为“abcd”,地址为B
对象是str,没有改变!改变的是str指向的内容!
这里讲到数据在内存的保存形式:
1、栈内存空间:保存对象的名称;
2、堆内存空间:保存对象的属性;
回复 使用道具 举报
在JDK文档中有:Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。
字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。
回复 使用道具 举报
str+="cd";并不是在ab字符串后加上cd,而是让str名称引用自新的abcd字符串对象。
在java中,使用+串联字符串会产生一个新的字符串
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马