String的比较,编译优化以及intern引申
java string比较时必须使用equals,这是一个定论,但是要了解这个规则确实需要不少知识。不少书上告诉你==只能比较地址,地址不一样,那就是false,string存在着相同字面量不同地址的问题。知道的多一些的,还知道有常量池,但是什么样的string在常量池呢,本文就详细的说一下各种情况。 string常量池 大家都知道string能通过==返回true是因为常量池,他们的地址是相同的,在两种情况下我们会用到,第一种是编译阶段,java在编译成字节码的同时,会把常量标志出来,在编译阶段确定的字符串会进入常量池;第二种情况就是string的intern方法,这个方法会把调用的字符串放入常量池(jdk1.7以后中会直接获取堆中string对象的引用,文章后面会具体说),并且返回常量池的地址,如果常量池有相同的字符串,则返回常量池的地址,不再创建。 常见场景 String a = "xxx"; String b = "xxx"; 这种情况a==b为true,因为在编译时已经确定了xxx的字符串 String a ="xxx1"; final int value =1; S...