String a="abc"与String b=new String("abc")的区别

先说几个概念

1、常量池
指的是在编译期确定,并被保存在已编译的字节码文件中的一些数据,它包括类、方法、接口等中的常量,存放字符串常量和基本类型常量(public static final)。
2、栈(stack)

主要保存基本数据类型(或者叫内置类型)(char、byte、short、int、long、float、double、boolean)和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆。

3、堆(heap):用于存储对象
3、==  :引用是否指向同一个对象
4、equals():比较里面的数值是否相等时



下面我开始说区别

第1种:

String a="abc";
String b="abc";
System.out.print(a==b);

结果:true

原因:编译时,String a="abc" 会把"abc"放到常量池中,再定义b时,因为常量池中已存在“abc”,所有不会再创建,运行时JVM(JAVA虚拟机)则认为这两个变量赋的是同一个对象,所以返回true。



第2种:

String a=new String("abc");
String b=new String("abc");
System.out.print(a==b);

结果:false

原因:编译过程会把会把字符串“abc”放到在常量池中。用构造器创建的对象,是生成不同的对象。每new一次JVM就会在中创建一个对象。String a,b只是内容相同罢了。用equals()或者System.out.print(a.intern()==b.intern());就返回true了。(intern() 方法返回字符串对象的规范化表示形式)



第3种

String a="abc";
String b=new String("abc");
System.out.print(a==b);

结果:false
原因:同上
 



第4种

String a="abcdef";
System.out.print(a=="abcdef");

结果:true

原因:运行出现的字符串常量,若是在常量池中出现过,则JVM会认为同一个对象,以节省内存开销,所以这两个字符串会被认为是同一个对象。
 



第5种

String a="abcdef";
String b="";
String c=a+b;
System.out.print(c=="abcdef");

结果:false

原因:编译时,先将"abcedf"放在常量池中,而c的值则是在运行时在里创建的。所以为false。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值