关于常量池,和地址

关于常量池,和地址

String s1='imooc'

s1="hello "+s1;

那么常量池中是不是有两个值,‘imooc’和‘hello imooc’,那么现在s1的地址没有改变,而他的常量池中的值变成了‘hello imooc’,imooc这个值是否还在变量池内,是的话后面需要清理常量池吗?还是就这样留在常量池内

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

常量池中没有两个字符串,因为"hello mooc"是你用"hello "和s1拼接起来的,其中s1是变量所以不会放在常量池里。另外str自己的地址没有改变,但是str指向的地址发生了改变,本来是指向"imooc"的,现在指向了"hello imooc"了。后面'imooc"会被清理。

请采纳!

  • 南大街萨博四 提问者 #1
    那么str的自己地址是什么意思,能否老师详细一点最好能画个草图,那么这个str自己的地址指的是堆里的地址还是栈里的地址,我会采纳的 谢谢!
    2020-04-04 21:47:53
苍星乱舞 2020-04-04 22:17:18

基本数据类型当你定义变量时,就相当于给一个盒子起了一个名字(int age;)然后当你给变量赋值时相当于把一个东西装在了箱子里(age = 10;),那么你知道盒子的名字以后就可以使用了,比如打开盒子看看里面的东西,或者换一个其他东西装进去。

引用数据类型也一样,当你定义一个变量时也相当于给一个盒子起了一个名字(String name;)然后当你给变量赋值时有了困难,就目前你知道的两种引用类型来看一个数组,一个字符串。你会发现这两个和基本数据类型不同,他们的大小不确定,数组可大可小,字符串可长可短。

那我的盒子应该买多大的呢?买小了装不下,买大了浪费。只要是固定的大小都有问题,而基本数据类型是固定大小的盒子,这也是为什么各种基本数据类型有最大值最小值的原因因为盒子大小是固定的。所以在你盒子里装的并不是东西本身,而是一张藏宝图。于是当你赋值给引用型变量时总是要先 new String("你好");这就是去找一个足够装的下宝藏的地方,放进去东西然后把位置装进盒子(引用变量)里。

所以当你通过方法传参时,相当于别人有了和你盒子里一样的东西,大家都有一份(因为计算机里都是信息嘛,不会你有了我就没有,大家信息都一样了)。因此无论是传基础还是引用别人修改他盒子里的信息你都不会有影响。

唯一有影响的是如果别人是通过藏宝图去把宝藏给修改了,那你就会有影响,因为是指向同一份宝藏的位置。而你第三个问题里只是别人换了一张藏宝图,一开始是装“1’宝藏现在是指向装“2”的宝藏,于你自己而言是依然是装“1”的宝藏。

如能理解,请采纳!


  • 张三和Theshy都是在常量池里,常量池是堆里的一部分。
    2020-04-04 22:15:24
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师