java8基础知识--字符串

Java 字符串(String)核心知识点总结(JDK8)

一、String 基础特性

  1. String 是 final 类 :不可被继承,底层由 final char[] 存储(JDK9 改为 byte\[\])。
  2. 不可变性 :字符串一旦创建,内容无法修改 。
    • 所有修改操作(截取、替换、拼接)都会返回新字符串。
    • 好处:线程安全、常量池复用、哈希值固定。

二、字符串常量池(String Pool)

  1. 位置 :JDK8 中位于堆内存中。
  2. 作用:缓存字符串字面量,实现对象复用,节省内存。
  3. 核心规则 :
    • 相同内容的字符串,常量池中只存一份。
    • 使用字面量创建的字符串,自动进入常量池。

三、三种创建方式的内存区别

1. 字面量创建(推荐)

java 复制代码
String s = "hello";
  • 先查常量池,存在直接复用,不存在则创建。
  • 只在常量池创建 1 个对象。

2. new String 创建

java 复制代码
String s = new String("hello");
  1. 常量池中创建/复用 "hello"。
  2. 堆中创建新的 String 对象。
  • 共创建 2 个对象(堆1个 + 常量池1个)。

3. 字符串拼接

  1. 常量 + 常量 ("a" + "b")
    编译期直接优化为 "ab",存入常量池。

  2. 变量 + 变量/常量 (a + b)
    底层优化为:

    java 复制代码
    new StringBuilder().append(a).append(b).toString()

    最终在堆中创建新对象 ,不进入常量池。


四、intern() 方法详解

1. 作用

手动将字符串加入常量池,并返回常量池中的对象引用。

2. 执行逻辑

  1. 去常量池查找相同内容的字符串。
  2. 存在 → 直接返回常量池对象。
  3. 不存在 → 将当前对象的引用存入常量池,再返回。

3. 关键点

  • 不会删除/移动原堆对象。
  • 原对象无引用时,由 GC 自动回收。
  • 目的:实现字符串复用,节省内存,可用 == 快速比较。

五、== 和 equals() 区别

  1. ==
    • 基本类型:比较值。
    • 引用类型(String):比较内存地址。
  2. equals()
    • String 重写了该方法,比较字符串内容。
  • 开发规范:字符串比较必须用 equals() (常量池复用可用 ==,但不推荐)。

六、经典内存面试题

题1

java 复制代码
String s1 = "abc";
String s2 = "abc";
// s1 == s2 → true(常量池复用同一对象)

题2

java 复制代码
String s1 = new String("abc");
String s2 = new String("abc");
// s1 == s2 → false(两个不同堆对象)

题3

java 复制代码
String s1 = "ab";
String s2 = "a" + "b";
String s3 = s1 + "b";
// s1 == s2 → true(编译优化)
// s1 == s3 → false(s3 在堆中)

题4

java 复制代码
String s1 = new String("hello");
String s2 = s1.intern();
String s3 = "hello";
// s1 == s2 → false
// s2 == s3 → true

七、核心总结(必背)

  1. String 不可变,修改返回新对象。
  2. 字面量存常量池,new String() 存堆内存。
  3. 变量拼接底层用 StringBuilder,结果在堆。
  4. intern() 手动入池,返回常量池对象,不删除原对象。
  5. 字符串比较用 equals(),地址比较用 ==。
相关推荐
非优秀程序员9 小时前
第04章 邮箱大战,163 与 QQ 的暗战|《互联网产品恩仇录》
java·vue.js·架构
知已难寻10 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
文丑颜不良啊12 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang13 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪13 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息13 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼14 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff15 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
SL_staff15 小时前
企业AI落地难?JVS-AI渐进式实践:安全可控、小切口验证、标准化沉淀与规模化复制
java·开源·aigc
SL_staff17 小时前
JVS数字底座实践:构建企业级统一内容管理平台的技术路径
java·产品