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

微软雅黑做网站/哪家培训机构学校好

微软雅黑做网站,哪家培训机构学校好,武汉网站建设的公司哪家好,怎么做子网站从Java的Jvm的角度解释一下为什么String不可变? 从 JVM 的角度看,Java 中 String 的不可变性是由多层次的机制共同保障的,这些设计涉及内存管理、性能优化和安全保障: 1. JVM 内存模型与字符串常量池 字符串常量池(St…

从Java的Jvm的角度解释一下为什么String不可变?

从 JVM 的角度看,Java 中 String 的不可变性是由多层次的机制共同保障的,这些设计涉及内存管理、性能优化和安全保障:


1. JVM 内存模型与字符串常量池

  • 字符串常量池(String Pool)
    JVM 在堆内存中维护一个特殊的区域(Java 7 前在永久代,Java 7+ 在堆中)。当创建字符串字面量时:

    String s1 = "hello";  // 首次创建,在常量池分配内存
    String s2 = "hello";  // 复用常量池中的"hello"
    
    • s1s2 指向同一内存地址s1 == s2true)。
    • 如果 String 可变:修改 s1 会导致 s2 的值意外改变,破坏程序逻辑。
  • 技术实现
    JVM 通过 intern() 方法实现常量池机制。编译时确定的字面量自动入池,运行时可通过 intern() 手动入池。


2. 对象存储结构的不可变性

Java 8 及以前
public final class String {private final char value[]; // final 修饰的字符数组private final int hash;     // 缓存哈希值
}
  • final 关键字的作用
    1. value 引用不可变(不能指向新数组)
    2. 数组内容虽可通过反射修改,但破坏封装性(非正常操作)
Java 9+ 的优化
private final byte[] value;     // 改为字节数组(节省内存)
private final byte coder;       // 编码标记 (LATIN1/UTF16)

即使底层存储优化,数组引用和内容仍不可变


3. JVM 安全机制

  • 类加载安全
    字符串用于类全限定名(如 java.lang.Object)。如果字符串可变:

    • 恶意代码可修改类名字符串,破坏 JVM 类加载机制。
    • 导致类型系统混乱(如篡改 "java.lang.Integer" 为恶意类名)。
  • 访问控制安全
    字符串用于文件路径、网络地址等敏感信息:

    String path = "/etc/passwd";
    File file = new File(path);
    

    如果 path 在传递后被修改,可能导致安全漏洞。


4. 性能优化

  • 哈希码缓存
    String 重写了 hashCode(),首次计算后缓存结果:

    public int hashCode() {int h = hash;  // 默认为0if (h == 0 && value.length > 0) {// 计算哈希值并缓存hash = h = ...; }return h;
    }
    

    依赖不可变性:如果内容可变,缓存的哈希值会失效。

  • 同步与线程安全
    不可变对象天生线程安全,无需同步:

    // 多线程共享安全
    public static final String GLOBAL_CONFIG = "config";
    

    String 可变,全局常量将需要同步锁。


5. 编译器与运行时的协作

  • 编译期优化
    编译器合并已知字面量:

    String s = "a" + "b" + "c"; // 编译为 String s = "abc";
    

    依赖字符串不可变才能安全优化。

  • 运行时优化
    JVM 内联字符串操作,基于不可变性假设生成高效机器码。


6. 不可变性的"漏洞"与防御

虽然理论上可通过反射修改数组内容:

String str = "hello";
Field field = String.class.getDeclaredField("value");
field.setAccessible(true);
char[] value = (char[]) field.get(str);
value[0] = 'H'; // 修改为"Hello"

但 JVM 通过以下方式防御:

  1. SecurityManager 可阻止此类操作
  2. 破坏常量池一致性(修改后所有引用 "hello" 的位置均受影响)
  3. 实际开发中禁止使用(违反语言设计原则)

为什么 JVM 要这样设计?

  1. 内存效率
    常量池减少重复字符串内存占用(相同内容共享一份)。

  2. 性能优势

    • 哈希码缓存加速 HashMap 等集合操作
    • 避免同步开销
    • 编译器/运行时深度优化
  3. 系统安全
    保障类加载、访问控制等核心机制安全。

  4. 设计一致性
    作为基础数据类型,不可变性简化程序逻辑(如 Map<String, ...> 的键安全)。


不可变性的代价与解决方案

  • 拼接性能问题
    频繁修改字符串时产生临时对象:
    String s = "";
    for (int i = 0; i < 1000; i++) {s += i; // 产生大量临时 String 和 StringBuilder
    }
    
  • 解决方案
    使用 StringBuilder(单线程)或 StringBuffer(多线程)替代。

总结:JVM 视角下的不可变性

层面机制
内存模型字符串常量池依赖不可变性实现对象复用
对象结构final 字段 + 私有数组保障存储不可变
安全机制防止类加载、访问控制等核心功能被篡改
性能优化哈希码缓存、线程安全、编译器优化
JVM 规范Java 语言规范强制要求(§4.3.3. Strings are constant)

正是 JVM 从内存管理到运行时优化的全方位设计,确保了 String 不可变性的严格执行,成为 Java 体系稳定性的基石。

http://www.cadmedia.cn/news/798.html

相关文章:

  • 四川微信网站建设/百度广告代理公司
  • 西双版纳网站开发/学seo如何入门
  • ps做网站横幅/大数据营销案例
  • 专业网站建设企业网站制作/毕节地seo
  • win10系统做mac系统下载网站/北京网站优化页面
  • 金塔凯元建设集团有限公司官方网站/华为云速建站
  • 网站如何收录/一键优化大师下载
  • 重庆企业网站的推广/seozou是什么意思
  • 做手表网站用什么源码比较好/郑州网站建设哪家好
  • 专门做ppt会员网站/兰州网络优化seo
  • 如何做计算机网站/seo站长之家
  • 做简单网站需要学什么/关键词优化公司
  • 一般网站开发语言/郑州网络推广服务
  • 天津网站建设哪家好/今日刚刚发生的新闻
  • 诸城网站建设费用/信息流推广的竞价机制是
  • 邢台网络公司做网站/网站宣传方法
  • 中国建设教育协会网站查/云盘搜索
  • 博客网站怎么建设/seo就是搜索引擎广告
  • 现在还有企业要建网站吗/网络广告宣传平台
  • 闽侯福州网站建设/百度权重1是什么意思
  • 怎样做一个微信公众号/外贸谷歌seo
  • 广州品牌网站设计建设/google商店
  • 网站后wordpress文章编辑页面/免费网站建设哪个好
  • 如何识别网站的建站程序/汕头网站建设公司哪个好
  • 网站建设标书/个人博客网页制作
  • 网站建设知名公司/黄页88网
  • 莱芜公司做网站/免备案域名
  • 南京建设企业网站/网络营销师资格证报名
  • 建立网站第一步是建立什么/seo初级入门教程
  • wordpress播放网易云/谷歌seo网站排名优化