浅谈 Integer 类

  突然发现自己对Integer i = 10;这种语法不太明白,于是乎有了这篇文章,那么在讲解 Integer 之前,我们先看下面这段代码:

public static void main(String[] args) {
	Integer i = 10;
    Integer j = 10;
    System.out.println(i == j);
     
    Integer a = 128;
    Integer b = 128;
    System.out.println(a == b);
    
    int k = 10;
    System.out.println(k == i);
    int kk = 128;
    System.out.println(kk == a);
     
    Integer m = new Integer(10);
    Integer n = new Integer(10);
    System.out.println(m == n);
}

  大家可以先思考一下结果是什么?

  答案是:

  至于为什么是这个结果,下面我们来一一介绍。

1、Integer 类简介

  首先我们大致看一下Integer是什么,Integer 类在JDK1.0的时候就有了,它是一个类,是 int 基本数据类型的封装类。

基本API如下:

  图片引用:http://blog.csdn.net/litong09282039/article/details/46309541

2、Integer 类和 int 的区别

  ①、Integer 是 int 包装类,int 是八大基本数据类型之一(byte,char,short,int,long,float,double,boolean)

  ②、Integer 是类,默认值为null,int是基本数据类型,默认值为0;

  ③、Integer 表示的是对象,用一个引用指向这个对象,而int是基本数据类型,直接存储数值。

3、Integer 的自动拆箱和装箱

  自动拆箱和自动装箱是 JDK1.5 以后才有的功能,也就是java当中众多的语法糖之一,它的执行是在编译期,会根据代码的语法,在生成class文件的时候,决定是否进行拆箱和装箱动作。

  ①、自动装箱

  一般我们创建一个类的时候是通过new关键字,比如:

Object obj = new Object();

  但是对于 Integer 类,我们却可以这样:

Integer a = 128;

  为什么可以这样,通过反编译工具,我们可以看到,生成的class文件是:

Integer a = Integer.valueOf(128);

  这就是基本数据类型的自动装箱,128是基本数据类型,然后被解析成Integer类。

  ②、自动拆箱

  我们将 Integer 类表示的数据赋值给基本数据类型int,就执行了自动拆箱。

Integer a = new Integer(128);
int m = a;

  反编译生成的class文件:

Integer a = new Integer(128);
int m = a.intValue();

  简单来讲:自动装箱就是Integer.valueOf(int i);自动拆箱就是 i.intValue();

4、回顾开头的问题

public static void main(String[] args) {
	Integer i = 10;
    Integer j = 10;
    System.out.println(i == j);
     
    Integer a = 128;
    Integer b = 128;
    System.out.println(a == b);
    
    int k = 10;
    System.out.println(k == i);
    int kk = 128;
    System.out.println(kk == a);
     
    Integer m = new Integer(10);
    Integer n = new Integer(10);
    System.out.println(m == n);
}

  我们使用反编译工具Jad,得到的代码如下:

	public static void main(String args[])
	{
		Integer i = Integer.valueOf(10);
		Integer j = Integer.valueOf(10);
		System.out.println(i == j);
		Integer a = Integer.valueOf(128);
		Integer b = Integer.valueOf(128);
		System.out.println(a == b);
		int k = 10;
		System.out.println(k == i.intValue());
		int kk = 128;
		System.out.println(kk == a.intValue());
		Integer m = new Integer(10);
		Integer n = new Integer(10);
		System.out.println(m == n);
	}

  打印结果为:

  首先,直接声明Integer i = 10,会自动装箱变为Integer i = Integer.valueOf(10);Integer i 会自动拆箱为 i.intValue()。

  ①、第一个打印结果为 true

  对于 i == j ,我们知道这是两个Integer类,他们比较应该是用equals,这里用==比较的是地址,那么结果肯定为false,但是实际上结果为true,这是为什么?

  我们进入到Integer 类的valueOf()方法:

  分析源码我们可以知道在 i >= -128 并且 i <= 127 的时候,第一次声明会将 i 的值放入缓存中,第二次直接取缓存里面的数据,而不是重新创建一个Ingeter 对象。那么第一个打印结果因为 i = 10 在缓存表示范围内,所以为 true。

  ②、第二个打印结果为 false

  从上面的分析我们知道,128是不在-128到127之间的,所以第一次创建对象的时候没有缓存,第二次创建了一个新的Integer对象。故打印结果为false

  ③、第三个打印结果为 true

  Integer 的自动拆箱功能,也就是比较两个基本数据类型,结果当然为true

  ④、第四个打印结果为 true

  解释和第三个一样。int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比较。

  ⑤、第五个打印结果为 false

  因为这个虽然值为10,但是我们都是通过 new 关键字来创建的两个对象,是不存在缓存的概念的。两个用new关键字创建的对象用 == 进行比较,结果当然为 false。 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏史上最简单的Spring Cloud教程

