Java中String="hello"和new String("hello')两种创建字符串的区别

原帖地址:https://blog.csdn.net/zqzq310918/article/details/54313262

Java中String="hello"和new String("hello')两种创建字符串的区别

String str="hello";

String str1="hello";

String str2=new String("hello");

String str3=new String("hello");

 1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

    如果作用于引用类型的变量,则比较的是所指向的对象的地址

  2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量

    如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

    诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

 

此时在创建str的时候会去检查常量池里面是否有"hello"这个字符串,如果有的话则不创建,直接地址指向,所以此时str==str1为true,str.equals(str1)为true;

用String str="";这种方式创建的字符串都是在常量池中存在。

用new String("")来创建的字符串都是在堆中开辟空间。

 

注:常量池:常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
3. 堆:存放所有new出来的对象。
4. 静态域:存放静态成员(static定义的)
5. 常量池:存放字符串常量和基本类型常量(public static final)。
6. 非RAM存储:硬盘等永久存储空间