String与new String()的区别

比较

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


  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值