Java中intern()方法的使用小结

 更新时间:2025年07月21日 08:36:13   作者:ruan114514  
本文主要介绍了Java中intern()方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在Java中,字符串处理是日常开发的核心操作之一。而String.intern()方法作为String类的一个特殊方法,与Java的字符串常量池(String Pool)紧密相关。本文将深入剖析intern()的工作原理、使用场景和潜在陷阱,助你高效管理字符串内存。

一、字符串常量池:背景知识

Java为了优化字符串内存占用,设计了字符串常量池(位于堆内存中)。当创建字符串字面量(如"hello")时,JVM会先检查池中是否存在相同内容的字符串:

  • 若存在,直接返回池中的引用;
  • 若不存在,将字符串放入池中再返回引用。

这种机制避免了重复字符串的内存浪费。

二、intern()方法的作用

intern()是一个本地方法(Native Method),其行为如下:

String str1 = new String("hello");  // 在堆中创建新对象
String str2 = "hello";              // 使用常量池中的对象
String str3 = str1.intern();        // 将str1的内容放入常量池(若不存在)并返回池中引用

System.out.println(str1 == str2);   // false(不同对象)
System.out.println(str2 == str3);   // true(指向同一对象)

核心逻辑
调用intern()时,若常量池中已存在等值字符串,则返回其引用;否则将该字符串加入池中并返回引用(JDK7+的行为,详见下文)。

三、JDK版本的关键差异

1. JDK6及之前

  • 字符串池位于永久代(PermGen),大小有限易触发OutOfMemoryError
  • intern()会将字符串复制到永久代。

2. JDK7+

  • 字符串池移至堆内存,支持动态扩展。
  • intern()不再复制字符串,而是记录堆中已有字符串的引用,节省内存。

四、典型使用场景

减少重复字符串内存占用
适用于大量重复字符串的场景(如日志处理):

List<String> strings = new ArrayList<>();
for (int i = 0; i < 100_000; i++) {
    String temp = new String("重复数据").intern(); // 指向池中唯一对象
    strings.add(temp);
}

加速字符串比较
intern()后可用==代替equals()(谨慎使用!):

String a = new String("data").intern();
String b = new String("data").intern();
System.out.println(a == b); // true

到此这篇关于Java中intern()方法的使用小结的文章就介绍到这了,更多相关Java intern()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • 详解spring boot实现websocket

    详解spring boot实现websocket

    这篇文章主要介绍了详解spring boot实现websocket,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Spring Boot 2.4 对多环境配置的支持更改示例代码

    Spring Boot 2.4 对多环境配置的支持更改示例代码

    这篇文章主要介绍了Spring Boot 2.4 对多环境配置的支持更改,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 解决IDEA中快捷键Alt+Enter不能使用的问题

    解决IDEA中快捷键Alt+Enter不能使用的问题

    这篇文章主要介绍了解决IDEA中快捷键Alt+Enter不能使用的问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • java实现微信支付功能

    java实现微信支付功能

    这篇文章主要为大家详细介绍了java实现微信支付功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • Servlet 过滤器详细介绍

    Servlet 过滤器详细介绍

    这篇文章介绍了Servlet 过滤器,有需要的朋友可以参考一下
    2013-10-10
  • Java文件与IO流详细攻略

    Java文件与IO流详细攻略

    文章详细介绍了Java中的IO流,包括字节流和字符流的区别,如何使用File类进行文件操作,以及如何进行高效的文件读写,文章还讨论了字符编码的重要性,如何避免常见的编码问题,以及如何使用现代的NIO.2 API进行文件操作,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • SpringBoot中的@Configuration、@MapperScan注解

    SpringBoot中的@Configuration、@MapperScan注解

    SpringBoot中的@Configuration和@MapperScan注解分别用于配置类和Mapper接口的自动扫描,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • Java接口的作用以及使用说明

    Java接口的作用以及使用说明

    接口是一种规范,定义了一组方法的原型,但没有实现,类通过实现接口来实现接口中的抽象方法,接口可以提供规范性、扩展性和可插入性,在Java中,接口可以用来声明一个变量,实现接口的类必须实现接口中定义的所有方法,接口提供了一种机制
    2024-11-11
  • 浅析Java中对象的创建与对象的数据类型转换

    浅析Java中对象的创建与对象的数据类型转换

    这篇文章主要介绍了Java中对象的创建与对象的数据类型转换,是Java入门学习中的基础知识,需要的朋友可以参考下
    2016-01-01
  • 基于spring boot实现一个全局异常处理器

    基于spring boot实现一个全局异常处理器

    在项目开发中,我们可以基于spring boot提供的切面特性,来很轻松的实现全局异常的处理,所以本文主要为大家介绍了如何基于spring boot实现一个全局异常处理器,有需要的可以参考下
    2023-09-09

最新评论