当前位置: 首页 > news >正文

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()不再复制字符串,而是记录堆中已有字符串的引用,节省内存。


四、典型使用场景
  1. 减少重复字符串内存占用
    适用于大量重复字符串的场景(如日志处理):

    List<String> strings = new ArrayList<>();
    for (int i = 0; i < 100_000; i++) {String temp = new String("重复数据").intern(); // 指向池中唯一对象strings.add(temp);
    }
  2. 加速字符串比较
    intern()后可用==代替equals()(谨慎使用!):

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

http://www.dtcms.com/a/289676.html

相关文章:

  • 全新安装Proxmox VE启动时卡在Loading initial ramdisk
  • RAII机制以及在ROS的NodeHandler中的实现
  • 【c++】200*200 01灰度矩阵求所有的连通区域坐标集合
  • 鸿蒙开发中 渲染范围的控制
  • 飞腾D2000的BIOS编译
  • 在服务器无网络的环境下安装 VS Code Remote-SSH 组件
  • 【Python练习】053. 编写一个函数,实现简单的文件加密和解密功能
  • C++string类(3)
  • 基于单片机的火灾报警系统设计
  • SaTokenException: 未能获取对应StpLogic 问题解决
  • c#转python第四天:生态系统与常用库
  • 新版Acrobat Pro DC 2025 PDF编辑器下载与保姆级安装教程!!
  • Mermaid 语法
  • 突破select瓶颈:深入理解poll I/O复用技术
  • 让黑窗口变彩色:C++控制台颜色修改指南
  • 【数据结构】第一讲 —— 概论
  • Shell脚本-sort工具
  • 两个数据表的故事第 2 部分:理解“设计”Dk
  • SElinux和iptables介绍
  • 【Linux操作系统 | 第21篇-进阶篇】Shell编程(下篇)
  • 什么是的优先级反转(Priority Inversion) 和 优先级继承(Priority Inheritance)?
  • 【软件测试】使用ADB命令抓取安卓app日志信息(含指定应用)
  • 【AI论文】递归混合体:学习动态递归深度以实现自适应的令牌级计算
  • faster-lio与fast-lio中如何修改雷达的旋转角度
  • 单片机启动流程和启动文件详解
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 59(题目+回答)
  • 商业秘密保护:从法律理论到企业实战
  • 牛客-删除公共字符
  • 股票账户数据及其数据获取
  • 【时时三省】(C语言基础)字符指针作函数参数