第一种:直接赋值

   String str =  "hello!" ;

在java中,有一个字符串常量池,对于这种直接赋值的,会直接写进常量池(常量池里面不存在其value,)

自JDK1.7后,常量池也属于堆内存;

所谓的直接赋值,描述的是将一个匿名对象设置一个具体的引用名字

第二种:构造方法

   String str = new String("hello!");

这样会开辟两块堆内存,第一块是由“hello!”这个匿名对象开辟,第二块是new开辟

首先会检查常量池里面是否存在“hello!”,如果不存在,则在常量池开辟一空间,然后new出来的String实例,也会在堆内存开辟空间

一般是使用new开辟的那一块空间,而字符串常量池那块内存,将会成为垃圾空间

 1 package Class_String;
 2
 3 public class Dome {
 4     public static void main(String[] args) {
 5         String str1 = "123" ;
 6         String str2 = new String("123") ;
 7         String str3 = new String("123") ;
 8
 9         System.out.println(str1 == str2) ;        //false
10
11         System.out.println(str1 == str2.intern());  //true
12
13         System.out.println(str2 == str3);         //false
14     }
15 }

面试题:解释String类两种对象实例化方式的区别

     直接赋值:只产生一个实例化对象,并且自动保存到常量池中,可以实现字符串实例的重用

     构造方法:产生两个实例化对象,并且不会入池,无法实现重用,可以通过手工intern()方法入池,

一般情况下使用直接赋值,因为效率更高,

最后,因为我也是刚开始学java,或许会有不足之处,

欢迎有疑惑的 or 有不同意见的,可以在下面进行评论,喵~~

12-20 18:55