Java中的字符串的问题?

为什么输出图中的结果,String不是不可变的吗,那为什么当我对象调用String类型的变量修该值的时候为什么是可以的,不是会返回一个新的字符串对象吗... 为什么输出图中的结果,String不是不可变的吗,那为什么当我对象调用String类型的变量修该值的时候为什么是可以的,不是会返回一个新的字符串对象吗 展开
 我来答
绝杀狂龙
2020-10-11 · TA获得超过1913个赞
知道小有建树答主
回答量:1310
采纳率:78%
帮助的人:584万
展开全部

注意f1方法里的参数

都是拷贝一份传递。

但第一个参数是对象的引用。可以理解成一个共享网盘的路径,拷贝多少份都不影响找到这个网盘,然后网盘里就两个文件num和str,其他人修改num和str文件里的内容保存后,你去查看也能看到修改后的内容

后面的就是值的拷贝,修改不影响你手里的原件


至于最后的String类型的参数,你拷贝过去如果不修改,和原件是一样的。

看似你修改成了bcd

实则流程大概是。我要创建一个String类型的对象,值是bcd。然后看常量池里有没有bcd,没有那就new一个新的对象。但是只在f1方法里有效

下图就可以看出来,传递过去的时候hashcode是一致的,重新赋值后就改变了

更多追问追答
追问
你说的这个我明白,只是想问一下string字符串不是是不可变的吗一旦修改了字符串的值不是会返回一个新的字符串对象吗,但是我通过对象调用成员变量str,并且修改了str的值按说不是会返回一个新的字符串吗,我是这里不明白的
追答
字符串是常量,不可修改。但是这个常量的引用是可以改变的
假设传递前,abc在常量池里的地址是0x11;
参数里传递时拷贝的一份也是指向0x11
然后你重新赋值bcd,此时不是将strIn的值修改了,而是strIn指向了新的一个地址(假设是0x22),但因为这只是一个拷贝,不影响main方法中的strIn的值。
你可以在f1方法里验证下。
String s = "abc";
这个s的hashCode是和main方法里的hashCode是一样的。因为常量池里有,不需要创建对象,直接引用。
yanghaoyu409
2020-10-08 · TA获得超过1947个赞
知道小有建树答主
回答量:1242
采纳率:62%
帮助的人:400万
展开全部
这这段代码没法体现出String不可变,还是相当于新的String字符替换了以前的字符。其实想想引用类型就能明白,String不是基础数据类型。所以==判断的是对象是否一样。先声明一个String str=new String("a");然后复制一份 String str1=str; 这个时候判断 str==str1;为true说明指向同一个对象,如果通过 str1="ab"; 重新赋值 再执行 str==str1;就为false了,说明 "ab" 的对象是新的String对象。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
姜书波

2020-10-10 · TA获得超过2046个赞
知道答主
回答量:1.9万
采纳率:15%
帮助的人:386万
展开全部
如果调用都不能解决,只能充电
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
mimiba212
2020-10-11 · TA获得超过413个赞
知道小有建树答主
回答量:1504
采纳率:64%
帮助的人:80.9万
展开全部

String不可变很简单,如下图,给一个已有字符串"abcd"第二次赋值成"abcedl",不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。

另外string是用final修饰的,表示不可以被继承。String类的主力成员字段value是个char[ ]数组,而且是用final修饰的。final修饰的字段创建以后就不可改变。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
宇宙机艺术猿
2020-10-11 · TA获得超过795个赞
知道小有建树答主
回答量:1003
采纳率:33%
帮助的人:197万
展开全部
新值与原值存在不同的栈中,string指向不同的内存地址,所以当你改变string变量时,实际上是创建了一个新的变量。而真正可以改变的字符串类型是stringbuffer(还有个stringbbuilder),区别在哪呢?区别就是stringbuffer指向同一个内存地址,是替换了原变量,而没有创建新的变量
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式