java面试题之int和Integer的区别

int和Integer的区别

1、Integer是int的包装类,int则是java的一种基本数据类型 
2、Integer变量必须实例化后才能使用,而int变量不需要 
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 
4、Integer的默认值是null,int的默认值是0

延伸: 
关于Integer和int的比较 
1、由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址不同)。

Integer i = new Integer(100);
Integer j = new Integer(100);
System.out.print(i == j); //false

2、Integer变量和int变量比较时,只要两个变量的值是向等的,则结果为true(因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较)

Integer i = new Integer(100);
int j = 100;
System.out.print(i == j); //true

3、非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。(因为非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同)

Integer i = new Integer(100);
Integer j = 100;
System.out.print(i == j); //false

4、对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false

Integer i = 100;
Integer j = 100;
System.out.print(i == j); //true
Integer i = 128;
Integer j = 128;
System.out.print(i == j); //false

对于第4条的原因: 
java在编译Integer i = 100 ;时,会翻译成为Integer i = Integer.valueOf(100);,而java API中对Integer类型的valueOf的定义如下:

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

java对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了

 

简述:int与Integer的区别:

对于它们,我们可能只是知道简单的区别。Integer是int的一个封装类,int的初始值为0,而Integer的初始值为null。但是他们之间真的仅仅只有这些区别吗?我觉得答案是否定的,于是我决定深入到jdk源码中一探究竟。看看Integer与int到底有什么区别。

 

执行代码:

复制代码
 1 public class IntegerTest {
 2 
 3     public static void main(String[] args) {
 4         // TODO Auto-generated method stub
 5         int intNum = 127;
 6         Integer integerNum = 127;
 7         Integer integerNewNum = new Integer(127);
 8         
 9         //比较两个int变量
10         int intNum1 = 127;
11         System.out.print("int与int:");
12         System.out.println(intNum==intNum1);
13                 
14         
15         //比较int与Integer区别
16         System.out.print("int与Integer:");
17         System.out.println(intNum==integerNum);
18         
19         //比较int与Integer区别
20         System.out.print("int与NewInteger:");
21         System.out.println(intNum==integerNewNum);
22         
23         //比较Integer与NewInteger
24         System.out.print("Integer与NewInteger:");
25         System.out.println(integerNum==integerNewNum);
26                 
27         //比较两个NewInteger
28         Integer integerNewNum1 = new Integer(127);
29         System.out.print("NewInteger与NewInteger:");
30         System.out.println(integerNewNum==integerNewNum1);
31                 
32         //比较两个小于128的声明变量
33         Integer integerNum1 = 127;
34         System.out.print("小于128的Integer与Integer:");
35         System.out.println(integerNum==integerNum1);
36         
37         //比较两个大于等于128的声明变量
38         Integer integerNum2 = 128;
39         Integer integerNum3 = 128;
40         System.out.print("大于等于128的Integer与Integer:");
41         System.out.println(integerNum2==integerNum3);
42         
43     }
44 
45 }
复制代码

 

 

运行结果:

复制代码
int与Integer:true
int与NewInteger:true
Integer与NewInteger:false
int与int:true
NewInteger与NewInteger:false
小于128的Integer与Integer:true
大于等于128的Integer与Integer:false
复制代码

 

问题:

1.为什么当我们使用数值相等的integerNum、integerNewNum与intNum比较时结果为true?

2.为什么当我们使用数值相等的integerNum与integerNewNum进行比较时结果为false?

3.为什么integerNum与integerNum进行比较时会出现大于128和小于等于128不同结果的情况?

 

我的理解:

一下所有讨论问题的前提是:两个int型变量所赋值的数值相同时,比较结果为true,即12行的结果。

1.17行与21行所得到的结果为true,其实我们如果我们从源码来理解就会知道其本质了。在此之前我们应该先补充一个感念,Integer integerNum =127在执行时会被翻译成

Integer integerNum = Integer.valueOf(127)。源码如下

 

