最近被人问到关于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));