String与new String()的区别

来源:互联网 发布:北京php培训班 编辑:程序博客网 时间:2024/06/06 03:31

比较

在我们程序中,最常用也最常见的就是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";同样的形式


0 0
原创粉丝点击