Java中String字符串常量池和intern方法源码分析

Java中String字符串常量池和intern方法源码分析

什么是字符串常量池

在Java中,字符串是不可变的,也就是说,对一个字符串的任何操作都将返回一个新的字符串对象,而原来的字符串对象不会被修改。

为了提高String对象的创建和删除效率,Java引入了字符串常量池(String Pool),该池用来缓存字符串对象,可以减少新的String对象的创建数量以及对Java虚拟机内存的占用。

在Java中,运行时常量池是方法区(Method Area)的一部分,在类加载时被初始化,存储编译期生成的各种字面量和符号引用。

String类中intern方法

String类中有一个intern()方法,该方法是一个native方法,用于把String对象添加到字符串常量池中,如果字符串常量池中已经存在了该字符串,则返回常量池中的字符串对象,否则将该对象添加到字符串常量池中,并返回该对象的引用。

例如,假设现有一个字符串池:["abc", "def"],现在需要对字符串"abc"进行intern()操作,操作后返回的引用将是"abc"的地址,同时字符串池中的元素不变,仍然是["abc", "def"]。

intern方法源码分析

Java中String类的intern()方法的源码:

public native String intern();

从源码可以看出,String的intern()方法是一个native方法,也就是说该方法在Java程序之外的C++代码中被实现。在OpenJDK中,这个方法的本地实现大致如下:

static jstring string_pool::intern(Handle string_or_null, TRAPS) {
    if (string_or_null() == NULL) {
        // 如果字符串为null则返回null
        return (jstring)string_or_null();
    }

    // 搜索常量池
    StringTable* const pool = JvmtiExport::string_table();
    Symbol* sym = NULL;
    {
        SharedStrings::LockGuard guard(pool->lock, true);
        sym = pool->lookup_stage2(string_or_null, CHECK_NULL);
    }

    if (sym != NULL) {
        // 字符串在常量池中存在
        return (jstring)sym->ref_str();
    } else {
        // 添加到常量池
        return pool->intern(string_or_null, CHECK_NULL);
    }
}

可以看出,intern()方法的实现比较简单,就是在StringTable中查找该字符串,如果该字符串已经在其中,返回该字符串;否则,将其添加到StringTable并返回该字符串。

示例说明

下面是两个示例,说明了字符串常量池和intern()方法的使用:

示例一:

String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2); // true

// 以上代码中,str1和str2都指向字符串池中的"abc",因此相等。

String str3 = new String("abc");
System.out.println(str1 == str3.intern()); // true

// 以上代码中,str3.intern()将"abc"字符串添加到字符串池,并返回池中的字符串引用,
// 因此,str1和str3.intern()都指向字符串池中的"abc",因此相等。

示例二:

String str1 = new String("Hello");
String str2 = "Hello";
System.out.println(str1 == str2); // false

// 以上代码中,str1是用new创建的新的String对象,str2指向字符串池中的"Hello",
// 因此不相等。

String str3 = str1.intern();
String str4 = str2.intern();
System.out.println(str3 == str4); // true

// 以上代码中,str1.intern()将"Hello"添加到字符串池,并返回池中的字符串引用,
// str2.intern()直接返回字符串池中的"Hello",
// 因此str3和str4都指向字符串池中的"Hello",因此相等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中String字符串常量池和intern方法源码分析 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • JavaWeb项目FullCalendar日历插件使用的示例代码

    下面是详细讲解JavaWeb项目中使用FullCalendar日历插件的攻略: 简介 FullCalendar是一款基于jQuery的开源工具,可以用来构建全功能、交互式日历和调度表。它可以用于Web应用程序、企业级管理系统、个人日历、日程安排等场景。使用FullCalendar可以快速高效地构建一个功能丰富的日历。下面是如何在JavaWeb项目中使用Ful…

    Java 2023年5月23日
    00
  • zTree树形插件异步加载方法详解

    zTree树形插件异步加载方法详解 zTree是一款高效、简约、易于使用的树形结构插件,常用于网站后台权限管理、目录导航等场景。对于大量数据的情况,zTree支持异步加载,可以有效提升页面性能和用户体验。本文将详细介绍zTree树形插件的异步加载方法及其使用。 异步加载说明 异步加载是指在树形结构中仅在需要时才动态加载数据,而不是一次性加载树的所有数据。在效…

    Java 2023年6月15日
    00
  • MyBatis通用的10种写法总结大全

    MyBatis通用的10种写法总结大全 1. 基础查询 示例1: xml <select id=”selectById” resultType=”com.example.model.User”> select * from user where id = #{id} </select> 示例2: xml <select id=”…

    Java 2023年5月20日
    00
  • jsp页面数据分页模仿百度分页效果(实例讲解)

    下面我们将分为以下几个部分来讲解“jsp页面数据分页模仿百度分页效果(实例讲解)”的完整攻略: 理解jsp页面数据分页的基础知识:分页原理、分页实现方式等; 实现分页插件的具体步骤:插件的引入、页面结构的构建、js代码的编写等; 给出两个具体的示例,让大家更好地理解和掌握分页插件的使用流程。 希望通过这篇攻略,大家能够对jsp页面数据分页有更深入的了解和认识…

    Java 2023年6月15日
    00
  • Java基于动态规划法实现求最长公共子序列及最长公共子字符串示例

    Java基于动态规划法实现求最长公共子序列及最长公共子字符串示例攻略 什么是最长公共子序列? 两个序列 X 和 Y 的“公共子序列”,是指存在一个序列 Z,Z 中元素既在 X 中,也在 Y 中,在 X 和 Y 中出现的次序分别相同,且 Z 的长度最大。例如序列“12345”和“1245”的公共子序列有“12”、“145”等,其中“145”最长,长度为 3,即…

    Java 2023年5月26日
    00
  • 教你轻松制作java视频播放器

    教你轻松制作Java视频播放器攻略 1. 软件准备 首先需要准备以下开发环境和工具:- JDK:Java开发工具包,用来编译和运行Java程序,建议使用JDK 8及以上版本。- Eclipse IDE:一款开源的Java集成开发环境,可以进行Java程序的编辑、编译、调试等操作。当然也可以使用其他集成开发环境,如NetBeans等。 2. 开始制作 步骤一:…

    Java 2023年5月20日
    00
  • Java日常练习题,每天进步一点点(33)

    下面我来详细讲解“Java日常练习题,每天进步一点点(33)”。 问题描述 本题目要求我们使用Java语言编写程序,实现一个计算器,可以进行加减乘除四个基本运算。 题目分析 对于这个题目,我们可以考虑使用面向对象的编程思想,将计算器看作一个对象,然后为计算器设计四个基本的操作方法。 编程实现 先定义一个Calculator类,其中包含四个方法add、sub、…

    Java 2023年5月20日
    00
  • Apache POI的基本使用详解

    《Apache POI的基本使用详解》是一篇介绍Apache POI库的使用方法的文章。Apache POI是一个开源的Java库,用于处理Microsoft Office格式(包括Excel、Word和PowerPoint)的文件。 一、Apache POI的安装 1.下载并安装Java Development Kit(JDK)。 2.下载最新版本的Apa…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部