(UserUtils.getUser().getExtend().getExtendS1()=="tenantAdministrator"?false:true
一切都因这行代码引发。。。。。。。
== 和 equals 就不介绍了
起先以为"tenantAdministrator" 保存到元空间,(UserUtils.getUser().getExtend().getExtendS1() 保存到堆里,后来用intern测了一下发现不是。。。
(UserUtils.getUser().getExtend().getExtendS1().intern() == "tenantAdministrator" // false(UserUtils.getUser().getExtend().getExtendS1() == "tenantAdministrator".intern() // false(UserUtils.getUser().getExtend().getExtendS1().intern() == "tenantAdministrator".intern() // true
String 中 intern用来返回常量池中的某字符串,如果常量池中已经存在该字符串,则直接返回常量池中该对象的引用。否则,在常量池中加入该对象,然后 返回引用。
也就是说 用intern 返回的是元空间的引用,(UserUtils.getUser().getExtend().getExtendS1() 是在堆中,"tenantAdministrator" ??? 在哪??
打印一下字节码。。。可以看到
Constant pool:
#86 = String #339 // tenantAdministrator
#339 = Utf8 tenantAdministrator
---------------------方法内-----------------------------
402: ldc #86 // String tenantAdministrator
今天发现 (UserUtils.getUser().getExtend().getExtendS1().intern() == "tenantAdministrator" 为true 了。。
那么咱们就不管BUG了 咱们只看string 和string pool
带着疑问,string 啥时候到 string pool 里面
https://blog.csdn.net/qq_26222859/article/details/73135660
转载一下- -这个比较全。。