`
mmdev
  • 浏览: 12916354 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

java String 深度解析

 
阅读更多

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


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics