站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题String类型的对象是不可改变的.这句话怎么理解?

String类型的对象是不可改变的.这句话怎么理解?

摘要: String类型的对象是不可改变的.这句话怎么理解?


class Teststring{
书中原文说道:"String类型的对象是不可改变的;一旦创建了一个字符串对象,它的内容是不能被改变的."
这句话怎么理解呢?
我下面这个例子在创建字符串变量a后把a的内容改为"aa",也没报错啊!

public static void main(String args[]){
String a="a";
String b=a+"b";
System.out.println("a="+a);
System.out.println("b="+b);
a="aa";
System.out.println("a="+a);
}
}

//结果
a=a
b=ab
a=aa


第一次a=a,变量a被指向了对象1
第二次a=aa 变量a被指向了对象2
你得赋值操作只是改变了变量引用内存区域的位置,而没有改变那块内存中的数据内容。
就是说,对象1中的内容还是“a”,但是没有变量去引用它了而已,不久就会被垃圾回收


原因在于String对象的成员是final char[]类西的。




please refer to the source code

final class String
you can only give an intial value to a string object by new String("initial value");

after that, you can not change its value any more.



in your case,
you are using String object as a reference, it won't change the internal value at all.


因为 String 是 final


楼上够菜的


简单的说 a=a+"b"后的a就已经不是之前的a了
前后两个a是两个不同的对象了,在内存中也是独立的两块空间了
a+"b"并不是在原有的a对象中续了一个'b',而是重新new了一个对象


简单的说,就是你每赋值一次,系统就会新建一个对象,而原来的对象是还保存在堆中的。直到不再需要的时候再被回收。
比如
String a="a";
String a="b";
String a="c";
这时堆内有三个对象,“a","b","c",而变量a指向的是"c".



更正一下
String a="a";
a="b";
a="c";


你得赋值操作只是改变了变量引用内存区域的位置,而没有改变那块内存中的数据内容。



第二次的赋值其实是重新创建了一个对象


简单来说就是
String a = ...;
String b = a;

无论你怎么操作b(在没有操作a的情况下),你都无法改变a的值


这个问题分析内存就知道。
string a="aa";
等号的左边 string a 只是在栈区声明的一个变量(相当于一个指针)
等号右边的负值 把"aa"付给a 就是让栈区的 a 指向堆区的实例 "aa"
java 的字符串都存在一个叫做"字符串池"中
string a="aa"; 这句代码 是让a指向"aa" 如果字符串池中已存在"aa"
那a 将直接指向"aa"如果"aa"不存在 系统将在堆区开内存新创建一个"aa"!
当再让a="bb"时 
那a 将直接指向"bb"如果"bb"不存在 系统将在堆区开内存新创建一个"bb"
而并不是把"aa"改变成"bb"了,"aa"依然是存在的

    string a1="aa";
string a2="aa";

  a2="bb";
    打印出a1和a2; a1的值会不会也是"bb"?<-_->基础知识多看书啊!!







因为string是不可变类


其实是指String对象数据是不可变的
比如 String s = new String("123456");
之后你怎么操作s,在JVM中之前建立的这个“123456”都是不会改变的,除非被GC


String a = new String("valuea"); 相当于创建了两个对象
a在栈中是一个引用
"valuea" 在堆中是一个String类型的数值对象,是不会改变,一旦没有了引用指向他就变成了垃圾,会被java的垃圾回收器自动处理掉

------------------------------------------------------------------------------
xiaTao0520(飞沙) 同学讲的和我以前学的不太一样
不知道 正解是什么
string a="aa"; 这句代码 是让a指向"aa" 如果字符串池中已存在"aa"
那a 将直接指向"aa"如果"aa"不存在 系统将在堆区开内存新创建一个"aa"!
这里"aa"应该 还是在池中创建把

String a = new String("a");
会先先判断池中有没有"a"如果 会把“a” 复制到堆中然后a指向"a"

两者区别:
String b = "a";和前者String a = "a";指向同一个"a"
String b = new String("a"); 是在堆中从新创建了一个"a";




String a中a相当于指针了


不单纯是STRING ,double ,float integer
都是不可变类


哇!人好多!


↑返回目录
前一篇: struts框架下上传文本文件,为什么写了两次?急急急,大家来看指点一下啊!
后一篇: 关于TIJ第四章课后第19题