在面试中以及我们平时的开发中我们都必须要和String类打交道,在java中String类中友很多住的注意的地方,现在就简单的介绍一下:

下面的这个代码就是对String的内存分配以及判断两个对象是否相等

package test; public class StringTest { public static void main(String[] args) { // TODO Auto-generated method stub String s = new String("abc"); //执行完上面的代码会产生两个对象,一个是在String pool 中,另外一个是在内存的堆里面。 //s指向的是堆中的字符串, String s1 = "abc"; //s1首先是查找String pool中的字符串。 String s2 = new String("abc"); //用到new都会产生一个新的对象不管它是否已经存在,在堆里面放着。 System.out.println(s == s1); //false s在内存堆里面,s1是在String pool中,所以不相同 System.out.println(s == s2); //false s在内存堆里面,s2也在内存堆里面,但是指向的不是同一个地址,因为s2也用到了new 操作,就会在堆内存中新建立一个对象, System.out.println(s1 == s2); //false s1是在String pool中,s2在内存堆里面,所以不相同 System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAA");//分隔符, //intern方法是返回一个在String pool中存在的数据 System.out.println(s == s.intern()); //s原来是在堆里面,s.intern()是在String pool中,所以为false System.out.println(s1 == s2.intern());//s1是在pool中,s2.intern()返回的值也在pool中,所以为 true System.out.println(s == s2.intern());//s是在堆中,s2.intern()是在pool中,所以为false System.out.println("BBBBBBBBBBBBBBBBBBBBBBBBBBBB"); String hello = "hello"; String hel = "hel"; String lo = "lo"; // System.out.println(hello ==( hel + lo));//前面的在String pool中,后面的在堆里面,所以为false。 System.out.println(hello == "hel" + "lo"); //产生的字符串为hello,会在String pool中查找,所以为true ,java对常量的+操作会在编译时进行优化,例如,System.oout.print("h"+"e"+"l"+"l"+"o"=="hello"); 返回的结果为true;因为在编译时就将"h"+"e"+"l"+"l"+"o"优化为"hello"; System.out.println(hello == hel +"lo");//前面的在String pool中,后面的在堆里面,所以为false。 } }