可能很多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支持一维、二维甚至多维数组。在第三个部分,创建了不同维度的数组并展示了如何初始化和操作数组元素。 选择结构,如if...else和switch语句,是控制程序流程的关键。在实验...
《三分钟学前端JS篇》是一份前端学习资料,旨在帮助读者通过每日三分钟的学习,逐步掌握前端开发中的JavaScript(JS)知识,从基础到进阶再到资深水平。文档中包含了丰富的前端知识点,涵盖了JS基础概念、函数、闭包...
Java 泛型详解 Java 泛型是 Java SE 1.5 中引入的一项新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。...理解泛型的使用和原理,可以帮助开发者编写更加安全、可重用的代码。
7. 绘制红绿三角副图:使用HHVALL和LLVALL函数获取当前股票的最高和最低价,并将其存储在H1和L1变量中。然后,使用CROSSDOT函数绘制红绿三角副图。 8. 绘制高点和低点:使用FILTER函数获取当前股票的高点和低点,并...
在小学二年级的数学教学中,课前三分钟的展示环节是激发学生兴趣、巩固基础知识和提升学习能力的重要组成部分。这个阶段的学生正处在数学概念启蒙的关键时期,因此,设计有效的课前展示活动至关重要。下面,我们将...
本项目为HYLI_SMART_STEP_COUNTER智能手环的嵌入式代码与手机客户端开发源码,采用Java、C和C语言编写,总计114个...该教程包含智能手环的原理图和安卓手机客户端开发,旨在三分钟内帮助读者理解智能硬件的基本原理。
### 三分钟搞定Base64:全面解析与实践 #### 一、Base64简介 ...掌握Base64不仅可以帮助您更好地理解网络安全和数据传输的基本原理,还能让您在实际工作中更加得心应手。希望本文能够为您带来启发和帮助。
"五年级数学课前三分钟PPT课件.pptx" 从这个PPT课件中,我们可以提取出以下几个重要的知识点: 1. 掌握数学技巧的重要性:掌握数学技巧是同学们学好数学、培养数学兴趣、提高数学成绩的有效途径。通过掌握数学技巧...
Java中的枚举(enum)是JDK 1.5引入的一种强大的类型,它允许开发者定义一组固定的、预定义的值,这些值可以被用作类的成员或者在代码中直接使用。枚举类型提升了代码的可读性,同时也提高了安全性,因为枚举值只能...
【课前三分钟演讲稿】是学生们在课堂开始前进行简短演讲的一种形式,旨在锻炼表达能力、思维敏捷性和公众演讲技巧。以下是从提供的演讲素材中提取的一些知识点: 1. **坚持不懈与毅力**:素材一中提到的故事展示了...
【Kotlin编程三分钟入门】 Kotlin是一种现代的、面向对象的编程语言,设计时考虑了开发者体验,尤其强调简洁性和可读性。它由JetBrains公司开发,初衷是为了提高开发效率,尤其针对Android开发。Kotlin在Java虚拟机...
* 介绍了英语阅读的重要性,例如:提高英语阅读速度和理解能力 该资源旨在帮助学生提高英语口语能力、演讲能力和阅读能力,通过一个有趣的英语故事-"老板最大",讲解了英语单词、句子结构和英语演讲技巧。
* Java:机试的题目是课程表管理系统,考察的是 Java 基础,包括字符串操作和 IO 操作。 * 游戏编程:作者提到,游戏编程是很重要的,包括三子棋、黑白子和 dots and boxes 等游戏。 * 数据结构:机试的题目包括纯...
1. 个人学习:了解ChatGPT的基本原理和功能,探索其在自然语言处理和智能对话方面的应用。 2. 研究和开发:利用ChatGPT进行自然语言处理研究、构建对话系统、开发智能助手等项目。 3. 教学和培训:用于教育领域的...
通过以上步骤,我们可以理解智能硬件的基本原理,包括硬件组件的选择、连接和控制,以及软件层面的蓝牙通信和数码管显示。这样的实践项目有助于加深对软硬件结合的理解,为未来更多复杂的智能硬件设计打下基础。
在Java中,我们可以使用`java.util.Random`类生成随机数,再结合字符集构建验证码字符串。为了提高安全性,验证码长度通常设置为4-6位。 3. **验证码存储与匹配**:验证码需要存储在服务器端,以便用户提交时进行...
本资源提供了三分钟的销售岗位面试自我介绍样本,涵盖了自我介绍的基本结构、销售岗位面试的主要内容和自我介绍的要点。通过本资源,读者可以了解销售岗位面试的基本要求和自我介绍的技巧,并掌握销售岗位面试的主要...
这篇PPT课件主要讲述了二年级数学中的一个经典故事,涉及了加法的简便计算方法,特别是等差数列求和的问题。故事主角是著名的数学家高斯,他在解决从1加到100的问题时,运用了一种巧妙的策略。 在传统的计算方式中...