为了账号安全,请及时绑定邮箱和手机立即绑定

下面这图里,最后一段话,看不懂啊,大神打点代码演示看看啊

下面这图里,最后一段话,看不懂啊,大神打点代码演示看看啊

fenkapian 2017-04-09 20:10:04
java的八种基本类型(Byte  Short、Integer、Long、Character、Boolean、Float、Double),除Float及Double意外,其它六种都实现了常量池, 但是他们只在大于等于-128且小于等于127时才能使用常量池,如果不在此范围内,则会new一个出来,保存在堆内存中。
查看完整描述

1 回答

已采纳
?
frece

TA贡献36条经验 获得超15个赞

常量池你可以理解成 一块内存空间,

说明一个知识点, == 这个运算符号,如果a == b 是true的话,说明 a和b指向的同一个对象,两个对象不相等的话他们运行 == 运行结果一定是false(注意是对象不相等不是值不相等)

下面 上代码:

public class Test {
	public static void main(String[] args) {
		Integer i1 = 1;
		Integer i2 = 1;	//i2在-128~127 直间,等价于 i2 = i1
		System.out.println(i1 == i2);
		/**
		 * 输出结果 true
		 */
		Integer i3 = 128; // i3 不在-128~127 直间,等价于 i3 = new Integer(128);
		Integer i4 = 128;//  i4 不在-128~127 直间,等价于 i4 = new Integer(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

查看完整回答
反对 回复 2017-04-19
  • fenkapian
    fenkapian
    非常感谢
  • fenkapian
    fenkapian
    等等,为什么非得在-128-127呢,这不是byte的范围吗,int的范围不是21亿多吗
  • frece
    frece
    并不是他范围多大就设置多大,常量池这个东西创建出来是为了节省空间的,即便是-128~127的这个范围,他也能存256个数字,你像其他的Short,Long也要分配一部分内存,还有String也有常量池,如果范围太大的话,那不就失去了“节省内存”的意义了吗?
  • 1 回答
  • 0 关注
  • 1234 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信