我是靠谱客的博主 粗暴翅膀,最近开发中收集的这篇文章主要介绍java 字符串赋值给字符串_三分钟理解Java中字符串(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引用是相同的。

第二个断言是由于编译器做了优化,编译器会先把字符串拼接,再在常量池中查找这个字符串是否存在,如果存在,则让变量直接引用该字符串。所以str1和str3引用也是相同的。

str4的对象不是显式赋值的,编译器会在堆中重新分配一个区域来存储它的对象数据。所以str1和str4的引用是不一样的。

4c6117a948b138d10ed313fabecbd088.png

最后

以上就是粗暴翅膀为你收集整理的java 字符串赋值给字符串_三分钟理解Java中字符串(String)的存储和赋值原理的全部内容,希望文章能够帮你解决java 字符串赋值给字符串_三分钟理解Java中字符串(String)的存储和赋值原理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部