再说String Pool

本文深入探讨Java中的StringPool概念,解释其在编译期和运行期的角色,介绍如何通过intern()方法动态扩展StringPool,并分析String对象创建过程中的内存分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

共享与缓存的概念在程序设计语言中经常被使用。与之相关的设计模式有享元模式。

在一般的程序设计中,通用会使用集合框架List或Map等进行缓存操作。

本文简要说明String Pool。

 

 

1.什么是常量池,它位于哪里?

常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。

存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。譬如String Pool。

 

在编译好的class文件中,有个区域称为Constant Pool,它是一个由数组组成的表,类型 

为cp_info constant_pool[],用来存储程序中使用的各种常量,包括Class/String/Integer等各 

种基本Java数据类型。

 

String Pool是对应于在Constant Pool中存储String常量的区域.习惯称为String Pool,也有人称为 

String Constant Pool。

 

 

 

2.String的intern()方法

运行期调用String类的intern()方法可以向String Pool中动态添加String对象。

当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的

引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用。

 

 

 

3.面对Java String面试题,注意三点。

●.编译时和运行时

●.String Pool概念和

●.intern方法

 

4.以下代码产生几个对象?这些在之前的文章中有大量描述。幕后原因在此不赘述。

以下代码是连续的。

String str1 = new String("Hello");//2个,String pool中一个,堆中一个(若怀疑查看java api说明)

String str2 = new String("Hello");//1个,因为前一条语句已经在String Pool中添加了"Hello"

String Str3 = "Hello";//一个对象也没创建,只是指向了String Pool中的"Hello"对象。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值