比较
在我们程序中,最常用也最常见的就是String类型,也就是常说的字符串类型,但是常见这样赋值,比如:
String str1 = "12345";
String str2 = new String("6789");
这两种方式,所声明的变量是有区别的,区别如下:
String str1 = "12345";
这个申明字符串,会创建一个对象或者不会创建一个对象,这里会出现一个字符串实例池的概念,然后这里也分为两种情况:
1 就是声明的那个字符串已经存在实例池中,这个实例池中存放着很多字符串,如果实例池中已经包含了字符串:12345,所以这种情况的话,语句String str1 = "12345";不会创建对象,而是直接引用池中的字符串:12345
2 如果字符串"12345"在实例池中并不存在,那么刚开始会初始化一个字符串:12345,即创建一个字符串对象:
12345,并且把创建好的字符串放到字符串实例池中
总的来说,String str1 = "12345";的实现过程:
首先在栈区创建一个str1的引用,然后在字符串实例池(不同于堆和栈,它是独立的,存储的是不可变化的变量)去查找是否存在字符串的内容是:
12345的对象,如果在字符串实例池中不存在这个对象,则创建一个,然后str1指向实例池中的这个对象,如果存在,则直接将str1指向实例池中的这个对象;如果后面又一个定义字符串变量str3=
"12345",则这个str3直接指向实例池中已经存在的
12345,这个时候不再重新创建对象了;如果比较str1 == str3操作,则返回true,因为它们所指向的地址是一样的
String str2 = new String("6789");
对于new String("6789")则不管怎么样,都会创建新的对象,而且创建两个对象,首先在栈中创建一个str2的引用对象,然后在堆中创建一个包含字符串
"6789"的对象,str2保存的值是这个包含
"6789"的对象的内存地址,即str2指向这个
"6789"这个对象;如果后面又有一个对象String str4 =
new String("6789");那么这个对象会和上个对象一样,创建两个对象,而不是直接指向str2找个对象指向的对象。
==与equals的区别
==是比较基本数据类型,比如int,long,double等数据是否相等,比较的就是栈中的这个变量的值是否相等,而equals比较的是这个变量中的值所指向的值是否相等,是拿来比较对象之间的值是否相等;
简单来说,==比较的是变量在栈内存中存放的内存地址,而equals比较的是变量在栈内存中存放的内存地址所指向的那个对象的值
实例
当时还有疑问,对于String字符创的创建,后来查找资料,大体上解决了心中的疑问,今天通过实例来说明。
public static void main(String[] args) {
String str1 = "abcd";
String str2 = "abcd";
System.out.println(str1 == str2); //true
String str4 = "abc"+"d";
System.out.println(str1 == str4); //true
System.out.println(str2 == str4); //true
String str3 = "abc";
str1 = str3 +"d";
System.out.println(str1 == str2); //false
System.out.println((str1+"a")==(str2+"a")); //false
System.out.println((str1+"a").equals((str2+"a"))); //true
String str5 = str1+str2;
String str6 = "abcdabcd";
System.out.println(str5 == str6); //false
System.out.println(str5.equals(str6)); //true
String str7 = str1.concat(str2);
System.out.println(str7 == str6); //false
System.out.println(str7.equals(str6)); //true
}
对于str4 = "abc"+"d"; 是先合并字符串,然后去字符串实例池查找
str1 = str3 + "d"; 这种拼接是通过创建StringBuffer(或者StringBuilder),之后把
StringBuffer(或者StringBuilder)转化为String类型,实际上这边new了一个对象,并且是在堆上进行的
(str1+"a")==(str2+"a") 实际上和str1 = str3 + "d";同样的形式