String字符常量池和intern()

2024-04-11 18:58
文章标签 string 字符 常量 intern

本文主要是介绍String字符常量池和intern(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

    JVM在运行的时候,会装进存在于.class文件中的常量池。

    常量池在运行中,是可以扩展的,如String.intern()方法:先检查常量池里有没有相同Unicode的常量,没有则添加,然后返回此String的引用。

 

    String私有地维护了一个初始时为空的字符串常量池。

    字符串常量是在编译期就加载到常量池了,直接调用就可以了。而String.intern()和字符串常量的调用原理差不多,所以每次使用常量"Hello"的时候,等价于"Hello".intern(),当然效率会更高一些。

 

String.intern()

nbsp;   String.intern()是用的本地方法native

public native String intern();


下面模拟实现:

 

private static final HashMap<String, String> stringPoolMap = new HashMap<String, String>();public static String intern(String str) {String result = stringPoolMap.get(str);  if (result == null) {stringPoolMap.put(str, str);}return result;}
}

 

    接下来,我们看看常量池和字符串引用的一些交互:

1、首次加入常量池

String s3 = new String(newchar[] {'a', 'b'});
System.out.println(s3 == s3.intern());  // true:s3放入了常量池// ------------------String s3 = new String("ab");
System.out.println(s3 == s3.intern()); // false:”ab”放入了常量池

    上面的两个校验操作返回的结果不一样,第一种情况,s3.intern()的时候,常量池还没有"ab",所以s3的地址被插入到了常量池,所以s3和s3.intern()是指向同一个地方的。

    而第二种情况,"ab"在编译时就插入常量池了,所以s3.intern()指向的是常量池的"ab",而不是s3本身,所以s3和s3.intern()不相等。

 

2、常量和new String

String s1 = "ab";     // 编译期会把"ab"添加到常量池String s2 = new String("ab");  // 只是"ab"从常量池取,而new又重新创建了一个StringSystem.out.println(s1 ==s2);  // false:两个不同的对象,返回System.out.println(s1.intern()== s2);  // false:s1 等价于 s1.intern()System.out.println(s1 ==s2.intern()); // true:intern会到常量池中查找

    运行期间,s1直接指向常量池的"ab",而s2用new创建,相当于先从常量池拿出"ab",然后再创建一个String。

    所以s1和s2是两个对象;s1.intern()和s1都是指向常量池,所以两者等价。而s2.intern()也是从常量池中获取,所以s1 == s2.intern()。

    总结:字符串常量池是JVM为了缓存我们用过的字符常量,避免重复创建字符对象,来提高效率。但是遇到一些特殊情况,如字符串相加操作,往往会产生很多多余无用的字符常量,这个处理方式就值得商榷了。   大伙有什么想法,可以讨论讨论 :)

这篇关于String字符常量池和intern()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/894913

相关文章

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

如何将一个文件里不包含某个字符的行输出到另一个文件?

第一种: grep -v 'string' filename > newfilenamegrep -v 'string' filename >> newfilename 第二种: sed -n '/string/!'p filename > newfilenamesed -n '/string/!'p filename >> newfilename

【Python 千题 —— 算法篇】字符统计

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 在编程中,对字符串的字符统计是一个常见任务。这在文本处理、数据分析、词频统计、自然语言处理等领域有广泛应用。无论是统计字母出现的频率,还是分析不同字符类型的数量,字符串字符统计都是非常有用的技术。 字符统

C语言进阶【1】--字符函数和字符串函数【1】

本章概述 字符分类函数字符转换函数strlen的使用和模拟实现strcpy的使用和模拟实现strcat的使用和模拟实现strcmp的使用和模拟实现彩蛋时刻!!! 字符分类函数 字符: 这个概念,我们在以前的文章中讲过了。我们键盘输入的信息都是字符。字符大体可以分为两类——单个字符,字符串。而单个字符又可以进行分类——字母字符,数字字符,特殊字符和不可见字符。进行思维图展示: 在日

centOS7.0设置默认进入字符界面

刚装的,带有x window桌面,每次都是进的桌面,想改成自动进命令行的。记得以前是修改 /etc/inittab 但是这个版本inittab里的内容不一样了没有id:x:initdefault这一行而且我手动加上也不管用,这个centos 7下 /etc/inittab 的内容 Targets systemd uses targets which serve a simil

Python字符编码及应用

字符集概念 字符集就是一套文字符号及其编码的描述。从第一个计算机字符集ASCII开始,为了处理不同的文字,发明过几百种字符集,例如ASCII、USC、GBK、BIG5等,这些不同的字符集从收录到编码都各不相同。在编程中出现比较严重的问题是字符乱码。 几个概念 位:计算机的最小单位二进制中的一位,用二进制的0,1表示。 字节:八位组成一个字节。(位与字节有对应关系) 字符:我们肉眼可见的文字与符号。

如何判断一个数组中是否包含一个字符或字符串

第一种方法:遍历数组 String[] arr1 = {"1","2","3","4","6","7"}; for (int i = 0; i < arr1.length; i++) { if("5".equals(arr1[i])) { System.out.println("包含"); }else { System.out.println("不包含"); } } 第二种方法:先把数组