integer使用==号比较的问题

这主要涉及Integer与int之间的自动拆装箱问题,==号的使用情况,

当Integer与Integer之间比较时,比较的是引用地址,但是具体还得看Integer是如何创建的,可能会发生自动拆装箱,

当int与int比较时,就是直接比较的字面量的值,

当int与Integer比较时,得看具体是如何创建的,可能会发生自动拆装箱,如以下几种经典情况:

Integer与Integer比较

Integer a = 1000,b=1000;
Integer c = 100,d=100;
System.out.println(a==b);
System.out.println(c==d); 

该题的答案并不是true,true,正确的答案应该是false,true。

我们知道==比较的是两个对象的引用,这里的abcd都是新建出来的对象,按理说都应该输入false才对。这就是这道题的有趣之处,无论是面试题还是论坛讨论区,这道题的出场率都很高。原理其实很简单,我们去看下Integer.java这个类就了然了。

public static Integer valueOf(int i) {
   return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
 }
  
 /**
  * A cache of instances used by {@link Integer#valueOf(int)} and auto-boxing
  */
 private static final Integer[] SMALL_VALUES = new Integer[256];
  
 static {
   for (int i = -128; i < 128; i++) {
     SMALL_VALUES[i + 128] = new Integer(i);
   }
 }

当我们声明一个Integer c = 100;的时候。此时会进行自动装箱操作,简单点说,也就是把基本数据类型转换成Integer对象,而转换成Integer对象正是调用的valueOf方法,可以看到,Integer中把-128-127 缓存了下来。官方解释是小的数字使用的频率比较高,所以为了优化性能,把这之间的数缓存了下来。这就是为什么这道题的答案回事false和ture了。当声明的Integer对象的值在-128-127之间的时候,引用的是同一个对象,所以结果是true。
 再看看下面的代码:

Integer与int比较

Integer a = new Integer(1000);
int b = 1000;
Integer c = new Integer(10);
Integer d = new Integer(10);
System.out.println(a == b);
System.out.println(c == d);

这道题是继上面的后续,如果这道题你能很快速的得出答案,那么恭喜你,==比较符你就算掌握的比较透彻了。
      揭晓正确答案: true  、false 。
      看到这个答案很多小伙伴又会不解,先来说下第二个,按上一题来说Integer不是把-128-127缓存起来了吗?这不是应该是true嘛,但是你仔细看,这里的Integer是我们自己new出来的,并不是用的缓存,所以结果是false。 现在来看第一个为啥又是true了呢? 首先这里的值为1000,肯定和我们所知的Integer缓存没有关系。既然和缓存没有关系,a是新new出来的对象,按理说输入应该是false才对。但是注意b这里是int类型。当int和Integer进行==比较的时候,Java会把Integer进行自动拆箱,也就是把Integer转成int类型,所以这里进行比较的是int类型的值,所以结果即为true。

汇总一下:

(1)int与int比较由于比较的字面量,始终是true

(2)int与Integer比较,由于integer会发生自动拆箱,始终是ture

(3)Integer与Integer比较:

       a、若两个都是new,始终都是false,

       b、若一个new,一个非new(包括字面量和Integer.valueOf()等),那么一个是自动装箱的对象,一个是new的对象,始终是false

      c、两个都不是new,都会发生自动装箱(调用 Integer.valueOf()自动装箱),就要看值的范围了,在-128-127之间,会取IntegerCache里的对象,这样就是true了,不在范围之间,就是false了

            

 

