三分钟理解Java中字符串(String)的存储和赋值原理

来源:互联网 发布:夺命call软件 编辑:程序博客网 时间:2024/05/16 07:59


可能很多java的初学者对String的存储和赋值有迷惑,以下是一个很简单的测试用例,你只需要花几分钟时间便可理解。

1.在看例子之前,确保你理解以下几个术语:

栈 :由JVM分配区域,用于保存线程执行的动作和数据引用。栈是一个运行的单位,Java中一个线程就会相应有一个线程栈与之对应。

堆 :由JVM分配的,用于存储对象等数据的区域。

常量池 :在编译的阶段,在堆中分配出来的一块存储区域,用于存储显式 的String,float或者integer.例如String str="abc"; abc这个字符串是显式声明,所以存储在常量池。

2.看这个例子,用JDK5+junit4.5写的例子,完全通过测试

import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;

import org.junit.Test;

/**
 * @author Heis
 *
 */
public class StringTest{

    @Test
    public void testTheSameReference1(){
        String str1="abc";
        String str2="abc";
        String str3="ab"+"c";
        String str4=new String(str2);
       
        //str1和str2引用自常量池里的同一个string对象
        assertSame(str1,str2);
        //str3通过编译优化,与str1引用自同一个对象
        assertSame(str1,str3);
        //str4因为是在堆中重新分配的另一个对象,所以它的引用与str1不同
        assertNotSame(str1,str4);
    }
   
}

原创粉丝点击