下面这图里,最后一段话,看不懂啊,大神打点代码演示看看啊
java的八种基本类型(Byte Short、Integer、Long、Character、Boolean、Float、Double),除Float及Double意外,其它六种都实现了常量池,但是他们只在大于等于-128且小于等于127时才能使用常量池,如果不在此范围内,则会new一个出来,保存在堆内存中。 |
免责声明:本内容仅代表回答会员见解不代表天盟观点,请谨慎对待。
版权声明:作者保留权利,不代表天盟立场。
|
|
|
|
常量池你可以理解成 一块内存空间,
说明一个知识点, == 这个运算符号,如果a == b 是true的话,说明 a和b指向的同一个对象,两个对象不相等的话他们运行 == 运行结果一定是false(注意是对象不相等不是值不相等)
下面 上代码:
publicclassTest{ publicstaticvoidmain(String[]args){ Integeri1=1; Integeri2=1; //i2在-128~127直间,等价于i2=i1 System.out.println(i1==i2); /** *输出结果true */ Integeri3=128;//i3不在-128~127直间,等价于i3=newInteger(128); Integeri4=128;//i4不在-128~127直间,等价于i4=newInteger(128); System.out.println(i3==i4); /** *输出结果false */ } }就拿Integer举例说吧,上边代码Integer i1 = 1; 当i1创建出来的时候编译器发现他在-128~127这个范围里,所以会把它暂存在一块固定的内存中,当你再定义 Integer i2 = 1的时候,编译器会去常量池中找看看你之前有没有定义过值为1的Integer对象,如果找到了就直接拿来用,没有才会创建新的,所以 这里 i1 和i2指向了同一个对象,故System.out.println(i1 == i2); 为true, 如果你在后边再创建i5, i6,i7,i8。。。创建多少个,它都指向这一个对象,他们进行==运算结果都是true
当你定义i3 = 128时,编译器发现他不在-128~127这个范围内,因此就会直接new一个新的Integer对象出来,同理定义i4 = 128时也一样,所以 i3 == i4运算结果为false
这样做的目的是节省空间提高程序运行效率
题外话:如果想比较值的话 用i3.intValue() == i4.intValue() 这样结果是true |
|
|
|
|