Java数据结构——字符串常量池

目录

1.创建对象的思考

2.字符串常量池

3.再谈String对象创建


1.创建对象的思考

下面两种创建String对象的方式相同吗?

public class Solution {
    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中引入了:

  1. Class文件常量池:每个 .Java源文件编译后生成了 .Class文件中会保存当前类中的字面常量以及符号信息。
  2. 运行时常量池:在.Class文件被加载时,.Class文件中的常量池被加载到内存中称为运行时常量池,运行时常量池每个类都有一份。
  3. 字符串常量池(只要是双引号引起来的都会放到常量池中)

此处简单了解一下,后序在讲JVM时会给同学们详细阐释。


2.字符串常量池

字符串常量池在JVM中是StringTable类,实际是一个固定大小的HashTable(一种高效用来进行查找的数据结构),不同JDK版本下字符串常量池的位置以及默认大小是不同的:

关于方法区、堆等内存结构的具体局部,后序JVM中会给大家详细介绍。


3.再谈String对象创建

由于不同JDK版本对字符串常量池的处理方式不同,此处Java8HotSpot上分析

1.直接使用字符串常量池进行赋值

public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "hello";
        System.out.println(s1 == s2); // true
}

 2.通过new创建String类对象

 结论:只要是new对象,都是唯一的。

通过上面例子可以看出:使用常量串创建String类型对象的效率更高,而且更节省空间。用户可以将创建的字符串对象通过intern方式添加进字符串常量池中。
3.intern方法

intern是一个native方法(Native方法指:底层使用C++实现,看不到其实现的源代码),该方法的作用是手动将创建的String对象添加到常量池中。

public static void main(String[] args) {
char[] ch = new char[]{'a', 'b', 'c'};
String s1 = new String(ch); // s1对象并不在常量池中
//s1.intern(); // s1.intern();调用之后,会将s1对象的引用放入到常量池中
String s2 = "abc"; // "abc" 在常量池中存在了,s2创建时直接用常量池中"abc"的引用
System.out.println(s1 == s2);
}
// 输出false
// 将上述方法打开之后,就会输出true

注意:在Java6和Java7/8中intern的实现会有些许的差别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小凌不是林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值