先看一段带代码和代码的结果
public static void main(String[] args) {
String str1=new String("dgg");
String str2=new String("dgg");
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
String str3="ddg";
String str4="ddg";
System.out.println(str3==str4);
System.out.println(str3.equals(str4));
}
解释这段代码
String str1=new String("dgg");
String str2=new String("dgg");
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
1.在JDK1.7
之后就把字符串常量池放入了堆内存中(以前一直在方法区内),你在创建一个String对象时首先会在堆内存中创建一个字符串常量,并且他的有地址A,然后会堆中又会创建有一个value1
专门类来存地址A,同时他又会有自己的地址B,而在栈内存中的引用变量(String类的对象名
)会存地址B,同时有自己的地址D。当你在创建一个对象,也是相同的字符串时,地址A是不会变的,但又会有一个新的value2
来存地址A,同时他有自己的地址E,在栈中会有地址来指向地址E,同时有自己的地址F。所以说str1
和str2
是不相等的。
下面这段
String str3="ddg";
String str4="ddg";
System.out.println(str3==str4);
System.out.println(str3.equals(str4));
String str3="ddg";
像这种其实把字符串ddg
的地址A,直接赋给了str3
和str4
所以str3
与str4
是相等的。
区分空字符串和空指针
String str5="";
String str6=null;
空字符串在堆内存中也是有地址的。但null就表示没有地址,可以输出null
,但如果想要用str6
来调用方法就会报空指针异常。
concat
方法
该方法用于字符串的拼接。但每次拼接都会创建不同的对象(底层是创建一个数组)。
str1=str1.concat("大锅盖");
System.out.println(str1);