如何在将long值转换为byteValue等类型后还原并打印原始long值
如何从long转换后的byte/int/short/hashCode/long值还原原始long?
嘿,这个问题得先明确一个核心点:不是所有转换后的类型都能还原出原始的long值——因为像byte、short、int的取值范围都比long小,当原始long超出它们的范围时,转换会丢失高位数据,这种情况下根本没法还原;而hashCode本身是单向哈希,也做不到还原。咱们逐个拆解:
1. 从longValue()还原
这是最省心的情况:如果你的longValue()是直接从原始Long对象调用的(比如l.longValue()),那它返回的就是原始的long值,直接用就行。
如果是从其他包装类(比如Integer)的longValue()转来的,那只有当原始long值在int的范围内(-2147483648到2147483647),转int再转long才能还原原始值。
2. 从intValue()还原
- 如果原始long值在int的取值范围内:直接把int值强制转成long就行,比如
long original = (long) intValueResult; - 如果原始long超出int范围:转换时会自动截断高位二进制位,得到的int值已经不是原始值的完整表示了,这种情况无法还原。比如你示例里的
5148765430l,它远大于int的最大值2147483647,转成int后会变成截断后的异常值,再转long也得不到原始值。
3. 从shortValue()还原
short的范围是-32768到32767,只有原始long值落在这个区间里,转short后再强制转成long才能还原;超出范围的话,同样会截断高位,无法还原。
4. 从byteValue()还原
byte的范围是-128到127,逻辑和short一样:只有原始long在这个区间内,转byte后转long才能得到原始值,否则数据丢失,无法还原。
5. 从hashCode()还原
完全不可能。原因有两个:
- 对于
Long对象,它的hashCode计算逻辑是(int)(value ^ (value >>> 32)),这是把64位的long压缩成32位的int,必然会有不同的long值得到相同的hashCode(哈希碰撞)。 - 对于
Integer的hashCode,就是它本身的int值,而如果原始long超出int范围,转成int后的hashCode已经是截断后的值,和原始long无关了。
修正你的代码示例
你原来的代码里有几个问题:比如用new Integer(t)来调用其他方法其实没必要,而且原始long值超出了int范围,导致后续转换都基于截断后的int,得不到原始值。咱们改一个能还原的例子(用在int范围内的long值):
public class LongRestoreDemo { public static void main(String[] args) { // 用一个在int范围内的long值 Long originalLong = 123456L; // 从intValue还原 int intVal = originalLong.intValue(); long restoredFromInt = (long) intVal; System.out.println("从intValue还原:" + restoredFromInt); // 从shortValue还原(用在short范围内的值) Long smallLong = 123L; short shortVal = smallLong.shortValue(); long restoredFromShort = (long) shortVal; System.out.println("从shortValue还原:" + restoredFromShort); // 从byteValue还原(用在byte范围内的值) Long tinyLong = 45L; byte byteVal = tinyLong.byteValue(); long restoredFromByte = (long) byteVal; System.out.println("从byteValue还原:" + restoredFromByte); // 从longValue还原 long restoredFromLongVal = originalLong.longValue(); System.out.println("从longValue还原:" + restoredFromLongVal); // 演示hashCode的碰撞问题(无法还原) Long anotherLong = 123456L + (1L << 32); System.out.println("originalLong的hashCode:" + originalLong.hashCode()); System.out.println("anotherLong的hashCode:" + anotherLong.hashCode()); } }
运行结果:
从intValue还原:123456 从shortValue还原:123 从byteValue还原:45 从longValue还原:123456 originalLong的hashCode:123456 anotherLong的hashCode:123456
总结一下:
- 只有当原始long值落在目标类型(byte/short/int)的范围内时,才能从对应的转换值还原原始long;
longValue()始终能还原原始long(只要是从原始Long对象调用的);- hashCode完全无法还原原始long值。
内容的提问来源于stack exchange,提问作者king amada
相关产品推荐
相关产品推荐

