深入理解java中的String 类型

本文详细解析了Java中String类型的内存存储特性,指出String对象存储于常量池而非栈或堆。解释了静态常量和运行时常量的概念,并通过实例展示了常量池的变化过程。同时,探讨了String的intern()方法的作用及其对内存的影响。

不论java的基本数据类型还是引用数据类型都没有String这一类型。
String类型其实是一个系统定义的一个 final char[]数组。
我们知道,基本数据类型变量(staic除外)在创建初就在栈内分配内存,内存里放的是变量的实际值;
引用数据类型变量如对象在创建时将引用存储在栈中,内存里放的是指向对象的堆地址;
但是String类型变量既不存储在栈中,也不存储在堆中!而是存储在常量池中;
我们来理解一下常量池:
先了解静态常量和运行时常量;
静态常量是static常量(static String str = “abc”;)在java编译器编译时就编译在.class文件中的常量
运行时常量是存在于java方法区中的一块空间:常量池!
而不论静态常量还是运行时常量都要进入常量池,在类加载器加载.class 文件时会将文件内的静态常量加入方法区中的常量池,str1作为“abc”的引用,

此时常量池内只有“abc”;

对于运行时常量来说,我们在类中创建一个String str1 = "def"时,"def"会被添加在方法区的常量池中,str作为常量“def”的引用,

此时常量池内有“abc”,“def”;

当执行 String str2 = “def” + “ghi” 时,“defghi”存储在常量池中,str2作为该常量的引用;
此时常量池内有“abc”, “def”, “defghi”
但是,如果执行的是 String str2 = str1 + “ghi”,等号右边是引用类型和字面量相加,结果为String变量,str2=“defghi”将存储在堆中,作为对象的一部分,此时常量池内有“abc”,“def”;
只有执行了str2.intern() 后,才可以通过Sring类提供的intern()方法将“defghi”添加到常量池中。
如果常量池中已经存在同名字符串,将不会创建新的字符串而是让引用指向他(多个引用指向同一字符串)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值