String和String Pool解析

       本文先说明下String和String Pool的概念,然后再结合几个常见的例子来说明下String和String Pool的一些特性,最后再总结下这几个例子所得出的规律。

1、不可变的String

      String的底层实际上是使用private final char[] value来实现字符串的存储的,就是说String对象一旦创建之后,就不能再修改这个对象存储的字符串内容。正因为如此,也说String类是不可改变的。

2、什么是String Pool

      在JVM中存放着一个字符串池,其中保存着很多String对象,这些对象可以被共享使用。当以字符串直接创建String对象时,会首先在字符串池中查找是否存在该常量。如果不存在,则在String Pool中创建一个,然后将其地址返回。如果在String Pool中查询到已经存在该常量,则不创建对象,直接返回这个对象地址。

3、String的创建

      有了以上两个概念,就可以说说String的创建了。String主要有两种创建方式,如下:

      String str1 = new String(“abc”);

      String str2 = “abc”;

      虽然两个语句都是返回一个String对象的引用,但是JVM对这两种创建的方式是不一样的。对于第一种,JVM会在内部维护的String Pool中存放一个”abc”的对象,并且在heap中创建一个String对象,然后将该heap中的对象的引用返回给用户。第二种,JVM首先会在String Pool中查找是否存在”abc”对象,如果已经有则不创建,没有的话则在String Pool中创建一个对象。

      有了以上概念,列一个经常考的面试题:

       String s1 = new String(“abc”);

       String s2 = new String(“abc”);

      上面创建了几个String对象?(3个)

      从一个博文里面列出下面6个题,检查下这部分的题目是否已经彻底掌握。

public class Test1 {
	
	public static void main(String[] args) {
		String s1 = "abc";
		String s2 = new String("abc");
		System.out.println(s1 == s2);
	}

}

public class Test2 {

	public static void main(String[] args) {
		String s1 = new String("abc");
		String s2 = new String("abc");
		System.out.println(s1 == s2);
	}

}

public class Test3 {
	
	public static void main(String[] args) {
		String s1 = "abc";
		String s2 = "ab" + "c";
		System.out.println(s1 == s2);
	}

}

public class Test4 {
	
	public static void main(String[] args) {
		String s = "a";
		String s1 = "abc";
		String s2 = s + "bc";
		System.out.println(s1 == s2);
	}

}

public class Test5 {
	
	public static void main(String[] args) {
		String s1 = "ab";
		String s2 = "ab" + getString();
		System.out.println(s1 == s2);
	}
	
	private static String getString(){
		return "c";
	}

}

public class Test6 {
	
	public static void main(String[] args) {
		String s = "a";
		String s1 = "abc";
		String s2 = s + "bc";
		System.out.println(s1 == s2.intern());
	}

}

      答案:

      1、false 2、false 3、true 4、false 5、false 6、true

      从上面6道题的结果分析,得出如下结论:

      1、单独使用””引号创建的字符串都是常量,编译期就已经确定存储到String Pool中。

      2、使用new String(“”)创建的对象会存储到heap中,是运行期新创建的。

      3、使用只包含常量的字符串连接符如”aa”+”bb”创建的也是常量,编译期就能确定已经存储到String Pool中。

      4、使用包含变量的字符串连接如”aa”+s创建的对象是运行期才创建的,存储到heap中。

      5、运行期调用String的intern()方法可以向String Pool中动态添加对象。


参考:http://www.cnblogs.com/kkgreen/archive/2011/08/24/2151450.html

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值