首页 > 应用开发 > Java > java实例化字符串两种方式区别(含视频)
一:实例化字符串对象的两种方式的区别
这个知识点是面试中的一个经久不衰的问题,。也是一个比较麻烦的问题,对于许多同学来说也是难点,本次课我们会详细的分析。上次课说了创建字符串对象的两种方式:直接赋值(字面量创建对象)和使用构造方法创建。
这两种方式创建的字符串的在内存的分配.上是存在不同的,所以导致我们使用“==”进行字符串比较的时候存在差异。

在分析之前你要知道一-点, 如果比较两个对象使用“==”则比较的对象的内存地址。
以上输出的结果是true,也就是说s1和s2的指向是同一块内存空间。为什么两个“abcd”会在同一块内存空间呢?
在使用直接赋值的方式创建字符串的时候字符串对象是保存在-块叫做String常量池的空间中。在实例化字符串之前会先到String 常量池中查看要创建的字符串是否已经存在。
●Str ing s1=" abcd";//第- -行,会到常量池检测是否存在,目前不存在,则在String常量池中创建该对象并且返回引用赋值给s1。
●String s2="abcd"; //第二行,会到常量池中检测“abcd”是否存在,第一行创建了,所以存在,于是不再创建该字符串了,直接返回已经存在的“abcd"的引用给s2。
所以最后s1和s2都指向常量池中的“abcd”字符串对象。所以s1==s2输出的结果就是true。

输出的结果是false,说明了s1和s2指向的不是同一个对象的内存地址,这是因为使用new关键字实例化字符串对象的特征决定的。 在学习java的过程当中有遇见任何问题,可以加入我的Java交流学习群697888503,多多交流问题,互帮互助,群里有不错的学习教程和开发工具。学习java有任何问题(学习方法,学习效率,如何就业),可以随时来咨询我
当使用new关键字实例化对象的时候:
●String s1=new String("abcd");//第一行, 先到常量池中查找是否有“abcd”,此时没有,则在常量池中创建-一个“abcd" 对象,之后再到堆内存中创建“abcd" 对象,返回的引用是堆内存中的“abcd”对象的内存地址,这个过程中一共创建了两个对象
●String s2=new String("abcd");//第二行,先到常量池中查找是否有“abcd”,此时有了,则不再到常量池中创建,只是在堆内存中创建-一个“abcd”对象。这个过程创建了一个对象。
所以最后的结果s1和s2指向的堆内存中的两个独立的字符串对象。所以s1==s2的值.false。以上的两个demo阐述了使用两种方式实例化的字符串的区别。思考问题: String 常量池在哪儿呢?
1、字面量创建对象:先到String常量池中查找是否存在,如果存在则直接返回引用,如果不存在则创建之后返回引用。
2、使用构造方法实例化对象:先到常量池中查找是否存在,如果存在则在堆内存中创建一个返回引用即可,如果不存在则在常量池中创建一个对象,之后再到堆内存创建一个内容相同的对象再返回引用。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69985551/viewspace-2742610/ ,如需转载,请注明出处,否则将追究法律责任。