为了账号安全,请及时绑定邮箱和手机立即绑定

Java中String str_1="abc"; 和 String str_2?

Java中String str_1="abc"; 和 String str_2?

蛊毒传说 2021-01-19 14:11:20
一直都未搞得清这两种定义的区别..希望能有详细说明,深入解析..
查看完整描述

2 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

你给出的两个字符串对象体现不这两种定义的区别,当然也是有区别的。

如果是:String str_1="abc"; String str_2=new String("abc");就明显了。

---------------------------------------------
先说几个概念吧

1.常量池

指的是在编译期确定,并被保存在已编译的字节码文件中的一些数据,它包括类、方法、接口等中的常量,也包括字符串常量。

2.==: 比较是否是同一个对象

3.equals(): 比较的是对象里的内容

---------------------------------------------
下面我开始说区别

第1种:

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

结果:true

原因:编译时,这两个"abc"被认为是同一个对象保存到了常量池中;运行时JVM则认为这两个变量赋的是同一个对象,所以返回true。

---------------------
第2种:

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

结果:false

原因:用构造器创建的对象,是不会被放入常理池中的,也很明显这完全是两个对象,只是内容相同罢了,结果当然为false了。用equals()或者System.out.print(a.intern()==b.intern());就返回true了。

------------------------------
第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。

---------------------------------------------------------------------
其它太明显的区别不在赘述。



查看完整回答
反对 回复 2021-03-19
?
波斯汪

TA贡献1811条经验 获得超4个赞

没什么区别,用起来是一样的~只是声明方式不同就想数组可以这样声明:
var a=[];
也可以这样声明:
var a=array();
对象也是:可以直接var a={};也可以var a=Object;
使用起来都是一样的,但是在内错分配上不同,前者更节省内存(但是如果少量的声明,你根本不会感觉出来内存有省很多~所以这点可以忽略~)

查看完整回答
反对 回复 2021-03-19
  • 2 回答
  • 0 关注
  • 236 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信