java中有八大基本类型分别是 byte shot int long float double boolean char
还有还有众多引用类型,而String是其中运用的最多的类型之一,此篇文章就是围绕着String的来探讨!
String类的创建有两种方式
String i = "123";
String i = new String("123");
那么这两种方式创建的String类有何区别呢?
区别就在于其值保持的内存地址,第一种是在将值保存在常量池,其二是在堆中new 出一个内存,所以如果用==比较二者,其将永为false,当然用new 创建两个String也将永为false。
package dataClass;
public class StringAndString {
public static void main(String[] args) {
String i = "123";
String s = "123";
System.out.println(s==i);
}
}
true
此代码结果为true又是为何呢?
因为第一种方式创建String类的时候会检查常量池中是否有值相等的字符串,如果没有就开辟一个空间,如果有则将次地址赋给引用
package dataClass;
public class StringAndString {
static String getAB(){
return "AB";
}
public static void main(String[] args) {
String s1 = "ABCD";
String s2 = "A"+"B"+"C"+"D";
String s3 = "AB"+"CD";
String s4 = new String("ABCD");
String temp = "AB";
String s5 = getAB()+"CD";
String s6 = temp +"CD";
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(s1==s4);
System.out.println(s1==s5);
System.out.println(s1==s6);
}
}
看到此代码是否猜的出结果呢?根据我上面说的理论可以肯定的是前面3个肯定为能得出
true
true
false
false
false
结果是否出乎意料呢?后面两个为什么味false呢?我们通过反编译可以得出结论
package dataClass;
import java.io.PrintStream;
public class StringAndString
{
public StringAndString()
{
}
static String getAB()
{
return "AB";
}
public static void main(String args[])
{
String s1 = "ABCD";
String s2 = "ABCD";
String s3 = "ABCD";
String s4 = new String("ABCD");
String temp = "AB";
String s5 = (new StringBuilder(String.valueOf(getAB()))).append("CD").toString();
String s6 = (new StringBuilder(String.valueOf(temp))).append("CD").toString();
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1 == s4);
System.out.println(s1 == s5);
System.out.println(s1 == s6);
}
}
这是通过XJAD反编译的结果!我们可以得出结论
String类的比较有4中情况
1:单独使用“”创建的字符串都是直接确定在常量池中存储
2:使用new 创建的字符串就确定在堆中开辟空间
3:使用+来连接的多个字符串同1
4:包含String直接量的字符表达式会在堆中开辟空间