首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

String的储存和赋值

2012-11-03 
String的存储和赋值可能很多java的初学者对String的存储和赋值有迷惑,以下是一个很简单的测试用例,你只需

String的存储和赋值

可能很多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);??
??? }??
??????
}?

?

这个程序很好理解,因为在解析的时候,"abc"被存储在常量池中,str1和str2的引用都是指向常量池中的"abc"。所以str1和str2引用是相同的。

3.知道字符串怎么存储和赋值的,就不难理解在下面这些例子到底创建了几个String对象了

例1:

?这里也只有一个,因为这里是字面量的连接,它被优化了,在Java编译的时候就可以确定,然后直接在对象池取,它等同于

String str = "abcd";

例4:

String str = new String("abc");

?这里是两个对象,一个是String类型的引用对象,一个是引用对象所指向的实例对象

?

热点排行