文档章节

java-基础入门-自动装箱与自动拆箱留给我们的坑

raylee2015
 raylee2015
发布于 2015/08/24 14:39
字数 600
阅读 3
收藏 0

其实,java在自动装箱和自动拆箱的过程里面,留了不少的坑给我们,我们下面将以integer这个类为基础讨论一下

其实这里面主要涉及的是两点

1.当使用Integer x=1,这样的方式来赋值的时候,其实,编译器当那个1是String,然后需要通过valueof的方法转换过来,但是在转换的过程中,他为了优化速度,使用了我们所不知道的缓存,因为在这里会出现一些坑

2.Integer类里面重写了equals方法,里面不但对比对象,而且还对比里面的值


下面先上代码:(请仔细观看注释,里面已经提供了上面所述两个方法的源码)

package com.ray.object;

/**
 * 自动装箱与自动拆箱的坑
 * 
 * @author ray
 * @since 2015-05-04
 * @version 1.0
 * 
 */
public class Test {

	public static void main(String[] args) {
		// 其实下面这几句后面的赋值1,1,1000,1000,都被当做是string,
		// 然后通过Integer.valueOf()这个方法转换过来,
		// 我们下面来看看Integer.valueOf()这个方法的源码
		// public static Integer valueOf(int i) {
		// if(i >= -128 && i <= IntegerCache.high)
		// return IntegerCache.cache[i + 128];
		// else
		// return new Integer(i);
		// }
		// 在源码里面其实是缓存了一部分数据,是-128-127
		// 因此,在a==b是返回true
		// c==d是返回false
		Integer a = 1;
		Integer b = 1;
		Integer c = 1000;
		Integer d = 1000;
		System.out.println("a == b ---- " + (a == b));// true
		System.out.println("c == d ---- " + (c == d));// false
		// 这下面是构造4个integer的对象出来
		Integer a_1 = new Integer(1);
		Integer b_1 = new Integer(1);
		Integer c_1 = new Integer(1000);
		Integer d_1 = new Integer(1000);
		// 下面两句是通过==对比对象,当然是false了
		System.out.println("a_1 == b_1 ---- " + (a_1 == b_1));// false
		System.out.println("c_1 == d_1 ---- " + (c_1 == d_1));// false
		// 下面两句是通过equals对比对象,integer类里面重写了equals方法
		// 看看重写后equals方法的代码
		// public boolean equals(Object obj) {
		// if (obj instanceof Integer) {
		// return value == ((Integer)obj).intValue();
		// }
		// return false;
		// }
		// 我们可以看到出来对比对象之外,还对比本身的值,所以返回true
		System.out.println("a_1.equals(b_1) ---- " + a_1.equals(b_1));// true
		System.out.println("c_1.equals(d_1) ---- " + c_1.equals(d_1));// true
	}
}



输出:

a == b ---- true
c == d ---- false
a_1 == b_1 ---- false
c_1 == d_1 ---- false
a_1.equals(b_1) ---- true
c_1.equals(d_1) ---- true




版权声明:本文为博主原创文章,未经博主允许不得转载。

© 著作权归作者所有

raylee2015
粉丝 6
博文 265
码字总数 44224
作品 0
江门
私信 提问
深入浅出 Java 中的包装类

前阵子,我们分享了《Java中的基本数据类型转换》这篇文章,对许多粉丝还是有带来帮助的,今天讲一下 Java 包装类的的由来,及自动装箱、拆箱的概念和原理。 什么是包装类型 Java 设计当初就...

Java技术栈
2018/09/14
0
0
Java自动装箱与拆箱及其陷阱

在本文中,笔者向大家介绍下Java中一个非常重要也非常有趣的特性,就是自动装箱与拆箱,并从源码中解读自动装箱与拆箱的原理,同时这种特性也留有一个陷阱。开发者如果不注意,就会很容易跌入...

LCZ777
2014/07/26
30
0
java核心基础 --- 基本数据类型

本篇博文主要介绍 java 基础数据类型、基本类型的数据转换、自动装箱拆箱机制。 1. 基础数据类型 整型 整型包含 byte(1字节)、short(2字节)、int(4字节)、long(8字节) 需要注意的是,...

firepation
01/24
58
0
Java自动装箱-拆箱机制究竟是什么

支持原文:http://tryenough.com/java-autobox 自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象。 什么是自动装箱和拆箱 自动装箱就是Java自动将原始类型值转...

TryEnough
03/13
0
0
Java 自动拆箱和自动装箱学习笔记

Java 自动拆箱和自动装箱学习笔记 详情参考以下 深入剖析Java中的装箱和拆箱 JDK自动拆箱下,三目运算符的潜规则 Java 自动装箱与拆箱的实现原理 Autoboxing and Unboxing 1. 概述 Java 中的...

等到烟火清凉_
2018/08/25
52
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx+tomcat配置https

1、nginx配置https和【proxy_set_header X-Forwarded-Proto $scheme;】 2、java代码: String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServe......

perofu
12分钟前
3
0
必看的Linux系统新手进阶老手心得

不知道从什么时候起,linux这个话题变得越来越普及,成为大家经常讨论的话题。无论在网络上还是实际生活中,竟然很多人都在纠结学习linux的问题。网络上给的答案千千万万,而却还有很多人踌躇...

Linux就该这么学
15分钟前
2
0
Spring Boot 配置元数据指南

1. 概览 在编写 Spring Boot 应用程序时,将配置属性映射到 Java bean 上是非常有用的。但是,记录这些属性的最好方法是什么呢? 在本教程中,我们将探讨 Spring Boot Configuration Proces...

liululee
18分钟前
2
0
foreach查找子类

$list = $menu_model -> menu_list();$parent_list = [];foreach ($list as $v){ if ($v['pid'] == 0) { $parent = $v; foreach ($list as $v1) ......

小小小壮
30分钟前
2
0
基于 HTML5 Canvas 实现的 TP-LINK 电信拓扑设备面板

前言 今天我们以真实的 TP-LINK 设备面板为模型,完成设备面板的搭建,和指示灯的闪烁和图元流动。 先来目睹下最终的实现效果:http://www.hightopo.com/demo/blog_tplink_20170511/index.h...

htdaydayup
36分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部