可能很多java的初学者对String的存储和赋值有迷惑,以下是一个很简单的测试用例,你只需要花几分钟时间便可理解。
1.在看例子之前,确保你理解以下几个术语:
栈 :由JVM分配区域,用于保存线程执行的动作和数据引用。栈是一个运行的单位,Java中一个线程就会相应有一个线程栈与之对应。
堆 :由JVM分配的,用于存储对象等数据的区域。
常量池 :在堆中分配出来的一块存储区域,用于存储显式 的String,float或者integer.例如String str="abc"; abc这个字符串是显式声明,所以存储在常量池。
2.看这个例子,用JDK5+junit4.5写的例子,完全通过测试
- importstaticorg.junit.Assert.assertNotSame;
-
importstaticorg.junit.Assert.assertSame;
-
importorg.junit.Test;
-
-
publicclassStringTest{
-
@Test
-
publicvoidtestTheSameReference1(){
-
Stringstr1="abc";
-
Stringstr2="abc";
-
Stringstr3="ab"+"c";
-
Stringstr4=newString(str2);
-
-
- assertSame(str1,str2);
-
- assertSame(str1,str3);
-
- assertNotSame(str1,str4);
- }
-
- }
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引用是相同的。
- 第二个断言是由于编译器做了优化,编译器会先把字符串拼接,再在常量池中查找这个字符串是否存在,如果存在,则让变量直接引用该字符串。所以str1和str3引用也是相同的。
- str4的对象不是显式赋值的,编译器会在堆中重新分配一个区域来存储它的对象数据。所以str1和str4的引用是不一样的。
分享到:
相关推荐
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念。三分钟使用java快速搭建运行环境的步骤
针对JAVA初学者专门录制了一个3分钟的教学视频,快速搭建java运行环境,让初学者快速实现效果。欢迎收藏下载~
实验目的】 了解Java的数据类型 掌握各种变量的声明方式 理解运算符的优先级 掌握java基本数据类型。运算符与表达式、数组的使用方法 理解Java程序语法结构,掌握顺序结构、选择结构和循环结构语法的程序设计方法
主要介绍了浅谈三分钟学习Java泛型中T、E、K、V、?的含义,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
课前三分钟演讲稿_课前三分钟演讲稿课前三分钟演讲素材.doc
1. 个人学习:了解ChatGPT的基本原理和功能,探索其在自然语言处理和智能对话方面的应用。 2. 研究和开发:利用ChatGPT进行自然语言处理研究、构建对话系统、开发智能助手等项目。 3. 教学和培训:用于教育领域的...
enum的全称为enumeration, 是 JDK 1.5中引入的新特性,存放在 java....下面这篇文章是我在使用enum过程中的一些经验和总结,分享出来方便大家快速的掌握Java中枚举(enum),有需要的朋友们下面跟着小编来一起看看吧。
19三分钟掌握数据中心“容灾和备份的区别”.docx19三分钟掌握数据中心“容灾和备份的区别”.docx19三分钟掌握数据中心“容灾和备份的区别”.docx19三分钟掌握数据中心“容灾和备份的区别”.docx19三分钟掌握数据中心...
三分钟解决Matlab中文乱码问题。 一篇文章带你快速了解!
五年级数学课前三分钟PPT课件.pptx
小学英语三分钟演讲PPT教案.pptx
数学课前三分钟PPT课件.pptx
小学二年级数学课前三分钟展示PPT教案.pptx
三分钟让你读懂阻燃线缆的原理及重要性.docx
P 产生式,分左部和右部,左部为非终结符号中的一个,右部为终结符号或非终结符号组成的字符串,如S->ab|c 2、 根据文法各个部分的性质,设计一个合理的数据结构用来表示文法, 1) 若使用C语言编写,则文法可以设计...
三分钟热度成为了当今在飞速的经济和急促的生活节奏下大部分人的缺点。我想就三分钟热度是什么?为什么会有三分钟热度?我们要怎么去面对三分钟热度?这三点进行讨论。
数学精彩三分钟PPT课件.pptx
三分钟学前端JS篇.pdf
简短课前三分钟演讲稿5篇
我与军训演讲稿三分钟5篇高中.doc