先看一个例子:
public class test { public static void main(String args[]){ Integer c1 = 1; Integer d1 = 1; int c2 = 1; int d2 = 1; Integer c3 = 300; Integer d3 = 300; int c4 = 300; int d4 = 300; System.out.println(c1==d1); System.out.println(c2==d2); System.out.println(c3==d3); System.out.println(c4==d4); } }
输出结果
import java.io.PrintStream; public class test { public static void main(String[] paramArrayOfString) { Integer localInteger1 = Integer.valueOf(1); Integer localInteger2 = Integer.valueOf(1); int i = 1; int j = 1; Integer localInteger3 = Integer.valueOf(300); Integer localInteger4 = Integer.valueOf(300); int k = 300; int m = 300; System.out.println(localInteger1 == localInteger2); System.out.println(i == j); System.out.println(localInteger3 == localInteger4); System.out.println(k == m); } }
public static Integer valueOf(int i) { if(i >= -128 && i <= IntegerCache.high) return IntegerCache.cache[i + 128]; else return new Integer(i); }也就是当数字大于-128小于IntegerCache.high时直接从IntegerCache中取值,当超出这个范围的时候就会新建一个对象
看一个最基本的
例如:
Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。
也就是说如果有这样的代码:
Integer a1 = new Integer(1); Integer a2 = new Integer(1); Integer a3 = new Integer(1); Integer a4 = new Integer(1); Integer a5 = new Integer(1);
假如一个变量需要1k的存储空间一个new Integer也需要1k的存储空间(当然,实际没这么大),那么总共需要10k的存储空间,但是当将1缓存到内存中时,将a1、a2、 a3 、a4、 a5都指向这个1,也就是只需要6k的存储空间,这样就节约了内存。而且新建对象也需要花费时间,所以这样的优化节约了空间和时间。
-128<=i<=127只是JDK的默认范围,当然可以自己将IntegerCache设置大一些。
像字符串常量池和LongCache等都有类似的优化思想。
由于==比较的是引用,所以当数字在-128<=i<=127范围之内时,指向的是同一个地方,返回true;当数字在范围之外时,每次都新建一个对象,指向的是不同的地方,所以返回false。
但是当类型时int时,无论什么数字都返回true。
如果把Java内存简单的区分为堆内存(Heap)和栈内存(Stack),实际中的区域远比这种观点复杂,所指的“栈”就是VM栈中各个帧的本地变量表部分。本地变量表存放了编译期可知的各种标量类型(boolean、byte、char、short、int、float、long、double)、对象引用(不是对象本身,仅仅是一个引用指针)、方法返回地址等。
当
int a1 = 300; int a2 = 300; int a3 = 300; int a4 = 300;
时,并不会创建对象,只会在栈中存放a.b c.d四个变量,和一个数字300。所以无论为1还是300,int时用等于比较都会相等。
另外看如下的代码:
public class test { public static void main(String args[]){ Integer c1 = 1; int d1 = 1; Integer c2 = 300; int d2 = 300; System.out.println(c1==d1); System.out.println(c2==d2); } }
输出结果为
true
true
反编译之后可以看到如下代码:
import java.io.PrintStream; public class test { public static void main(String[] paramArrayOfString) { Integer localInteger1 = Integer.valueOf(1); int i = 1; Integer localInteger2 = Integer.valueOf(300); int j = 300; System.out.println(localInteger1.intValue() == i); System.out.println(localInteger2.intValue() == j); } }
也就是Intger和int比较时,会调用Intger.intValue() 方法,所以Intger和int用==比较时,会一直相等。
但是,并不推荐用==比较两个不同的类型。
相关推荐
在Java编程语言中,`int`和`Integer`都是用于表示整数值的数据类型,但它们之间存在着显著的差异。理解这些区别对于编写高效且优化的Java代码至关重要。 首先,`int`是Java中的原始数据类型(Primitive Type),它...
在Java编程语言中,`int`和`Integer`都是用于表示整数值的数据类型,但它们之间存在着显著的差异。理解这些区别对于编写高效且优化的Java代码至关重要。 首先,`int`是Java中的原始数据类型之一,它直接存储在栈...
Java 中 int 和 Integer 的区别 Java 中的数据类型可以分为基本数据类型和复杂数据类型,int 是基本类型,而 Integer 是一个类。下面是它们之间的主要区别: 1. 数据类型 int 是基本数据类型,直接存储数值,而 ...
Java 中 int 和 Integer 的区别 在 Java 编程语言中,int 和 Integer 是两种不同的数据类型,虽然它们看起来很相似,但它们有着根本的区别。下面我们将详细探讨这两种数据类型的差异。 基本类型 vs 复杂数据类型 ...
【标题】:“第7讲 int和Integer有什么区别1” 【描述】:“1. 理解自动装箱、拆箱2. 源码分析3. 原始类型线程安全” 【标签】:“java 数学” 【正文】: 在Java编程中,`int`和`Integer`是两种不同的数据类型,...
本文将深入探讨Java中的int基本数据类型和Integer封装类型之间的差异。 1. 类型区别: - int是Java的八种基本数据类型之一,属于原始类型(Primitive Type),它直接存储整数值,没有对象的概念。int的默认值是0。...
Java 中 int 和 Integer 的区别 Java 作为一门面向对象的编程语言,具有两种基本数据类型:基本数据类型(primitive type)和引用类型(reference type)。在 Java 中,基本数据类型只有八个:boolean、char、byte...
本篇文章将深入探讨Java中的基本类型,特别是`int`和`Integer`的区别。 1. 基本类型: - 实数:`double`和`float`。`double`使用8个字节存储,遵循IEEE 754双精度标准,范围广泛。`float`使用4个字节,遵循单精度...
int与integer的区别从大的方面来说是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1.Java 中的数据类型分为基本数据类型和复杂数据类型 int 是...
首先,我们要理解Java中的基本类型int和引用类型Integer的区别。int是Java的基本数据类型,它占用32位存储空间,直接存储数值,而Integer是int的包装类,是一个对象,它包含一个int类型的成员变量。在Java中,对象的...
在Java编程语言中,`Integer`和`int`是两种不同的数据类型,它们在使用上有一些关键的区别。首先,`int`是Java的八种原始数据类型之一,它用来存储整数值,如-2147483648到2147483647之间的数字。`int`变量的默认值...
Java 中 int 和 Integer 的区别 Java 中的 int 和 Integer 是两个不同的概念,都是表示整数类型,但是它们有着不同的特性和用途。本文将详细介绍 Java 中 int 和 Integer 的区别。 1. 数据类型 int 是 Java 中的...
在Java编程语言中,`int` 和 `Integer` 是两种截然不同的数据类型,它们各自具有独特的特性和用途。理解这两者之间的差异对于编写高效、可靠的代码至关重要。 首先,`int` 是Java中的一个基本数据类型,它代表整数...
举例分析 equals 和 hashcode 方法,hashcode应该怎么样生成 8个基本类型与基本对象的比较:byte与Byte shot与Short int与Integer long与Long float与Float double与Double char与Character
在Java编程语言中,`int` 和 `Integer` 都是用来表示整数的,但它们在性质和使用场景上有着显著的区别。理解这两者之间的差异对于编写高效且符合Java语法规则的代码至关重要。 首先,`int` 是Java中的一个基本数据...
在Java编程语言中,`int`和`Integer`虽然都用于表示数值,但它们之间存在着显著的区别。`int`是Java中的一个基本数据类型,而`Integer`是`int`的包装类,属于引用数据类型。下面是这两个概念的详细解析: 1. **基本...
在Java编程语言中,将`Integer`对象转换为基本数据类型`int`有两种常见的方法:`Integer.parseInt()`和`Integer.valueOf()`。理解这两种方法的区别和应用场景对于编写高效且正确的Java代码至关重要。 首先,我们来...
在使用Mybatis进行数据操作时,有时可能会遇到返回`int`或`Integer`类型时出现异常的情况。这种问题通常出现在当Mapper方法试图返回一个可能是`null`的结果,但方法声明的返回类型是基本类型`int`时。由于基本类型不...