深入理解Eureka之源码解析

Eureka的一些概念 Register:服务注册 当Eureka客户端向Eureka Server注册时,它提供自身的元数据,比如IP地址、端口,运行状况...

40780
来自专栏互联网研发闲思录

一个线上缓存异常

  最近线上应用发现了一个问题,系统启动构建缓存会出现缓存数据为空的情况,仔细分析整个流程 ,开始以为是代码疏忽导致bug,后来在仔细分析整个流程发现是由于a缓...

21600
来自专栏遊俠扎彪

Linux操作系统中删除ARP缓存的命令

在Windows下,使用比较多的两个操作ARP缓存的命令是arp -a和arp -d,前者是查看所有ARP条目,后者是删除所有ARP条目。

56590
来自专栏梦里茶室

【Chromium中文文档】沙箱FAQ

什么是沙箱? 沙箱是一个允许沙箱进程创建的C++库,沙箱进程是一种运行在非常限制性的环境中的进程。沙箱进程可以唯一自由使用的资源是CPU周期和内存。例如,沙箱进...

267100
来自专栏西安-晁州

beego中orm关联查询使用解析

这两天在学习beego框架,之前学习的时候遗漏了很多东西,比如orm、缓存、应用监控、模板处理等,这里将通过实例记录下如何使用beego自带的orm进行关联查询...

60000
来自专栏西安-晁州

rabbitmq消息队列——"发布订阅"

三、”发布订阅” 上一节的练习中我们创建了一个工作队列。队列中的每条消息都会被发送至一个工作进程。这节,我们将做些完全不同的事情——我们将发送单个消息发送至多个...

23400
来自专栏李鹏的专栏

亿级流量电商详情页系统的大型高并发与高可用缓存架构实战

对于高并发的场景来说,比如电商类,o2o,门户,等等互联网类的项目,缓存技术是Java项目中最常见的一种应用技术。然而,行业里很多朋友对缓存技术的了解与掌握,仅...

79620
来自专栏韩伟的专栏

高性能服务器架构思路:缓冲清理策略(二)

虽然使用缓存思想似乎是一个很简单的事情,但是缓存机制却有一个核心的难点,就是——缓存清理。我们所说的缓存,都是保存一些数据,但是这些数据往往是会变化的,我们要针...

9.4K00
来自专栏腾讯IVWEB团队的专栏

谷歌都在用 PWA 你还不用?

PWA 全称是 Progressive Web Apps。它的目的就是让你的网页越来越快。主要内容可以参考:PWA-cookbook。不过,它上手的难度也是有的...

58600
来自专栏韩伟的专栏

高性能服务器架构思路:缓冲策略 (一)

在服务器端程序开发领域,性能问题一直是备受关注的重点。然而,服务器端程序在性能问题上应该有何种基本思路,这个却很少被这些项目的文档提及。本文正式希望介绍服务器端...

5.8K00

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励