java-(字符串String--源码分析--JVM内存分析)
字符串String--源码分析--JVM内存分析
String 类的对象 , 是不可变的字符串对象呢
这个不可变很重要,之后要讲的intern()也离不开它的不可变性。
https://www.cnblogs.com/xiaoxi/p/6036701.html
https://www.cnblogs.com/chenssy/p/3695271.html
这两博客源码和String基本上知识点都覆盖了
我们把 jvm 内存 逻辑上划分为 五个部分
分别是 :
栈 堆 方法区 本地方法栈 程序计数器
其中常量池在方法区里。
看几个问题:
String str=new String("abcd"); 创建了几个对象?一般说法是创建了两个,堆中一个,方法区一个。同时"abcd"放入常量池。
String str2="ab"+"cd"; 创建了几个对象? 一个。常量在编译期会优化。
String s1="ab"; String s=s1+"cd"; 创建了几个对象? 两个
这其中s3怎么都不会=="abcd"因为s3是不可变的。同时"abcd"放入常量池。
str是接收了s3在常量池中的那个地址。所以str=="abcd"
要想s3=="abcd", s3.intern()=="abcd" //true 直接用常量池的