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一次创建一个新的对象,占用过多内存空间。

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

 尊重原创,转载或引用请注明出处。

    

你可能感兴趣的:(java基础)