博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
String字符串内存模型与拼接方式
阅读量:2713 次
发布时间:2019-05-13

本文共 1134 字,大约阅读时间需要 3 分钟。

 常见代码如下

String str = "rrr";String str0 = "rrr";String str1 = str;String str2 = str + "333";String str6 = "111" + "333";String str3 = str.intern();String str4 = new String("123");

 

String str6 = "111" + "333";

str6变量在编译的时候可以优化,相当于"111333"字符串常量赋值str6.

String str2 = str + "333";

 str2的值相当于常量池创建str,与 "333",并创建拼接上的常量"rrr333",将常量的地址赋予str2.

如果是方法处理

//在JVM编译的时候 public String concatString(String str1, String str2){    return str1+str2;}//可能会变成public void concatString(String str1, String str2){    StringBuilder sb = new StringBuilder();    sb.append(str1);    sb.append(str2);    return sb.toString();}

 

Java中,String有字符串常量池的概念,如上"rrr"在运行时,会在常量池建立"rrr"对象,内存地址指向str。

String的value是private final类型,不可改变

除非new String("xxx"),否则如果String值字面量一致(eques),它们的内存地址一致。使用==比较为true,如上,str与str0,str1,str3

String的intern()方法会监测常量池中是否有该字符串的值的字面量,有,返回字符串常量的地址,没有,则新建新建字符串常量并返回内存地址。

String str4 = new String("123");

Java也会监测常量池中是否有“123”字面量,没有,则在常量池中再新建一个“123”的字面量。

使用new关键字新建String对象时,会在堆中新创建一个字符串对象,值为“123” 

 如果此时比对str4=="123",结果为false。

JVM高级特性 

jdk1.7的HotSpot中,将原来在方法区中的静态变量、字符串常量池等移到堆内存中,(常量池包含字符串常量池、class常量池等)

在jdk1.8中,方法区更名元空间(MetaSpace),直接占用的本地内存(NativeMemory)。 

你可能感兴趣的文章
图趣:轻量级架构遇到重量级需求
查看>>
图趣:当我以为我修复了一个 Bug
查看>>
Redis 五种数据类型及应用场景
查看>>
图趣:当我看实习生编码
查看>>
漫画: HTTPS 如何提高安全性?
查看>>
JAVA的原子性、可见性与有序性?
查看>>
图趣:当我第一次测试我的代码时
查看>>
图趣:新手调试 CSS
查看>>
因用了Insert into select语句,同事被开除了!
查看>>
一次 SQL 查询优化原理分析(900W+ 数据,从 17s 到 300ms)
查看>>
这么多...if...else...你烦不烦?
查看>>
图趣:数据库的 Delete 语句忘了使用限定词 where...
查看>>
毕业4年年薪200万是怎样的一种体验?
查看>>
图趣:修改一个小 bug,却把服务器弄宕机了
查看>>
短短的 RESTful API 设计规范
查看>>
图趣:偶然间看到自己多年前写的代码
查看>>
这次终于知道 数据库 “连接池” 到底应该设多大了
查看>>
图趣:程序员新手尝试新框架的时候
查看>>
架构师必备:Apache 架构师的 30 条设计原则!
查看>>
图趣:功能先上了再说
查看>>