java 基本数据类型和其封装类你知多少?

/**
		 * 基本数据类型和其封装类你知多少?
		 * 一次调试bug让我发现这其中暗藏玄机。
		 * 故研究了一下:如果有不对的地方希望指教。
		 */

		System.out.println("----------- double /  vs / Double 比较 ----------------");
		double z = 1;
		Double zz = (double) 1; //与zzz只是写法不同 编译过程和结果是一样的
		Double zzz = 1D;
		Double zzzz = new Double(1);
		System.out.println(z == 1); // true
		System.out.println(zzz == 1); // true
		System.out.println(zzzz == 1); // true
		System.out.println(zz == z); // true
		System.out.println(zz == zzz); // false
		System.out.println(zz == zzzz); // false
		System.out.println(zzz == zzzz); // false
		System.out.println(zz.doubleValue() == zzz);// ture
		System.out.println(zzzz.doubleValue() == zzz);// ture
		
		/**
		 * 小结: 
		 * 封装类对象 跟数值或基本类型比较时:会自动拆箱,比较的是值! 
		 * 封装类对象 跟封装类对象比较时:比较的是内存地址!
		 */
		
		System.out.println("----------- long /  vs / Long  -127~127 比较----------------");
		
		long l = 127;
		Long ll = 127L;//与lll只是写法不同 编译过程和结果是一样的
		Long lll = (long)127;
		Long llll = new Long(127);
		System.out.println(l==ll);// ture
		System.out.println(l==lll);// ture
		System.out.println(l==llll);// ture
		System.out.println(ll==lll);// ture
		System.out.println(ll==llll);// false
		System.out.println(ll.longValue()==llll.longValue());// ture
		
		System.out.println("----------- long /  vs / Long  !(-127~127) 比较----------------");
		long c = 128;
		Long cc = 128L;
		Long ccc = (long)128;
		Long cccc = new Long(128);
		System.out.println(c==cc);// ture
		System.out.println(c==ccc);// ture
		System.out.println(c==cccc);// ture
		System.out.println(cc==ccc);// false
		System.out.println(cc==cccc);// false
		System.out.println(cc.longValue()==cccc.longValue());// ture
		
		/**
		 * 小结:
		 * 基本同double/Double类似:
		 * 不同地方在于:jvm会将-127~127的数字存在缓存中
		 * 当Long lll = (long)127;jvm实际执行的是 Long.valueOf(127);直接从缓存中获取
		 * 而Long ccc = (long)128;jvm实际执行的是 new Long(128);
		 * 
		 * (int 和 Integer) 比较完全与(long和Long比较)采取的机制相同
		 */
		

		System.out.println("----------- int /  vs / Integer  循环 ----------------");
		
		Long intStart = System.currentTimeMillis();
		int x = 0;
		for (int i = 0; i < 50000; i++) {
			x++;
		}
		System.out.println(System.currentTimeMillis()-intStart);// 1

		Long integerStart = System.currentTimeMillis();
		int y = 0;
		for (Integer i = 0; i < 50000; i++) {
			y++;
		}
		System.out.println(System.currentTimeMillis()-integerStart);// 6
		System.out.println("--------");
		Integer v = 1;
		System.out.println(v.hashCode());// 1
		v ++;
		System.out.println(v.hashCode());// 2
		Integer vv = new Integer(1);
		System.out.println(vv.hashCode());// 1
		vv ++;
		System.out.println(vv.hashCode());// 2
		/**
		 * 小结:
		 * Integer类似String一样重新赋值时需要重新开辟内存空间
		 * Double Long 等同
		 * 由于int double long 为基本数据类型 没相关查看内存地址变化的方法
		 * 不过从上面两个循环就可以看出差别
		 */
		String str = "";
		System.out.println(str.hashCode());//0
		str = "ss";
		System.out.println(str.hashCode());//3680
		
		StringBuilder sbuilder = new StringBuilder();
		System.out.println(sbuilder.hashCode());//33263331
		sbuilder.append("ss");
		System.out.println(sbuilder.hashCode());//33263331
</pre><pre code_snippet_id="1839669" snippet_file_name="blog_20160819_1_8315089" name="code" class="java"><pre name="code" class="java">		//比较大小时候
		Long l = 128L;
		Long ll = 121L;
		Long lll = 128L;
		System.out.println(l==ll);// false
		System.out.println(l.equals(lll));// true
		System.out.println(l.compareTo(ll));// 1
		System.out.println(l.compareTo(lll));// 0
		System.out.println(ll.compareTo(l));// -1


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值