不一样

因为内存的分配方式不一样。String str="i"的方式,Java 虚拟机会将其分配到常量池中;而 String str=new String(“i”)方式,则会被分到堆内存中。

    String str1 = "i";
	String str2 = "i";
	String str3 = new String("i");
	System.out.println(str1 == str2);//ture
	System.out.println(str2 == str3);//false

解释:

  • Java 虚拟机会将其分配到常量池中:常量池不会重复创建对象。

在String str1="i"中,把i值存在常量池,地址赋给str1。假设再写一个String str2=“i”,则会把i的地址赋给str2,但是i对象不会重新创建,他们引用的是同一个地址值,共享同一个i内存。

  • 分到堆内存中:堆内存会创建新的对象。

假设再写一个String str3=new String(“i”),则会创建一个新的i对象,然后将新对象的地址值赋给str3。虽然str3和str1的值相同但是地址值不同。

拓展:

堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。

常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