int integer 的区别

来源:互联网 发布:红痘印 知乎 编辑:程序博客网 时间:2024/06/03 16:41

今天来总结int integer 的区别 很基础的东西 不好的地方请大家指正。
说是总结 其实不如来说是当年面试埋下的坑 ,现在把这些坑深入的填一下 。

说起nt integer 的区别 很多人都会回答他们的定义 int是基本数据类型 integer 是包装类 int的初始值是0 integer 的初始值 是null 除了这些还有什么呢 很多人就不知道了

Integer是对象而int不是,内存的分配位置也不一样
Integer的属性和其他类一样的!在方法里都是引用传递,而原始类型是值传递!
int是为了兼容以前的编程语言使用的基本类型,目的是让程序效率更高,以为它是直接分配到栈上的。所以它不是对象,不能有类似 int.operation()的操作。

Integer是java中一切都是对象这个大前提下的int的包装类型,可以使用方法,是个对象,是用new分配到堆上的。

int是一种基本数据类型,而Integer是相应于int的类类型,称为对象包装。

实现这种对象包装的目的主要是因为类能够提供必要的方法,用于实现基本数据类型的数值与可打印字符串之间的转换,以及一些其他的实用程序方法;

另外,有些数据结构库类只能操作对象,而不支持基本数据类型的变量,包装类提供一种便利的方式,能够把基本数据类型转换成等价的对象,从而可以利用数据结构库类进行处理。

接下来我们我们看一下他们之间的比较

    Integer a = 1000, b = 1000;    System.out.println(a == b);// false    Integer c = 127, d = 127;    System.out.println(c == d);// true    int i = 1;    Integer integer = new Integer(1);// Integer 当作一个对象    Integer integer2 = 1;// 实际编译为 Integer.valueOf(1)    System.out.println("i == integer:" + (i == integer));// true    System.out.println("i == integer2:" + (i == integer2));// true    System.out.println("integer == integer2:" + (integer2 == integer));// false

我们先来说一个有趣的问题 在前四行代码中 我们可以看到 同样是一个Integer 变量的比较 为什么第一个为false 第二个为true 在JVM编译的时候Integer a = 1000 他会编译为Integer.valueOf(10000) 我们看一下valueOf()的源码

     public static Integer valueOf(int i) {            if (i >= IntegerCache.low && i <= IntegerCache.high)              return IntegerCache.cache[i + (-IntegerCache.low)];             return new Integer(i);          }

看一下源码大家都会明白,对于-128到127之间的数,会进行缓存 所以 Integer c = 127,会缓存 Id = 127;会直接从缓存中取出来 所有他们的内存地址是一样的
接着
System.out.println(“i == integer:” + (i == integer));// true
System.out.println(“i == integer2:” + (i == integer2));// true
这俩比较时都为true 是因为在jdk 1.5以上时 int 和integer比较的时候会执行一个拆箱操作 所有比较时都为true
System.out.println(“integer == integer2:” + (integer2 == integer));// false
这俩在比较的时候Integer integer = new Integer(1) 为对象 其引用指向堆中 而Integer integer2 = 1; 会存放到栈的常量池 中 所有内存地址不相等

在说下int integer的使用场景

Integer 的默认值是null
int 的默认值 是 0

例如 一个人 的成绩,
如果用 int 来保存,没有赋值的 情况下 那 他的成绩 就是 0分
如果用 Integer 来保存, 没有赋值的情况 就是 null, 表示没有 没有 输入 成绩.

所以 在区分是否有初始值时 我们可以使用Integer 比如 id 没有获取到的时候为null 而不是0

0 0
原创粉丝点击