欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java字符串池和内存分配

程序员文章站 2022-07-12 15:42:35
...
	/**
	 * public String intern()
	 * 返回字符串对象的规范化表示形式。
	 * 一个初始为空的字符串池,它由类String私有地维护。
	 * 当调用intern方法时,如果池已经包含一个等于此String对象的字符串(用equals(Object)方法确定),则返回池中的字符串。
	 * 否则,将此String对象添加到池中,并返回此String对象的引用。
	 * 它遵循以下规则:对于任意两个字符串s 和t,当且仅当s.equals(t)为true时,s.intern() == t.intern()才为true。
	 */
	public static void main(String[] args) {
		String a = new String("abc");
		String b = new String("abc");
		String c = "abc";
		System.out.println(a == c);//false
		System.out.println(b == c);//false
		a = a.intern();
		b.intern();
		System.out.println(a == c);//true
		System.out.println(b == c);//false
	}

       Java运行环境有一个字符串池,由String类维护。执行语句String str="abc"时,首先查看字符串池中是否存在字符串"abc",如果存在则直接将"abc"赋给str,如果不存在则先在字符串池中新建一个字符串"abc",然后再将其赋给str。

      执行语句String str=new String("abc")时,不管字符串池中是否存在字符串"abc",直接新建一个字符串"abc"(注意:新建的字符串"abc"不是在字符串池中),然后将其付给str。前一语句的效率高,后一语句的效率低,因为新建字符串占用内存空间。

      同时,String对象是不可变的。查看JDK文档你就会发现,String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容。而最初的String对象则丝毫未动。