复制代码
1 public static Integer valueOf(String arg) throws NumberFormatException {
2         return valueOf(parseInt(arg, 10));
3     }
4 
5     public static Integer valueOf(int arg) {
6         return arg >= -128 && arg <= Integer.IntegerCache.high ? Integer.IntegerCache.cache[arg + 128]
7                 : new Integer(arg);
8     }
复制代码
复制代码
 1 private static class IntegerCache {
 2         static final int low = -128;
 3         static final int high;
 4         static final Integer[] cache;
 5 
 6         static {
 7             int arg = 127;
 8             String arg0 = VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
 9             int arg1;
10             if (arg0 != null) {
11                 try {
12                     arg1 = Integer.parseInt(arg0);
13                     arg1 = Math.max(arg1, 127);
14                     arg = Math.min(arg1, 2147483518);
15                 } catch (NumberFormatException arg3) {
16                     ;
17                 }
18             }
19 
20             high = arg;
21             cache = new Integer[high - -128 + 1];
22             arg1 = -128;
23 
24             for (int arg2 = 0; arg2 < cache.length; ++arg2) {
25                 cache[arg2] = new Integer(arg1++);
26             }
27 
28             assert high >= 127;
29 
30         }
31     }
复制代码
复制代码
1 private final int value;
2 public Integer(int arg0) {
3         this.value = arg0;
4     }
5 
6     public Integer(String arg0) throws NumberFormatException {
7         this.value = parseInt(arg0, 10);
8     }
复制代码

 

以上jdk源码可以得到,Integer 无论是声明还是新建对象,最终所得的值都是int型,所以我们问题1就等到了答案。两个int型比较所得结果必然是ture.

 

2.25行所得结果为false,为什么呢?不是都转成int型嘛?结果不是应该为false嘛?额额额额。new了地址就不一样了所以当我们使用"=="进行比较时尽管数值相同,但内存地址却早已不相同。这就涉及到了下一篇博文中会讲的"=="与".equals"的区别。

 

3.为什么会出现问题3这种情况,128会是一个零界点呢?其实答案在源码中我们也可以找到

复制代码
1 public static Integer valueOf(String arg) throws NumberFormatException {
2         return valueOf(parseInt(arg, 10));
3     }
4 
5     public static Integer valueOf(int arg) {
6         return arg >= -128 && arg <= Integer.IntegerCache.high ? Integer.IntegerCache.cache[arg + 128]
7                 : new Integer(arg);
8     }
复制代码

当arg大于等于-128且小于等于127时则直接从缓存中返回一个已经存在的对象。如果参数的值不在这个范围内,则new一个Integer对象返回。

 

以上就是int与Integer的区别,我们再日常的项目或者练习中经常拿不准该使用int还是Integer,但看了这篇博文你应该已经有了自己的答案了吧!

 

