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

一直都未搞得清这两种定义的区别..希望能有详细说明,深入解析..

蛊毒传说
浏览 237回答 2
2回答

狐的传说

你给出的两个字符串对象体现不这两种定义的区别,当然也是有区别的。如果是: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。---------------------------------------------------------------------其它太明显的区别不在赘述。

波斯汪

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