Integer比较会出现的问题

Integer的那些事

之前写代码时,看到Integer这个类型,突然想到之前遇到过类似问题,在此做一个小结记录一下。

文章目录

  • Integer的那些事
    • Integer与int相互转化
    • Integer 不同值的比较【imp】
    • Integer的compareTo()方法
    • 使用Optional避免空指针异常
    • 总结:

Integer与int相互转化

Integer a = 100;
int b = 120;

int i = a.intValue();					   //Integer转int
Integer integer = Integer.valueOf(b);		//int转Integer

Integer 不同值的比较【imp】

//使用Integer.valueOf()和直接定义一个值是一样的,都属于自动装箱
Integer a1 = 66;
Integer b1 = 66;
Integer c1 = Integer.valueOf(66);
System.out.println(a1 == b1);       		//true
System.out.println(a1 == c1);       		//true

//只要是new Integer(),都会在堆中新建
Integer a2 = 60;
Integer b2 = new Integer(60);
System.out.println(a2 == b2);				//false

//只要是超出[-128,127]区间,怎么比较都是false
Integer a3 = 128;
Integer b3 = 128;
Integer c3 = Integer.valueOf(128);
Integer d3 = new Integer(128);
System.out.println(a3 == b3);				//false
System.out.println(a3 == c3);				//false
System.out.println(a3 == d3);				//false
System.out.println(c3 == d3);				//false

//与null比较会报错,所以要避免传入的值为null
Integer a4 = null;
Integer b4 = Integer.valueOf(null);
System.out.println(b4 == a4);				//NumberFormatException
System.out.println(b4.equals(a4));			//NumberFormatException

Integer的compareTo()方法

Integer a = 5;  
Integer b = 10;  
  
int result = a.compareTo(b);  
  
if (result < 0) {  
    System.out.println("a 小于 b");  			//result < 0	a < b
} else if (result > 0) {  
    System.out.println("a 大于 b");  			//result > 0	a > b
} else {  
    System.out.println("a 等于 b");  			//result = 0	a = b
}

使用Optional避免空指针异常

在Java中,空指针异常(NullPointerException)是一个常见的运行时异常,通常发生在试图访问一个空(null)对象的成员或方法时。为了避免这种情况,可以使用Java 8引入的Optional类。

Optional类是一个容器类,用于包装可能为null的值。它提供了一系列方法来处理可能为null的值,避免了空指针异常。以下是一些使用Optional类避免空指针异常的方法:

  1. 使用Optional.of()方法创建一个Optional对象,该方法接受一个非null的参数。如果参数为null,则抛出NullPointerException。
Optional<Integer> optional = Optional.of(123);
  1. 使用Optional.ofNullable()方法创建一个Optional对象,该方法接受一个可能为null的参数。如果参数为null,则返回一个空的Optional对象。
Optional<Integer> optional = Optional.ofNullable(null);
  1. 使用Optional.get()方法获取Optional对象中的值。如果Optional对象为空,则抛出NoSuchElementException。可以使用Optional.isPresent()方法先检查Optional对象是否为空。
//将返回的数据定义为Optional类型
Optional<User> optionalUser = getUserById(123);  
if (optionalUser.isPresent()) {  
    User user = optionalUser.get();  
    // 对user对象进行操作  
} else {  
    // 处理找不到用户的情况  
}
  1. 使用Optional.orElse()方法获取Optional对象中的值,如果Optional对象为空,则返回一个默认值。
Optional<User> optionalUser = getUserById(123);  
//参数中定义默认返回的对象
User user = optionalUser.orElse(new User("default"));  
// 对user对象进行操作
  1. 使用Optional.orElseGet()方法获取Optional对象中的值,如果Optional对象为空,则返回一个通过调用指定方法得到的默认值。
Optional<User> optionalUser = getUserById(123);  
User user = optionalUser.orElseGet(() -> new User("default"));  
// 对user对象进行操作
  1. 使用Optional.orElseThrow()方法获取Optional对象中的值,如果Optional对象为空,则抛出一个指定的异常。
Optional<User> optionalUser = getUserById(123);  
User user = optionalUser.orElseThrow(() -> new NoSuchElementException("User not found"));  
// 对user对象进行操作

通过使用Optional类,可以避免空指针异常,提高代码的可读性和健壮性。

总结:

  • Integer类型对于 [ -128,127 ] 区间的数是缓冲区取的,其他的范围则会在堆内存中new出来,地址值不同,所以用 == 比较为false。
  • Integer类型不仅可以用普通运算符比较值的大小,还可以用 compareTo() 方法比较大小。
  • 要避免与null值进行比较,会出现异常。可以使用Java1.8的 Optional类 避免空指针。

你可能感兴趣的:(java)