java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值还,还包含一些以文本形式出现的符号引用,比如:
类和接口的全限定名;
字段的名称和描述符;
方法和名称和描述符。
1. Integer i1 = new Integer(1); Integer i2 = new Integer(1); i1 == i2 --->false
Integer i3 = 1; Integer i4 = 1; i3 == i4 --->true
2. String s1 = new String("love"); String s2 = new String("love"); s1 == s2 --->false
String s1 = "love" + "java"; String s2 = "lovejava"; s1 == s2 --->true
String str1 = "love"; String str2 = "java"; String s3= s1 + s2; s1 == s3 --->false
final String str1 = "love"; final String str2 = "java"; String s3= s1 + s2; s1 == s3 --->true (宏替换)
java中基本类型的包装类的大部分都实现了常量池技术,这些类是Byte,Short,Integer,Long,Character,Boolean,另外两种浮点数类型的包装类则没有实现。另外Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127时才可使用对象池,也即对象不负责创建和管理大于127的这些类的对象。
3. Integer i1 = 127; Integer i2 = 127; i1 == i2 --->true
Integer i3 = 128; Integer i4 = 128; i3 == i4 --->false
4. Boolean b1 = false; Boolean b2 = false; b1 == b2 --->true
5. Double d1 = 1.0; Double d2 = 1.0; d1 == d2 --->false