在面试中以及我们平时的开发中我们都必须要和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。
}
}