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对象则丝毫未动。