日常总结 -- 字符串池

最近被人问到关于java字符串的问题,做了一点小的归纳
先上经典代码:

  1.String a = "Hello";

  2.String b = "Hello";

  3.String c = new String("Hello");

  4.String d = new String("Hello");

  System.out.println(a == b);

  System.out.println(b == c);

  System.out.println(c == d);

  System.out.println(a.equals(b));

  System.out.println(b.equals(c));

  System.out.println(c.equals(d));

  这几行输出语句分别输出的是true,false,false,true,true,true.

  这里就有涉及到字符串池的问题了,java为了提高内存利用率而采取了字符串池这个手段。在遇到第一句话时,会自动在字符串池中寻找是否存在"Hello"对象,

没有则创建;当第二句话执行时,再一次在字符串池中寻找这个对象,发现已经存在了,那么直接将变量b指向这个地址。那么第三和第四的语句又是怎么回事呢?

因为其使用了new这个关键字,则不会去访问字符串池,而是先为变量 c 开辟空间,然后将值写入空间。对于java中两个String类型的比较,"=="比较的是地址,

而equals比较的是值。那么不难得出,a和b指向的是同一个对象,地址相同,a==b返回true;b和c还有c和d指向的对象都不相同,那么他们使用"=="比较自然

返回false。因为equals比较的是值,这里都是"Hello"所有后面三个返回的是true。

  总结(摘抄自网络):Java虚拟机有一个字符串池,保存着几乎所有的字符串对象。字符串表达式总是指向字符串池 中的一个对象。使用new操作创建的字符串

对象不指向字符串池中的对象但是可以使用intern方法使其指向字符串池中的对象(注:如果池中已经有相同的 字符串--使用equals方法确定,则直接返回池中的

字符串,否则先将字符串添加到池中,再返回)。池中两个相等的字符串如果使用“==”来比较将返回 真。

String a = "Hello";

String b = "Hello";

String c = new String("Hello");

String d = new String("Hello");

System.out.println(a == b);

System.out.println(b == c);

System.out.println(c == d);

System.out.println(a.equals(b));

System.out.println(b.equals(c));

System.out.println(c.equals(d));

原文地址:https://www.cnblogs.com/zmc-change/p/5393306.html