TypechoJoeTheme

Clover 的博客

统计
登录
用户名
密码
/
注册
用户名
邮箱

CloverYou

日出于东却落于西,相识人海却散于席。
文章目录

27、Java String字符串的存储原理

2022-01-02
/
0 评论
/
12 阅读
/
正在检测是否收录...
01/02
  1. String 表示字符串类型,属于引用数据类型,不属于基本数据类型。
  2. 在Java中随便使用双引号括起来的都是String对象。例如:"abc","Hello Wold!",这是两个String对象。
  3. Java中规定,双引号括起来的字符串是不可变的,也就是说"abc"出生到最终死亡都是"abc",不能变成例如"abcd"
  4. 在JDK中双引号括起来的字符串,例如"abc"都是直接存储在方法区的字符串常量池当中的。

    public class StringTest {
      public static void main(String[] args) {
        String str = "abc";
      }
    }

以上代码内存图方式表示


如果有字符串拼接,那么在内存图中该怎么表示?例如:

String str2 = "abc" + "def";

"abc"在字符串常量池中存在,那么拿到该字符串在常量池中的内存地址,加上"def",而"def"在常量池中并不存在,所以需要在常量池中开辟一块空间存储"def",最后拼接成一个新的字符串"abcdef",如果常量池中没有保存到这个字符串,那么就会重新开辟一块空间存储,否则使用已创建的这个字符串的内存地址。而此时,如果没有另外一个引用指向"def",那么"def"此时是一个空引用

String str3 = new String("def");
 以上程序内存图应该这样表示

  1. 垃圾回收器不会回收常量池里的数据。
  2. 由于双等号"=="比较的是内存地址,所以两个字符串可以使用双等号进行比较,例如

    "Hello" == "Hello"// true

那么,new String("Hello"); 可以和new String("Hello");使用双等号比较吗?答案是不可以,因为双等号比较的是对象的内存地址,而使用new创建的对象必然是一个新的对象。

String构造方法

  1. String str = new String("");
  2. String str = "";
  3. String str = new String(byte[]);
  4. String str = new Strinh(byte[], offset, count);
  5. String str = new String(char[]);
  6. String str = new String(char[], offset, count);
JAVA学习笔记
朗读
赞(0)
版权属于:

Clover 的博客

本文链接:

https://www.ctong.top/index.php/archives/40/(转载时请注明本文出处及文章链接)

评论 (0)
CloverYou
日出于东却落于西,相识人海却散于席。
88 文章数
11 评论量
IP信息

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月

最新回复

  1. 缓存一致性 - 点击领取
    2022-01-06
  2. 宝宝
    2022-01-02

标签云