章节
问答
课签
笔记
评论
占位
占位

Java 中字符串的不变性

String 对象创建后则不能被修改,是不可变的,所谓的修改其实是创建了新的对象,所指向的内存空间不同。如下所示:

运行结果:

 

结合上面的代码,关于字符串小伙伴们必须需要了解滴:

1、 通过 String s1="爱慕课"; 声明了一个字符串对象, s1 存放了到字符串对象的引用,在内存中的存放引用关系如下图所示:

然后通过 s1="欢迎来到:"+s1; 改变了字符串 s1 ,其实质是创建了新的字符串对象,变量 s1 指向了新创建的字符串对象,如下图所示:

2、 一旦一个字符串在内存中创建,则这个字符串将不可改变。如果需要一个可以改变的字符串,我们可以使用StringBuffer或者StringBuilder(后面章节中会讲到)。

3、 每次 new 一个字符串就是产生一个新的对象,即便两个字符串的内容相同,使用 ”==” 比较时也为 ”false” ,如果只需比较内容是否相同,应使用 ”equals()” 方法(前面条件运算符章节讲过哦~~)

任务

请在编辑器中的第 7、14 行中将代码填写完整,并注意观察代码和运行结果,加强对字符串应用的理解~~

运行结果:

?不会了怎么办

参考代码:

 

||
1
public class
    HelloWorld
    {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
提交
重置代码
||

请验证,完成请求

由于请求次数过多,请先验证,完成再次请求

加群二维码

打开微信扫码自动绑定

您还未绑定服务号

绑定后可得到

  • · 粉丝专属优惠福利
  • · 大咖直播交流干货
  • · 课程更新,问题答复提醒
  • · 账号支付安全提醒

收藏课程后,能更快找到我哦~

使用 Ctrl+D 可将课程添加到书签

邀请您关注公众号
关注后,及时获悉本课程动态

举报

0/150
提交
取消
全部 精华 我要发布

已采纳回答 / 慕娘5494804
Lovelove仔细看   L一个大写一个小写

最新回答 / c初见
在你使用s3和s4之前,他们的结果就已经有了,不然也不能直接使用

最新回答 / weixin_慕瓜3594852
个人认为,从你指向新对象时,它就已经自动覆盖掉或者修改了

最新回答 / 慕仔8386201
String 中的equals 方法是被重写的 如果不理解  你可以去直接看一下源码 你就会找到了

最新回答 / 自学小强
判断是否是同一个对象

最新回答 / 绿水本无忧
常量是字符串“imooc”并不是s1  s1和s2是指向该内存的引用

最新回答 / weixin_慕瓜709475
== 保存的是内存地址 如 s1=5  s5=5;  他们==的内存地址是相同的s10=100;  s11="5"+s10   s11和s10的内存地址不一样  equal()  代表里面存放的内容比较   

已采纳回答 / 慕前端6229441
隐式定义一个String对象

已采纳回答 / 孤僻成瘾
timeout  估计网卡吧,你是通过网页提交代码到服务器。eclipse是在本地运行的

已采纳回答 / GDHGN
其实呢,在第一次使用字符串引用的使用,也是通过new来创建字符串的,只是隐式的new一个字符串对象,在你第二次使用同一个字符串的时候,会查找堆内存中有没有和该字符串一样的,如果有就直接引用这个堆中已经有的字符串对象,如果没有,还是会new一个;而直接使用new的方法,创建字符串,是不管堆中有没有,直接创建一个新的对象,所以在比较的时候,都是false;

已采纳回答 / kiou1900
String 类型的字符串是不可变的,如果改变了,其实是创建了新的对象,然后变量指向了新对象的内存地址,废除了原来指向的内存地址。用I love+s1连接后,实际上是创建了一个新的对象,也就有了新的内存地址,s3和s4各自创建了一个新对象,所以说他们2个用==比较的结果是false。

最赞回答 / Noragami魏
首先你要明白String类型,属于final类的,其次,你要明白关于 ==,他是比较引用的地址。s1,s2等于直接从常量池中拿出来的常量,引用的地址是一样的;只要是new,就是创建一个新的对象,引用的地址是不一样的

已采纳回答 / ghcg
这个我也查了一下,之前也有疑问,查了之后才知道equals一般情况下确实比较的是地址,但有种情况例外,就是当equals()的括号里面是字符串的时候比较的是内容,应该不会错,希望对你有帮助,加油

已采纳回答 / 慕粉1929319185
需要比较的对象已经定义过了,equals()方法可以直接使用

已采纳回答 / 江dx英
比较地址不是用==吗?怎么会是用equals()呢
全部 我要发布
最热 最新
只看我的

本次提问将花费2个积分

你的积分不足,无法发表

为什么扣积分?

本次提问将花费2个积分

继续发表请点击 "确定"

为什么扣积分?

账号登录 验证码登录

遇到问题
忘记密码

代码语言