一、JVM 常量池中存储的是对象还是引用呢
答:String类型存放的是对象的引用。
当字符串不存在的时候,会在堆中创建字符串对象,然后再在字符串常量池当中创建这个引用(常量池指向堆中的字符串)。
参考链接:JVM 常量池中存储的是对象还是引用呢?
摘录:如果您说的确实是runtime constant pool(而不是interned string pool / StringTable之类的其他东西)的话,其中的引用类型常量(例如CONSTANT_String、CONSTANT_Class、CONSTANT_MethodHandle、CONSTANT_MethodType之类)都存的是引用,实际的对象还是存在Java heap上的。
二、字符串拼接
String 类型的变量和常量做“+”运算时发生了什么?
注意:用 ==
比较的时候,比较的是地址值是否相等,可以理解为判断是否指向了同一个对象。
三、String#intern 方法有什么作用
String.intern() 是一个 native(本地)方法,其作用是将指定的字符串对象的引用保存在字符串常量池中,可以简单分为两种情况:
- 如果字符串常量池中保存了对应的字符串对象的引用,就直接返回该引用。
- 如果字符串常量池中没有保存了对应的字符串对象的引用,那就在常量池中创建一个指向该字符串对象的引用并返回。(不会再新建一个字符串对象了)
四、创建对象个数
1.String str = “abc”;这句话创建了几个字符串对象?
答:0个或1个对象。
创建字符串“abc"时会先在字符串池中查找,看是否有相等的对象引用,没有的话就在堆中创建“abc”字符串对象,同时把地址驻留在字符串池,这个时候会创建一个对象;有的话则直接赋值为常量池中的引用,避免重复创建字符串对象,这个时候会创建0个对象。