java基础之Integer和Long

本文深入探讨了Java中Integer和Long类的特性,包括它们如何继承自Number类,提供的转换方法,以及如何处理不同进制的字符串转换。同时,文章详细解析了这些类的内部实现,如变量存储、构造方法和常用API,以及缓存机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

归纳

  1. Integer和Long都继承自Number类,该类的方法均为类型转换,如intValue()
  2. 均为有符号整数,大小分别为-2^31~2^31-1-2^63~2^63-1
  3. Integer和Long都可以转为多种进制的字符串,静态方法toString(int,radix)
  4. 多种进制的字符串转为Integer和Long,使用valueOf(String,radix)

JDK描述

public final class Integer
extends Number
implements Comparable
Integer 类在对象中包装了一个基本类型 int 的值。Integer 类型的对象包含一个 int 类型的字段。

此外,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理 int 类型时非常有用的其他一些常量和方法。

public final class Long
extends Number
implements Comparable
Long 类在对象中包装了基本类型 long 的值。每个 Long 类型的对象都包含一个 long 类型的字段。

此外,该类提供了多个方法,可以将 long 转换为 String,将 String 转换为 long,除此之外,还提供了其他一些处理 long 时有用的常量和方法。

代码分析

Integer和Long类比较类似,放在一起看了

继承了Number类,实现了一个接口

  • Number是Integer和Long的父类,其实现了Serializable接口,支持序列化;在java中,很多数字类型的类都是Number类的子类,如常见的Byte、Double、Float、Long、Short,还有AtomicInteger、AtomicLong、BigDecimal等。
Number类需要实现下列方法,便于类型转换
public abstract int intValue();
public abstract long longValue();
public abstract float floatValue();
public abstract double doubleValue();
public byte byteValue()
public short shortValue()
  • Comparable接口,实现compareTo方法,实现比较

变量

  • private final int value; 保存值,Integer是有符号的,0为正,1为负数
  • public static final int MIN_VALUE = 0x80000000; 最小值 1000...0000 -2^31
  • public static final int MAX_VALUE = 0x7fffffff; 最大值 0111...1111 2^31-1
  • public static final Class TYPE;类型Class
  • final static char[] digits ;保存所有可展现数字的char,包括0-9 a-z
  • public static final long MIN_VALUE = 0x8000000000000000L;最小值 -263
  • public static final long MAX_VALUE = 0x7fffffffffffffffL;最大值 263-1
  • public static final Class TYPE;Long的类型Class

构造方法

  • public Integer(int value) ;this.value = value;
  • public Integer(String s) ;this.value = parseInt(s, 10);

其他方法

转字符串

  • public static String toString(int i, int radix);根据进制返回字符串,进制范围为2-36
  • public static String toHexString(int i) ;返回16进制字符串,toUnsignedString的shift为4
  • public static String toOctalString(int i);返回8进制字符串,toUnsignedString的shift为3
  • public static String toBinaryString(int i) ;返回2进制字符串,toUnsignedString的shift为1
  • private static String toUnsignedString(int i, int shift);计算mask后从digits中取字符
  • public static String toString(int i) 返回字符串

其他对象转Integer

  • public static int parseInt(String s, int radix);将字符串转为int
  • public static int parseInt(String s);默认10进制
  • public static Integer valueOf(String s, int radix)
  • public static Integer valueOf(String s)
  • public static Integer valueOf(int i);先从cache中取,若无new Integer

转其他类型,均为强转

  • public byte byteValue()
  • public short shortValue()
  • public int intValue()
  • public long longValue()
  • public float floatValue()
  • public double doubleValue()

其他方法

  • public int hashCode() 返回value
  • public boolean equals(Object obj) obj必须是Integer;i.equals(23) 23会被装箱为Integer
  • public static Integer getInteger(String nm);从System.getProperty中获取Integer的值
  • public static Integer decode(String nm) ;将nm解码为Integer,nm
  • public int compareTo(Integer anotherInteger);比较
  • public static int compare(int x, int y);比较
decode(String nm)可解码的字符串
Signopt 0x HexDigits 
Signopt 0X HexDigits 
Signopt # HexDigits 
Signopt 0 OctalDigits 

其他

  • int i=3;int到Integer会调用Integer.valueOf(3)方法,将-128~127缓存到IntegerCache,缓存的原因是java规范这样规定了

