JAVA中 =和new 时的内存原理(原创)

沉下心来读。

说个很简单的问题:


String a = "123";

String b = new String("123");

在我们理解,这两个都是都是创建了个String类型的123的值。

那么他们的原理有什么不同呢?下面就来探讨下:


前者String a ="123";内存中做了这几件事:

第一件事:.创建了个叫a的对象(咱们认为)(其实更精确来说:Stirng类型的对象的引用变量叫做a)(为什么这么说接下来会提到)

第二件事:在栈字符串内存池中寻找有没有已经存在的值为“123”的内存地址;

如果没有:在栈内存中开辟一个存放值为123的栈内存地址,然后堆内存中创建了个String类型的对象b,这个对象字符串的值指向123的栈内存地址,而且b和123的栈内存地址有了一对一的关系,接着返回对象b的堆内存地址,从而引用变量a实际上是指向b的堆内存地址!(多读几遍!!!

如果有:比如:String a = "123";(现在程序走的是如果没有)

    String b = "123";

    此时发现字符串池中存在"123",那么内存不会再创建一个内存地址存放“123”,而是得到它已经存在的内存地址,所以此时b的引用还是指向

   a当时所创建的对象的内存地址。

   延伸:所以此时(a==b)--》true,因为它俩的内存地址相同。


而后者String b = new String("123");内存中做了:

它上去不管三七二十一直接,再堆内存中创建了一个新的对象,因为new,并且同时生成对应的堆内存地址。然后我们所说的对象(引用变量)指向这个内存地址。

延伸:那么此时a==b -->false了,因为它俩的内存地址肯定不同。至于.eqaul()在下编文章中再提。

综上所述,总结几点:

1.“new”关键必然会开辟一个新的内存空间,生成新的内存地址。

2.“=”会先查找存在否,再做处理。(原理参照上面)

3.new的不如= ,new一次创建一个新的对象,占用过多内存空间。

以上就是我此时所想到的,如果有不对的地方请指正。

    

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值