网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
可签
7
级以上的吧
50
个
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
02月12日
漏签
0
天
java吧
关注:
1,243,403
贴子:
12,718,697
看贴
图片
吧主推荐
视频
游戏
8
回复贴,共
1
页
<返回java吧
>0< 加载中...
有个问题
取消只看楼主
收藏
回复
以天下奇
水
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
java实例化对象的时候,对于String来说,如果我给了有参数的构造函数,那么他是先开辟对象的堆内存,给String上一个null,给String分配一个不被指向的堆内存,然后把这个不被指向的堆内存mov到null的位置。还是直接开辟对象的堆内存的时候不开辟一个不被栈内存指向的堆内存空间,而是直接把构造函数的参数mov到对象的String的堆内存中?
送TA礼物
1楼
2016-01-21 18:01
回复
以天下奇
水
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我是新手,说错勿喷
2楼
2016-01-21 18:02
回复
收起回复
米聆科技
java
小程序出售价格2025年容器价格容器报价点击获取报价信息
2025-02-12 14:57
广告
立即查看
以天下奇
水
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
给String分配一个不被指向的堆内存,这个说的是构造函数的参数的Sting
3楼
2016-01-21 18:03
回复
收起回复
以天下奇
水
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
有人吗
4楼
2016-01-21 18:13
回复
收起回复
以天下奇
水
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
求大神解惑
5楼
2016-01-21 18:13
回复
收起回复
以天下奇
水
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
然后有一个问题就是,new的对象都是存放在堆中的,然后我"123"==new String("123");却会给我返回一个0,new String("123")的123是存放在堆中的,但是如果new String("123")的123和之前那个没有new的123是在一个内存空间中的话,那么应该会返回一个1给我,所以没有new的字符串是不是没有存放在堆中呢。因为我new的时候,String的构造方法里面传的字符串123可能和前那个没有new的123是共享的,也就是说是一个空间中的123,然后因为我之前那个比较的代码是匿名的String对象,所以他直接开辟了一个空间把那个没有new的123复制了一份到开辟的空间,然后new String开辟的空间在堆中。我推测的应该没错吧。
@卑贱不过人心
11楼
2016-01-22 02:04
回复(9)
收起回复
以天下奇
水
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
然后如果new出来的String是存放在堆内存中的,如果是直接“赋值的话”应该是开辟字符串常量池中的内存,所以导致了new出来的字符串!=直接“”开辟的字符串就算表名上给的值一样,但是因为=是比较基本类型的,如果是引用类型的话=会比较他们的指向的内存是否一致。不知道我说的对不
12楼
2016-01-22 02:18
回复(1)
收起回复
以天下奇
水
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
第一种情况:有人说字符串本身还是在堆中,但是字符池也会有一个一样的值,如果是这样的话,那么new String("值")首先""在字符池开辟一个空间,然后把这个值再拷贝一份到new开辟出来在堆中的空间里。那么他会开辟2个空间。但是如果直接""赋值也会在字符池中开辟空间并且对内存中也有这个值得话,那么也是2个空间,而且字符池不像堆内存一旦不被引用的时候就会释放空间。那么如果按照我上面所说的话,new String过程中所占用的内存和""赋值过程中占用的内存都是2个空间。**************上面是我一个推测,第二种情况:还有一个就是当new String("值")开辟的时候,首先 "值" 会在堆内存中开辟一个空间,然后把之前""双引号开辟的"值"拷贝到new开辟的空间中,然后释放"值"开辟的空间,再拷贝一份到字符池中去,这样过程中会花费3个空间,释放一个;直接"值"赋值的话,会在堆内存开辟一个空间,然后把空间拷贝到字符池中去,然后""开辟的堆内存空间不被释放,整个过程会花费2个内存空间。上面的猜测是建立在String不管是""还是new开辟空间的时候都会在堆内存和字符池中有相同的值,但是如果堆内存和字符池中有相同的值得话那么String对象名不管是""还是new都会指向堆内存中的那个值,而new开辟的空间=赋值给String对象,那么用=号去比较用""双引号赋值的那个String对象应该会返回一个0,说明""赋值之后堆内存中并没有该值或一定不指向堆内存,因为如果有的话,返回的一定是1,并且第二个String必须要指向在堆内存中的那个new出来的相同内容的堆内存。可能有人会说,new出来的值再堆内存的时候,如果""赋值的时候虽然内容相同,但是他其实指向的堆内存不是new出来的堆内存,如果不指向一个堆内存的话说明java共享的时候,不是在堆内存中查找的,而是在字符池中查找相同的String值,但是这样的话,我把""写在new的前面,也就是顺序换一下,先""赋值一个String对象,然后new一个对象,那么他如果是在字符池中查找相同的值得话,那么new String("123")的时候,他首先会在字符池中查找有没有相同的值,如果有的话,java可以直接把字符池中相同的值直接拷贝到new开辟的对内存,这样的话如果在new之前有""赋值的话,那么后面new构造方法中传递同一个之前""被赋值过的值得话,他只会开辟两个空间,而不会再堆内存中多开辟一个空间?,************************根据上面我想问,不管是”“还是new创建String对象,"a"在字符池中开辟空间放入一个值a,然后还会在堆内存中开辟一个空间存入一个值a。new实例化对象如果在字符池中也有一个值a,并且在堆内存中有一个不指向"a"的堆内存的堆内存,所以new String("a")=="a"返回一个0因为他们指向的不是一个堆内存,但是因为java的共享模式会把要开辟存入的相同的值的两个对象指向一个开辟的堆空间中,那么java是不是根据字符池中的内存来查找相同的值,然后引用传递(是在""也会在堆内存中有一个值得情况下我猜测的上面的假说,如果""不会在堆内存中也有一个空间的话,那么当我没说上面)。如果""在堆内存中也有一个空间的话,那么如果在""之后new的值为什么不指向""开辟的时候在堆内存中的空间,因为共享的话堆内存也应该共享啊。**********如果java的共享机制是在堆内存中查找一样的值得话,那么""应该不是在堆内存中有值,而只是String对象名指向字符池中的值,否则如果"'在的对象名在堆内存中也有值得话,那么如果共享机制是在堆内存中查找相同的值,那么new String("123")==”123“应该会返回一个10
15楼
2016-01-22 03:05
回复(3)
收起回复
以天下奇
水
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
那如果都有堆内存的话,""和new出来的都要指向堆内存,那为什么""出来的不指向new的堆内存呢,""只有指向另外一个堆内存的时候,才会出现"123"==new String("123")返回一个0的情况,就说明就算"123"和new String("123")的参数是一样的,并且他们都指向堆内存,但是因为一个使用了new,导致他们指向的堆内存不是一个内存空间,所以"123"==new String("123")返回一个0,但是为什么java不把他们指向同一个空间呢,反正java里面a=”123“;b=”123“指向的都是一个内存,那为什么不把"123"和new String("123")也指向一个堆内存呢,反正他们都是为了传参,都是一样的作用。
16楼
2016-01-22 03:19
回复
收起回复
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧热议榜
1
哪吒2海外上座率暴打美国队长4
1978680
2
乌克兰被特朗普抛弃气数已尽
1931719
3
DeepSeek创始人身家可能超越老黄
1724548
4
山寨版哪吒2诈骗电影辣瞎眼
1400301
5
贝林厄姆绝杀皇马拿下曼城
1017978
6
哪吒2在岛国票房安静得可怕
886950
7
导演饺子靠哪吒2预估收入过10亿
780552
8
首届电竞奥运会2027年举办
407352
9
Tian凭啥代表LPL上沙特杯封面
330267
10
怎么看待WTT改革措施
252820
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示