转载于:https://www.cnblogs.com/aspirant/p/10189604.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java基础笔试面试题以及答案 1. 什么是Java语言的特点? 答:Java语言的特点是简单易学、面向对象、平台无关性、可靠性、安全性等。 2. 什么是Java虚拟机(JVM)? 答:Java虚拟机是一个能够执行Java字节码的虚拟计算机,能够将Java字节码转换为底层操作系统能够识别的二进制码执行。 3. 什么是Java的静态绑定和动态绑定? 答:Java的静态绑定在编译期确定,是通过对象的引用类型或参数类型确定方法的调用。Java的动态绑定在运行期确定,是通过对象的实际类型确定方法的调用。 4. 什么是自动装箱和拆箱? 答:自动装箱是指将基本类型自动转换为对应的包装类类型,例如int转换为Integer。拆箱则是将包装类类型自动转换为对应的基本类型,例如Integer转换为int。 5. 什么是Java的反射机制? 答:Java的反射机制是指在运行时对类的属性、方法等进行分析的能力。通过反射可以在程序运行时动态加载类、创建对象、调用方法等。 6. 什么是Java的异常处理机制? 答:Java的异常处理机制是指在程序运行时遇到错误或异常时捕获错误信息并进行处理的能力。通过try-catch-finally语句块可以捕获异常,并在finally块中进行清理操作。 7. 什么是Java的多线程? 答:Java的多线程是指在同一个程序中同时执行多个线程,每个线程独立运行并可以互相通信。Java的多线程通过继承Thread类或实现Runnable接口来实现。 8. 什么是Java的集合框架? 答:Java的集合框架是一组接口、类和算法,用于存储、处理和搜索对象的集合。Java的集合框架分为List、Set、Queue和Map等不同类型的集合类。 9. 什么是Java的注解? 答:Java的注解是一种程序中的元数据,用于为程序元素(例如类、方法、字段等)添加额外的信息和标记。Java的注解是通过@符号和注解名来使用的。 10. 什么是Java的泛型? 答:Java的泛型是指在编译期间不需要指定具体类型的能力,可以编写适用于多种类型的代码。Java的泛型可以通过类型参数来实现,例如List<T>表示一种类型为T的List集合类。 ### 回答2: Java 是目前应用最广泛的编程语言之一,因此 Java 基础知识的考核在招聘面试中是非常重要的一个环节。下面介绍一些常见的 Java 基础笔试面试题及其答案。 1. Java 中的基本数据类型有哪些? Java 中的基本数据类型包括 byte、short、int、long、float、double、char、boolean 等 8 种基本数据类型。 2. String 和 StringBuffer 的区别是什么? String 类是不可变的对象,即一旦创建后其值就不能被修改。而 StringBuffer 类是可变的对象,可以在原有对象的基础上进行修改。 3. Java 中的四种访问修饰符是什么? Java 中的四种访问修饰符分别为 public、protected、default 和 private。 public 修饰符可以被任何类访问,protected 修饰符只能被本身类及其子类和同一包中的类访问,default(即不写修饰符)修饰符只能被同一包中的类访问,private 修饰符只能被本身类访问。 4. static 关键字是什么意思? static 是一种修饰符,可以修饰变量、方法和类。当 static 修饰变量时,表示该变量是类变量,所有该类的实例共享该变量,可以通过类名和实例访问;当 static 修饰方法时,表示该方法是类方法,可以直接通过类名调用,不需要实例化;当 static 修饰类时,表示该类是静态内部类。 5. Java 中的重载和重写有什么区别? 重载(overload)是指在同一个类中,允许定义多个同名的方法,只需更改方法的参数即可,但返回类型可以相同也可以不同,编译器会根据传入的参数类型和数量来判断需要调用哪个方法;重写(override)是指子类实现了父类中的同名方法,实现方式和参数必须完全一样,但返回类型可以相同也可以是父类方法返回类型的子类型。 以上是常见的一些 Java 基础笔试面试题及其答案,希望能对大家有所帮助。 ### 回答3: Java是目前世界上应用最广泛的编程语言之一,它具有可靠性高、移植性强、安全性好、易于学习和使用等特点。在Java的学习过程中,基础知识扎实是非常关键的,下面就一些常见的Java基础笔试面试题做一个简单的讲解。 一、Java中的常用注释方式有哪些? Java中常见的注释方式有三种,分别是单行注释、多行注释和文档注释。 //单行注释 /*多行注释*/ /** 文档注释 */ 二、Java中的变量类型分为哪几种? Java中的变量类型包括基本数据类型和引用数据类型两种。 1.基本数据类型: byte,short,int,long,float,double,char,boolean。 2.引用数据类型: 数组、类和接口。 三、Java中的访问修饰符有哪些? Java中的访问修饰符包括public、protected、private和default四种。 1.public:公共访问,任何地方都可以访问。 2.protected:受保护的访问,同一包内和子类可以访问。 3.private:私有访问,只有本类可以访问。 4.default:缺省访问(即不加访问修饰符),同一包内可以访问。 四、Java中的多态性是什么? Java中的多态性是指一个类型的实例在不同的情况下表现出不同的行为。Java中的多态性主要体现在方法的重载(Overloading)和方法的重写(Overriding)上。 1.方法的重载:指在一个类中定义多个同名方法,但参数的个数、类型或顺序不同。 2.方法的重写:指在子类中重写父类的方法,方法名、参数类型和返回值类型必须与父类中的方法相同。 五、Java中的类和对象的关系是什么? Java中类定义了对象的特征和行为,对象是类的一个实例,可以通过new关键字创建一个对象。类中的属性和方法可以被对象所访问和调用。类用来定义对象的共性,而对象用来表示现实世界中具体的事物。 以上就是关于Java基础常见的笔试面试题以及答案。当然,在学习Java中不光局限于这些基础知识点,还需要注意编译原理、JVM内存管理、并发编程等其他方面的知识点。总之,通过大量的实践和练习,才能真正理解和掌握Java这门编程语言。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值