<think>好的,用户的问题是关于如何处理Java中Integer.parseInt方法可能引发的异常。我需要先回想一下这个方法可能抛出的异常类型。记得这个方法在转换字符串为整数时,如果字符串格式不正确,会抛出NumberFormatException。根据系统指令中的引用[^1],未检查异常是编译器不强制处理的,比如RuntimeException的子类,而NumberFormatException正是属于这个范畴。 首先,用户需要一个处理异常的示例。我应该展示基本的try-catch块的使用。然后可能需要提到如何避免异常,比如事先验证输入字符串是否符合数字格式。此外,可能还需要考虑输入字符串的范围问题,虽然parseInt本身会处理,但超出int范围时也会抛出异常,这时候可能需要使用Long.parseLong或者BigInteger来处理更大的数值。 另外,引用[^3]中提到的hashCode方法,虽然和当前问题无关,但提醒我要注意代码示例的正确性。比如,在异常处理中,应该展示如何记录错误或者给出默认值。 用户可能还希望知道如何预防异常的发生,比如使用正则表达式检查字符串是否为有效的整数格式。这时候需要提供一个正则表达式的例子,比如匹配可选的正负后跟数字。同时,要指出这种检查虽然能预防部分异常,但无法处理数值超出int范围的情况,所以结合try-ccatch会更全面。 另外,引用[^4]提到Servlet是多线程的,这里虽然不直接相关,但可能在Web应用中处理用户输入时,异常处理尤为重要,需要确保每个线程的异常都被正确捕获,避免应用崩溃。 总结一下,回答的结构应该是先介绍异常类型,然后给出try-catch示例,接着讨论输入验证的方法,比如正则表达式,最后提到处理大数的情况。这样用户能逐步了解如何处理和预防NumberFormatException。同时,确保所有代码示例符合LaTeX格式要求,行内代码用$...$,独立代码块用$$...$$,但根据用户提供的示例,代码块应该是用三个反引包裹的,所以可能需要调整。不过根据用户的问题中的示例,他们可能希望代码块用反引包裹,所以需要确认。但根据系统指令,数学表达式需要用$或$$,而代码块使用反引,因此这里可能需要分开处理。 最后,生成相关问题,可能涉及其他类型的异常处理,如何优化转换性能,或者在不同场景下的应用,比如Web应用中的表单输入处理。</think>### Java中Integer.parseInt的异常处理 #### 1. 异常类型说明 `Integer.parseInt()`方法在转换字符串时可能抛出$NumberFormatException$,属于未检查异常(继承自$RuntimeException$)。常见触发场景: - 字符串包含非数字字符(如"12a3") - 字符串为null或空(如"") - 数值超出int范围(如"2147483648") #### 2. 基础异常处理示例 ```java public class ParseIntExample { public static void main(String[] args) { String input = "123a"; try { int num = Integer.parseInt(input); System.out.println("转换结果:" + num); } catch (NumberFormatException e) { System.out.println("错误:'" + input + "' 不是有效整数"); e.printStackTrace(); // 打印堆栈跟踪 } } } ``` #### 3. 输入预处理优化 **3.1 正则表达式验证** ```java public static boolean isValidInteger(String input) { return input != null && input.matches("^[-+]?\\d+$"); } // 使用示例 if (isValidInteger(input)) { int num = Integer.parseInt(input); } else { System.out.println("非法输入"); } ``` **注意**:此方法不检查数值范围(如超过$2^{31}-1$的情况) **3.2 范围校验结合处理** ```java try { long temp = Long.parseLong(input); if (temp < Integer.MIN_VALUE || temp > Integer.MAX_VALUE) { System.out.println("超出int范围"); } else { int num = (int) temp; } } catch (NumberFormatException e) { // 处理非数字情况 } ``` #### 4. 完整异常处理模板 ```java public static int safeParseInt(String input, int defaultValue) { if (input == null) return defaultValue; try { return Integer.parseInt(input.trim()); } catch (NumberFormatException e) { System.out.println("转换失败: " + e.getMessage()); return defaultValue; } } // 调用示例 int result = safeParseInt(" 456 ", -1); // 返回456 int fallback = safeParseInt("12.3", -1); // 返回-1 ``` #### 5. 特殊场景处理 对于超大数值可使用$BigInteger$: ```java try { BigInteger bigNum = new BigInteger(input); System.out.println("超大数值:" + bigNum); } catch (NumberFormatException e) { // 处理非法输入 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值