美文网首页JavaJAVA入门交流
java实例化字符串两种方式区别

java实例化字符串两种方式区别

作者: 程序员阿狸 | 来源:发表于2020-12-16 10:30 被阅读0次

一:实例化字符串对象的两种方式的区别

这个知识点是面试中的一个经久不衰的问题,。也是一个比较麻烦的问题,对于许多同学来说也是难点,本次课我们会详细的分析。上次课说了创建字符串对象的两种方式:直接赋值(字面量创建对象)和使用构造方法创建。

这两种方式创建的字符串的在内存的分配.上是存在不同的,所以导致我们使用“==”进行字符串比较的时候存在差异。

DEMO:字面量创建字符串对象

在分析之前你要知道一-点, 如果比较两个对象使用“==”则比较的对象的内存地址。

以上输出的结果是true,也就是说s1和s2的指向是同一块内存空间。为什么两个“abcd”会在同一块内存空间呢?

在使用直接赋值的方式创建字符串的时候字符串对象是保存在-块叫做String常量池的空间中。在实例化字符串之前会先到String 常量池中查看要创建的字符串是否已经存在。

●Str ing s1=" abcd";//第- -行,会到常量池检测是否存在,目前不存在,则在String常量池中创建该对象并且返回引用赋值给s1。

●String s2="abcd"; //第二行,会到常量池中检测“abcd”是否存在,第一行创建了,所以存在,于是不再创建该字符串了,直接返回已经存在的“abcd"的引用给s2。

所以最后s1和s2都指向常量池中的“abcd”字符串对象。所以s1==s2输出的结果就是true。

DEMO:使用new关键字创建字符串对象

输出的结果是false,说明了s1和s2指向的不是同一个对象的内存地址,这是因为使用new关键字实例化字符串对象的特征决定的。

当使用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、使用构造方法实例化对象:先到常量池中查找是否存在,如果存在则在堆内存中创建一个返回引用即可,如果不存在则在常量池中创建一个对象,之后再到堆内存创建一个内容相同的对象再返回引用。

学习不要走马观花的学,每个知识重点大纲,就是学习路线都是根据每一天市场上多数公司用到的新技术整理,在学习的时候还需要结合练习题来做这里的话我也将我之前在学习过程中用到的一些学习资料整理成了文档,以及我自身之前的一个面试文案和知识点补充,有需要的朋友可以加我的QQ群697888503,这里也希望大家最终都能够学有所成,学习编程不是一天两天的功夫,勤能补拙才是硬道理,祝大家最终都能成为一名合适开发攻城狮。

相关文章

网友评论

    本文标题:java实例化字符串两种方式区别

    本文链接:https://www.haomeiwen.com/subject/ekdngktx.html