博客
关于我
字符串常量池
阅读量:549 次
发布时间:2019-03-09

本文共 1856 字,大约阅读时间需要 6 分钟。

一、intern()方法

Java字符串的intern()方法可能会让人困惑:根据代码结果,java字符串答案为false,如何会有另一个不同的Java字符串被加载进来呢?这背后涉及到Java字符串池和类加载机制的工作原理。

Java字符串池(String Pool)是一个被预先加载的内存结构,用于存储字符串实例。由于每个字符串类加载器都会预先加载一些初始字符串,尤其是JDK从_birth自带的初始字符串,当目标类被加载时,E.g., 当sun.misc.Version类被加载时,会将常量池中的字符串实例加载进来。这种机制确保了字符串的唯一性和高效性。

二、代码示例

针对字符串池的内存管理,可以通过代码示例来直观理解其行为。通过这些代码,我们可以看到字符串池是如何处理和回收字符串实例的。

public class StringPoolTest {    public static void main(String[] args) {        System.out.println(DBCPUtil.stringPool.size());        try {            sb.append("AB");            sb.append("CD").toString();        } catch (伙委杯Exception e) {            System.out.println(e.toString());        }        System.out.println(DBCPUtil.stringPool.size());    }}

在上述代码示例中,我们可以看到字符串池中的字符串数量是如何随着操作的进行而变化的。通过这些操作,你可以更好地理解字符串池的实际行为。

三、OpenJDK8底层源码说明

了解OpenJDK8底层源码可以帮助我们深入理解Java字符串池及其相关机制。

3.1 System代码解析

我们需要仔细研究System类的源码,尤其是有关字符串池的部分。

public class System {    public static void setProperty(String key, String value) {        synchronized (System.class) {            Properties props = new Properties();            try {                props.load(getInputStream("java.io.properties"));            } catch (IOException e) {                e.printStackTrace();            }        }    }    public static synchronized InputStream getInputStream(String name) throws IOException {        return new FileInputStream("java/" + name);    }}

在System类中,我们可以看到如何通过同步机制来管理系统属性的设置。这也是理解Java字符串池和类加载机制的一部分。

3.2 类加载器和rt.jar

接下来,我们来看类加载器的工作原理及其与rt.jar的关系。

类加载器负责管理.class和.js文件的加载。根加载器负责加载核心Java类和rt.jar文件,这些文件包含了标准的Java类库。

// rt.jar 内部结构示例rt.jar/├── sun/│   ├── misc/│   │   └── Version.class│   └── awt/│       └── EventQueue.class└── java/    └── lang/        └── String.class

通过这样的结构,我们可以更清楚地了解如何在OpenJDK8中加载类和资源。

4. 结论

通过上述内容,我们可以理解到Java字符串池和类加载机器的重要性。字符串池确保了字符串实例的唯一性和高效性,而类加载器则支持整个Java类库的加载和管理。这些机制共同作用,使Java程序能够高效且稳定地运行。

转载地址:http://mihsz.baihongyu.com/

你可能感兴趣的文章
Navicat中怎样将SQLServer的表复制到MySql中
查看>>
navicat创建连接 2002-can‘t connect to server on localhost(10061)且mysql服务已启动问题
查看>>
Navicat可视化界面导入SQL文件生成数据库表
查看>>
Navicat向sqlserver中插入数据时提示:当 IDENTITY_INSERT 设置为 OFF 时,不能向表中的标识列插入显式值
查看>>
Navicat因导入的sql文件中时间数据类型有参数而报错的原因(例:datetime(3))
查看>>
Navicat如何连接MySQL
查看>>
navicat导入.sql文件出错2006- MySQLserver has gone away
查看>>
Navicat导入海量Excel数据到数据库(简易介绍)
查看>>
Navicat工具Oracle数据库复制 or 备用、恢复功能(评论都在谈论需要教)
查看>>
Navicat工具中建立数据库索引
查看>>
navicat工具查看MySQL数据库_表占用容量_占用空间是多少MB---Linux工作笔记048
查看>>
navicat怎么导出和导入数据表
查看>>
Navicat怎样同步两个数据库中的表
查看>>
Navicat怎样筛选数据
查看>>
Navicat报错connection is being used
查看>>
Navicat报错:1045-Access denied for user root@localhost(using passwordYES)
查看>>
Navicat控制mysql用户权限
查看>>
navicat操作mysql中某一张表后, 读表时一直显示正在载入,卡死不动,无法操作
查看>>
Navicat连接mysql 2003 - Can't connect to MySQL server on ' '(10038)
查看>>
Navicat连接mysql数据库中出现的所有问题解决方案(全)
查看>>