不可变String如何理解? String a="gaojie";a="liangming";问:gaojie和liangming是同一内存地址吗?不可变String如何理解? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不是的 string是一旦定义好了以后就不可以改变 a="liangming"是新开了一块内存空间将a存的地址改变成新开的地址 a先指向gaojie 比如gaojie的内存地址为00000001,但当a=liangming时,a指向liangming而liangmin的地址不是00000001 而gaojie的地址仍是00000001 1,不是同一内存地址.2, String类 是 final 的. 当你对 String的对象进行拼接等操作的时候 都是生成的新的String对象.如: String a = "gaojie" ; 然后 你改变 a="liangming" ; 这个时候 的 a 就是一个新的String 对象了.原来等与"gaojie"的哪个 a 会被 jvm 回收.所以String 不可变. a= lianmiing 这个时候已经重新生成一个地址,里面放着lianming。不过,如果a =beijing ? 会怎样 楼主把“不可变”理解错了。String不可变是指它(这个对象本身)一旦创建,就不会被改变。String s = "abc";s.toUpperCase();现在s仍然是小写的"abc",唯一的办法是s = s.toUpperCase();这是s才改变了,但是改变的原因是s这个对象引用指向了一个新的从方法中返回的大写"ABC"; 噢,谢谢楼上各位热心帮助,,可否理解为String s是个引用 各位可能解释的不够全面阿,String类比较特殊,初始化的时候如果用new String(“xxxxx”)的形式是生成一个新的空间的。但是如果用s = "xxxx"的形式初始化,这个时候,"xxxx"被放在常量区域,再去用"xxxx"去初始化另一个String 对象的时候。两个对象的地址相同。例如:String s1 = new String("aaa");String s2 = new String("aaa");此时s1与s2指向不同地址,如果改成下面这样String s1 = "aaa";String s2 = "aaa";此时则s1与s2指向同一个地址 呵呵,可以做一下试试String s1 = "d";String s2 = "d";boolean b = (s1==s2)String s3 = new String("d");String s4 = new String("d");boolean b2 = (s3==s4)你看看返回什么?java中的"=="就是比较内存地址的,看看有什么区别吧 "==": 比较地址”equal“: 比较值10楼提出的不错! 不是同一内存地址"==": 比较地址”equal“: 比较值 http://blog.csdn.net/kofsky/archive/2007/11/13/1882626.aspx String是复杂数据类型,不是简单数据类型。String a="gaojie"; 等同于String a=new String("gaojie");java里简单类型是存放在栈里,对象是放在堆里!栈里只是保存着这个对象的引用 两者是不相等的,String a="gaojie";将a引用的字符串对象"gaojie"放在内存的常量区,而String a=new String("gaojie"); 则将对象放在堆中。String s = "a";String s1 = "a";这时候s与s1引用同一个常量区的"a"对象的地址,所以s==s1返回trueString s = new String("a");String s1 = new String("a");这时候会产生2个"a"对象,放在堆中,s与s1分别引用不同地址,固此时s==s1返回false String a="gaojie"; //栈中有个常量a,指向string池里“gaojie"字符串,a="liangming"; //栈中的a,指向另一个字符串"liangming" String s 就是一个引用呀 有兴趣可以去看看String的源代码 gaojie和liangming不是同一内存地址。引用发生了变化 String是不可变的,并不是这种意思。我打个比方。String tmp="abcdef"然后 tmp.subString(1,2);虽然用subString()的方法截取了一部分,但是tmp的值并没有因此而改变。所以说是不变的。但是对于StringBuffer来说,他的delete方法删除一个字符就会少一个字符,也就是原字符串会改变。就这个意思 2, String类 是 final 的. 当你对 String的对象进行拼接等操作的时候 都是生成的新的String对象. String 类是final只表示它不可继承的一些特性,而没有说明"String的对象进行拼接等操作的时候 都是生成的新的String对象."String的对象进行拼接等操作的时候 都是生成的新的String对象:String str = "aa";str = str+"uu";原来的"aa"对像并不会因为str+"uu"而变成"aauu"而是产生一个新的对像"aauu",然后把对像的首地址返回.假设"aa"对像的首地址为01+"uu"之后并不会在"aa"空间后边加上"uu"然后返回01地址.而是生成一个"aauu"对像,然后再把这个对像的首地址返回. 比较同意20楼的说法。好像是java内部运行原理的问题。 空字符串 请教关于类的实例化和类型转换 问T,,,,,,, 在线等 j2ee API 中文版 发到我的邮箱[email protected] 受到后马上结贴!!!!! Maven build error 函数求救 为什么Applet上显示的汉字都变成一个一个方块了? 请教关于System.out.println("HelloWorld");的问题??谢谢 急急急请各位大哥帮忙解决一下这个画线的问题 在java中如何生成可单独安装运行的应用程序呀?就像.exe一样! 一个关于Corba的问题 求最简单的散列方法,字串转int applet 操作本地文件出错
2, String类 是 final 的. 当你对 String的对象进行拼接等操作的时候 都是生成的新的String对象.
如: String a = "gaojie" ; 然后 你改变 a="liangming" ; 这个时候 的 a 就是一个新的String 对象了.
原来等与"gaojie"的哪个 a 会被 jvm 回收.
所以String 不可变.
String s = "abc";
s.toUpperCase();
现在s仍然是小写的"abc",唯一的办法是
s = s.toUpperCase();
这是s才改变了,但是改变的原因是s这个对象引用指向了一个新的从方法中返回的大写"ABC";
但是如果用s = "xxxx"的形式初始化,这个时候,"xxxx"被放在常量区域,再去用"xxxx"去初始化另一个String 对象的时候。两个对象的地址相同。
例如:
String s1 = new String("aaa");
String s2 = new String("aaa");
此时s1与s2指向不同地址,如果改成下面这样String s1 = "aaa";
String s2 = "aaa";
此时则s1与s2指向同一个地址
String s1 = "d";
String s2 = "d";
boolean b = (s1==s2)
String s3 = new String("d");
String s4 = new String("d");
boolean b2 = (s3==s4)
你看看返回什么?java中的"=="就是比较内存地址的,看看有什么区别吧
”equal“: 比较值10楼提出的不错!
”equal“: 比较值
String a="gaojie"; 等同于String a=new String("gaojie");
java里简单类型是存放在栈里,对象是放在堆里!栈里只是保存着这个对象的引用
String s1 = "a";
这时候s与s1引用同一个常量区的"a"对象的地址,所以s==s1返回true
String s = new String("a");
String s1 = new String("a");
这时候会产生2个"a"对象,放在堆中,s与s1分别引用不同地址,固此时s==s1返回false
a="liangming"; //栈中的a,指向另一个字符串"liangming"
然后 tmp.subString(1,2);
虽然用subString()的方法截取了一部分,但是tmp的值并没有因此而改变。所以说是不变的。
但是对于StringBuffer来说,他的delete方法删除一个字符就会少一个字符,也就是原字符串会改变。就这个意思
String str = "aa";
str = str+"uu";
原来的"aa"对像并不会因为str+"uu"而变成"aauu"
而是产生一个新的对像"aauu",然后把对像的首地址返回.
假设"aa"对像的首地址为01
+"uu"之后并不会在"aa"空间后边加上"uu"然后返回01地址.
而是生成一个"aauu"对像,然后再把这个对像的首地址返回.
好像是java内部运行原理的问题。