前言
字符串是程序使用频率最高的数据类型,为了提供程序运行效率,java设计两种不同的方式来生成字符串对象,一种是调用String的构造方法,另一种直接使用双引号“”。两种方式生成出来的字符串对象,在内存中的存储机制是完全不同的。
一、双引号对象
当使用双引号创建对象时,首先去字符串缓存池(应该在JVM内存的方法区开辟空间,参见“关于JVM内存..”章节)寻找有没有内容相同的字符串,如果有直接关联变量引用地址就OK了,没有再在缓存池创建出来,示例代码如下:
public static void main(String[] args) {@b@ String a="abcd";@b@ String b="abcd";@b@ System.out.println("对象是否相等:"+(a==b));@b@ System.out.println("对象内容是否相等:"+a.equals(b));@b@ }
结果是
对象是否相等:true@b@对象内容是否相等:true
二、类String构造函数
在使用String类构造函数创建对象时,和创建其他类型对象一样,都是在堆内存创建两个不同的对象,它们的存储地址肯定是不一样的,示例代码如下:
public static void main(String[] args) {@b@ String a=new String("abcd");@b@ String b=new String("abcd");@b@ System.out.println("对象是否相等:"+(a==b));@b@ System.out.println("对象内容是否相等:"+a.equals(b));@b@}
结果是
对象是否相等:false@b@对象内容是否相等:true