intern方法的作用
- 将字符串常量池中的stringtable对应字符串的引用值返回
- 如果字符串常量池中的stringtable没有对应字符串的记录,则动态的将字符串对象的引用放到stringtable中
字符串常量池案例分析
总共八部分
- 结果为假,一共创建了两个对象,一个是在字符串常量池中的abc,另一个是在堆空间分配的abc字符串对象
- 结果为假,只要使用了new关键字,就会在堆空间中新创建一个对象
- 结果为真,存在编译优化,查看到两个字面量相加时会将它们合并
- 结果为真,第一个变量s使用了final进行修饰,则视为常量,常量在编译的过程中就能够进行编译优化合并中ab
- 结果为假,s1、s2都为变量,在编译期间并不知道值,需要在运行区间进行运算,而在运行期间两个值的合并就需要new出两个字符串,取出字符串然后new一个stringbuffer进行合并处理,转换为字符串,存放在堆空间中
- 结果为假,同样是运行期间才能进行字符串处理
- 结果为假,与6情况类似
- 结果为真,s6指向字符串常量池中的abc,而s7虽然最终在运行期间才产生,判断中但使用的是intern方法,由intern可知,这里返回的是字符串abc的引用,所以相等
- 结果为真
- 结果为假
- 结果为真,总共创建了五个对象,字符串常量池中的jo、hn对象,堆空间中的jo、hn、john对象,john对象调用intern方法,虚拟机去查找字符串常量池的stringtable中不存在该对象,则将自身引用放入stringtable中,所以该对象调用intern方法,返回的是自身引用
- 结果为假,java为默认的字符串值,存放在字符串常量池中