Java中的字符串的问题?
为什么输出图中的结果,String不是不可变的吗,那为什么当我对象调用String类型的变量修该值的时候为什么是可以的,不是会返回一个新的字符串对象吗...
为什么输出图中的结果,String不是不可变的吗,那为什么当我对象调用String类型的变量修该值的时候为什么是可以的,不是会返回一个新的字符串对象吗
展开
5个回答
展开全部
更多追问追答
追问
你说的这个我明白,只是想问一下string字符串不是是不可变的吗一旦修改了字符串的值不是会返回一个新的字符串对象吗,但是我通过对象调用成员变量str,并且修改了str的值按说不是会返回一个新的字符串吗,我是这里不明白的
追答
字符串是常量,不可修改。但是这个常量的引用是可以改变的
假设传递前,abc在常量池里的地址是0x11;
参数里传递时拷贝的一份也是指向0x11
然后你重新赋值bcd,此时不是将strIn的值修改了,而是strIn指向了新的一个地址(假设是0x22),但因为这只是一个拷贝,不影响main方法中的strIn的值。
你可以在f1方法里验证下。
String s = "abc";
这个s的hashCode是和main方法里的hashCode是一样的。因为常量池里有,不需要创建对象,直接引用。
展开全部
这这段代码没法体现出String不可变,还是相当于新的String字符替换了以前的字符。其实想想引用类型就能明白,String不是基础数据类型。所以==判断的是对象是否一样。先声明一个String str=new String("a");然后复制一份 String str1=str; 这个时候判断 str==str1;为true说明指向同一个对象,如果通过 str1="ab"; 重新赋值 再执行 str==str1;就为false了,说明 "ab" 的对象是新的String对象。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果调用都不能解决,只能充电
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
新值与原值存在不同的栈中,string指向不同的内存地址,所以当你改变string变量时,实际上是创建了一个新的变量。而真正可以改变的字符串类型是stringbuffer(还有个stringbbuilder),区别在哪呢?区别就是stringbuffer指向同一个内存地址,是替换了原变量,而没有创建新的变量
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询