string的(String详解)
String对象的不可变原因 ,String对象的内存布局 ,及String对象之间的执行== ,equals ,+运算时的分析 。
Author: Msuenb
Date: 2023-02-16
java.lang.String类代表字符串 。String 对象用于保存字符串 ,也就是一组字符序列 。字符串是常量 ,它们的值在创建后不能更改 。
String 的特点
String 是 final 类 ,不能被其他的类继承
String 类实现了 Comparable 接口 ,String 对象可以比较大小
String 对象内部是用字符数组保存字符串内容的
JDK9之前是 private final char value[] 数组 ,JDK9之后是 byte[] 数组
"hello"等效于char[] value = {h, e, l, l, o}
String 对象是不可变对象 ,一旦进行修改 ,就会产生新对象
注意:
String 类的 char[] value 数组是 final 修饰的 ,说明 value 数组地址不可变,不是数组元素不可变 由于 value 数组是 private 的 ,所以在 String 类外无法直接修改 value 数组的元素值(除非用反射) String 类中的方法涉及到 value 数组长度变化 ,或修改元素值,都是用用新对象来表示修改后内容 final char[] value = {h, e, l, l, o}; // value = new char[5]; // value 的地址不可修改 value[0] = H; // 可以修改 value 元素值 String str = "hello"; str = "world"; // 不会修改 "hello", 会在池中创建一个新的String对象接受 "world" str指向这个新对象 共会创建两个对象String 对象不可变 ,可以共享(节省内存) 。Java 中把需要共享的字符串常量对象存放在常量池中 。
String s1 = "hello"; String s2 = "hello"; System.out.println(s1 == s2); // true // 内存中只有一个 "hello" 对象被创建 ,同时被s1和s2共享创建String对象
总的来说 ,String 对象的创建方式有两种:直接赋值 和 使用构造器 ,这两种方式的机制是不一样的
直接赋值:String str1 = "hello"; 先从常量池中查看是否有 "hello" 数据空间 ,如果有 ,直接指向;如果没有 ,重新创建 ,然后指向 。 str1 最终指向的是常量池的空间地址 调用构造器:String str2 = new String("hello") 先在堆中创建空间 ,里面维护了 char[] value属性 。 如果常量池中有 "hello" 数据空间 ,value 直接指向 "hello" 空间;如果没有 ,重新创建 ,然后指向 。 str2 最终指向的是堆中的空间地址;value 才是指向常量池的空间地址 String 内存分析针对下面两行代码分析 String 对象的创建过程和内存布局
String str1 = "hello"; String str2 = new String("hello");String 内存布局:
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!