在创建字符串,我们可以用到new String("*****")或者直接=“******”两种形式,两种形式有着很大的区别。
1.单独使用""引号创建的字符串都是常量,编译期就已经确定存储到String Pool中;
2.使用new String("")创建的对象会存储到heap中,是运行期新创建的;
3.使用只包含常量的字符串连接符如"aa" + "aa"创建的也是常量,编译期就能确定,已经确定存储到String Pool中;
4.使用包含变量的字符串连接符如"aa" + s1创建的对象是运行期才创建的,存储在heap中;
5:只用""引号创建的字符串创建一个或者零个对象,比如String a="123",如果String pool不存在"123",则创建一个String对象"123"放到String pool中,如果存在,则a的引用直接指向它。
6:用new关键字至少创建一个对象,比如 String a=new String("123")首先会创建一个对象存储在heap中,如果String pool中不纯在"123"则创建一个String对象"123"放到String pool中,如果存在,则不创建。
7:String.intern()方法返回字符串对象的规范化表示形式,当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。它遵循对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
<span style="font-size:18px;"> String a="123"; String b="123"; String c=new String("123"); String tem="12"; String d=tem+"3"; System.out.println(a==b);//true System.out.println(a==c);//false System.out.println(a==d);//false System.out.println(a==d.intern());//true System.out.println(c==d);//false</span>