相关问题

观察下面的代码

Integer k=new Integer(23);
Integer j=Integer.valueOf("23");
System.out.println(k==j);//返回false

Integer i=23;
Integer j=Integer.valueOf("23");
System.out.println(i==j);//返回true,缓存了

Integer i=223;
Integer j=Integer.valueOf("223");
System.out.println(i==j);//返回false,未缓存

 

<think>好的,我现在需要回答用户关于JavaIntegerLong类型相互转换的问题。首先,我得回忆一下相关的知识,确保自己理解正确。用户提到了站内引用,所以需要结合这些引用来组织答案。 首先,用户的问题分为两部分:将Integer转换为LongLong转换为Integer。根据引用[2][3],IntegerLong的方法有两种:使用Long的构造方法或者使用longValue()方法。比如,Integer对象可以通过new Long(integer.intValue())来转换,或者直接用integer.longValue()得到一个long基本类型,然后自动装箱为Long。需要注意的是,虽然自动装箱在Java 5之后可行,但可能涉及性能问题,不过用户可能更关注正确的方法。 然后,关于LongInteger,引用[1]提到使用强制类型转换,但需要注意数据溢出的问题。因为Long的范围比Integer大,所以直接强制转换可能导致数据丢失。因此,在转换前需要检查Long值是否在Integer的范围内,可以使用intValue()方法,或者手动进行范围检查,抛出异常或处理溢出情况。引用[4]提到longValue()方法在转换时不会抛出异常,所以必须自行处理溢出。 接下来,用户需要示例代码。对于IntegerLong,可以给出两种方法的代码示例,比如使用构造方法自动装箱。对于LongInteger,可以展示强制转换intValue()方法,同时强调检查范围的必要性,比如使用Math.toIntExact()方法(Java 8+),或者在转换前比较数值。 还要注意数据类型的问题,比如LongInteger是包装类,而longint是基本类型。转换时可能需要处理自动装箱拆箱的情况。例如,如果有一个Long对象,转换为int基本类型的话,可以直接调用longObj.intValue(),然后再转为Integer对象。 另外,用户可能关心转换时的异常处理,比如如何避免数据溢出,或者转换失败时的处理方式。需要建议在转换前验证数值范围,避免潜在的运行时错误。 最后,整理这些思路,分步骤给出清晰的转换方法,并附上示例代码。同时,生成相关问题,可能涉及自动装箱、性能考虑、处理溢出的最佳实践等。</think>### JavaIntegerLong类型相互转换方法 在Java中,`Integer``Long`作为包装类,转换时需注意数值范围类型匹配。以下是具体方法及示例: --- #### 一、IntegerLong 1. **使用`Long`构造方法** 通过`Integer.intValue()`获取基本类型值,再构造`Long`对象: ```java Integer integerValue = 100; Long longValue = new Long(integerValue.intValue()); // 显式构造 ``` 2. **利用自动装箱与`longValue()`** `Integer.longValue()`直接返回`long`类型,再自动装箱为`Long`: ```java Integer integerValue = 200; Long longValue = integerValue.longValue(); // 隐式转换(Java 5+) ``` --- #### 二、LongInteger 1. **强制类型转换(需检查范围)** 通过`Long.intValue()`获取`int`值,但需确保数值在`Integer`范围内($-2^{31}$至$2^{31}-1$): ```java Long longValue = 300L; if (longValue >= Integer.MIN_VALUE && longValue <= Integer.MAX_VALUE) { Integer integerValue = longValue.intValue(); // 直接转换 } else { throw new ArithmeticException("数值超出Integer范围"); } ``` 2. **使用`Math.toIntExact()`(Java 8+)** 若超出范围会抛出异常,避免数据丢失: ```java Long longValue = 400L; try { int intValue = Math.toIntExact(longValue); // 安全转换 Integer integerValue = intValue; } catch (ArithmeticException e) { System.out.println("转换失败:" + e.getMessage()); } ``` --- ### 注意事项 - **数据溢出风险**:`Long`的范围远大于`Integer`,直接转换可能导致精度丢失[^1]。 - **空指针问题**:若对象为`null`,调用方法会抛出`NullPointerException`,需提前判空。 - **性能优化**:频繁转换时,优先使用基本类型(`int`/`long`)以减少自动装箱开销。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值