天天看点

String a;String a=null;String a=““的区别一、问题描述二、String a;三、String a=null四、String a=“”五、知识拓展

一、问题描述

很多人在定义一个String类型的变量时会用到以下的方式

String a;String a=null;String a=""

那么这三种有什么区别呢;

二、String a;

String a 只是在栈中声明了一个a的内存地址,并没有给它赋初值,也就是在没有在堆内存中申请内存地址,更没有在堆内存指向引用地址;

String a;String a=null;String a=““的区别一、问题描述二、String a;三、String a=null四、String a=“”五、知识拓展

三、String a=null

在栈中声明了一个a的内存地址,在堆中也申请了一个内存地址,但是堆中的地址不指向任何栈里的引用地址

String a;String a=null;String a=““的区别一、问题描述二、String a;三、String a=null四、String a=“”五、知识拓展

四、String a=“”

栈里申明一个string类型的 a内存地址,堆内存里申请了地址,堆内存中的地址指向引用该字符串的栈内存中的a引用地址

String a;String a=null;String a=““的区别一、问题描述二、String a;三、String a=null四、String a=“”五、知识拓展

五、知识拓展

String str = "str";和String str = new String(“str”);的区别

用String str = 'str'时,会先到内存中找有没有'str'这个对象,如果没有就new String('str');如果有那么就用str指向该对象就可以了。

用String str = new String('str')时会直接在内存中new一个'str'对象,不管内存中有没有。如果内存中已经有'str'这个对象了,那么就存在两个。

下面看一段代码就可以明白上面文字表达的意思了

String a;String a=null;String a=““的区别一、问题描述二、String a;三、String a=null四、String a=“”五、知识拓展

从上面的代码中我们可以看到,str和str1因为都是用String 变量名="str"初始化值得,所以当初始化str1的时候会先去内存对中查找是否存在str的对象,存在则将该str1指向查找到的str对象。而str2则是直接重新内存中新建了一个对象。

当str与”s”+”tr”作比较,”s”+”tr”先拼接成”str”,然后再去字符串常量池中找是否有”str”,有,所以和s3共用一个字符串对象,则为true

当str与str3+”tr”作比较,先在字符串常量池中开一个空间,然后拼接,这个空间的地址就是str3与“tr”拼接后的地址。与str的地址不同,所以输出为false。

字符串如果是变量相加,先开空间,在拼接。

字符串如果是常量相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建。

造成这样的原因是因为涉及到jvm常量池的缘故,关于jvm常量池的知识可以查看以下博客

https://www.jianshu.com/p/6bee67a7f6ce

继续阅读