2026/1/16 5:55:21
网站建设
项目流程
青岛公司注册网站,网店美工是什么,吉林省住房建设安厅网站安全管理,小型电子商务网站建设与发展一、核心概念#xff08;通俗解释#xff09;可以把字符串常量池理解成一个「字符串缓存池」#xff1a;当你创建字符串#xff08;比如 String s hello#xff09;时#xff0c;JVM 会先去常量池里找有没有内容为 hello 的字符串。如果有…一、核心概念通俗解释可以把字符串常量池理解成一个「字符串缓存池」当你创建字符串比如String s hello时JVM 会先去常量池里找有没有内容为hello的字符串。如果有直接返回这个字符串的引用相当于「复用」如果没有就先在常量池里创建hello再返回引用。而通过new String(hello)创建的字符串会在堆内存新建对象同时常量池里也会创建hello如果之前没有这也是为什么new String会比直接赋值多占用内存。二、代码示例直观理解常量池机制java运行public class StringConstantPoolDemo { public static void main(String[] args) { // 方式1直接赋值字符串存入常量池复用已有对象 String s1 hello; String s2 hello; // 方式2new 创建堆内存新建对象常量池仍会存hello若不存在 String s3 new String(hello); String s4 new String(hello); // 对比引用 比较对象地址equals 比较内容 System.out.println(s1 s2); // trues1和s2指向常量池同一个hello System.out.println(s1 s3); // falses1指向常量池s3指向堆内存对象 System.out.println(s3 s4); // falses3和s4是堆里两个不同对象 System.out.println(s1.equals(s3)); // true内容相同 // intern() 方法将堆中的字符串对象入池返回常量池引用 String s5 s3.intern(); System.out.println(s1 s5); // trues5现在指向常量池的hello } }三、关键知识点存储位置JDK 1.6 及之前常量池位于方法区永久代JDK 1.7 及之后常量池被移到堆内存更灵活避免永久代内存溢出。核心方法intern ()作用将当前字符串对象的内容存入常量池若不存在并返回常量池中的引用场景当需要复用动态生成的字符串比如拼接后的字符串时用intern()可优化内存。字符串拼接的特殊情况java运行String s1 a b; // 编译期优化直接等同于ab存入常量池 String s2 ab; System.out.println(s1 s2); // true String a a; String b b; String s3 a b; // 运行期拼接会new String(ab)存在堆中 System.out.println(s3 s2); // false System.out.println(s3.intern() s2); // true四、实际应用价值内存优化避免大量重复字符串占用内存比如业务中频繁使用的固定字符串如 success、fail性能提升复用已有对象减少 GC垃圾回收压力字符串比较时比equals更快但仅适用于常量池字符串。总结字符串常量池是 JVM 优化字符串内存的缓存机制直接赋值的字符串会优先存入常量池并复用new String()会在堆创建新对象可通过intern()方法将内容入池复用JDK 1.7 后常量池移至堆内存拼接字符串的编译期 / 运行期处理逻辑不同需注意引用对比的差异。