【Java数据结构】字符串常量池
一 . 创建对象的思考
下面两种创建 String 对象的方式相同吗?
public static void main(String[] args) {
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
String s4 = new String("hello");
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s3 == s4);
}
上述程序创建方式类似,为什么s1和s2引用的是同一个对象,而s3和s4不是呢?
在 Java 程序中,类似于: 1 , 2 , 3 , 3.14 , “hello” 等字面类型的常量经常频繁使用, 为了使程序的运行速度更快、 更节省内存 , Java 为 8 种基本数据类型和 String 类都提供了常量池。
" 池 " 是编程中的一种常见的 , 重要的 提升效率 的方式 , 我们会在未来的学习中遇到各种 " 内存池 ", " 线程池 ", " 数据库连接池" ....
比如:家里给大家打生活费的方式
1. 家里经济拮据,每月定时打生活费,有时可能会晚,最差情况下可能需要向家里张口要,速度慢
2. 家里有矿,一次性打一年的生活费放到银行卡中,自己随用随取,速度非常快
方式2,就是池化技术的一种示例,钱放在卡上,随用随取,效率非常高。常见的池化技术比如:数据库连接池、线程池等。
为了节省存储空间以及程序的运行效率, Java 中引入了:
Class文件常量池:每个.Java源文件编译后生成.Class文件中会保存当前类中的字面常量以及符号信息 运行时常量池:在.Class文件被加载时,.Class文件中的常量池被加载到内存中称为运行时常量池,运行时常量池每个类都有一份 字符串常量池此处简单了解下,后序在讲JVM 时会给同学们详细阐释。
二. 字符串常量池(StringTable)
字符串常量池在 JVM 中是 StringTable 类,实际 是一个固定大小的 HashTable ( 一种高效用来进行查找的数据结构,后序给大家详细介绍) ,不同 JDK 版本下字符串常量池的位置以及默认大小是不同的:
关于方法区、堆等内存结构的具体局部,后序 JVM 中会给大家详细介绍。
三. 再谈String对象创建
由于不同 JDK 版本对字符串常量池的处理方式不同,此处在 Java 8 HotSpot 上分析
1. 直接使用字符串常量进行赋值
public static void main(String[] args) {
String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2);
}
2. 通过new创建String类对象
结论:只要是new的对象,都是唯一的。
通过上面例子可以看出:使用常量串创建String类型对象的效率更高,而且更节省空间。用户也可以将创建的字符串对象通过 intern 方式添加进字符串常量池中。
三. intern方法
intern 是一个 native 方法 (Native 方法指:底层使用 C++ 实现的,看不到其实现的源代码 ) , 该方法的作用是手 动将创建的 String 对象添加到常量池中 。
注意:在 Java6 和 Java7 、 8 中 Intern 的实现会有些许的差别
public static void main(String[] args) {
char[] ch = new char[]{'a', 'b', 'c'};
String s1 = new String(ch);
String s2 = "abc";
System.out.println(s1 == s2);
}
网址:【Java数据结构】字符串常量池 https://www.yuejiaxmz.com/news/view/11031
相关内容
经典String str = new String(“abc”)创建了几个对象?(转)SpringBoot物品维修服务平台w48in程序+源码+数据库+调试部署+开发环境
Springboot宠物网站系统6v03x(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
java健康饮食管理系统(ssm)
省时省力,这些Python高效代码片段必须牢记
【毕业设计】基于Java的个人记账系统的设计与实现
java计算机毕业设计宠物寄托管理系统(开题+程序+论文)
基于java+ssm+jsp的个人财务管理系统
数据安全的守护者,智慧生活的推动者
Java中的值交换