BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #61918同步于 2019/4/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

大佬,该你登场了

alisapapapa
2019/4/18镜像同步8 回复
下面的代码输出的是啥,以及理由!! ``` public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { Integer a = 100, b = 20; swap(a,b); System.out.println(a+" "+b); } static void swap(Integer a, Integer b) throws NoSuchFieldException, IllegalAccessException { int x=a,y=b; Field field = Integer.class.getDeclaredField("value"); field.setAccessible(true); field.set(a, y); field.set(b, x); } ```
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
Lamperouge机器人#1 · 2019/4/18
20 100猜的
alisapapapa机器人#2 · 2019/4/18
错了 【 在 Lamperouge ([意涵团]|取个名字也麻烦|美航的京东狗) 的大作中提到: 】 : 20 100猜的
faith机器人#3 · 2019/4/18
20,20
w1252675615机器人#4 · 2019/4/18
20 20
w1252675615机器人#5 · 2019/4/18
试了下确实是20 20,猜想是因为Java里面int本身和Integer有PY关系??
faith机器人#6 · 2019/4/18
猜测一下:field.set()函数的两个入参都是对象,所以field(b,x)会将x进行装箱,由于Integer类的【-128,127】缓存机制,x装箱获得的是缓存数组中的第100+128个对象,而第100+128个对象就是a,此时a已经被赋值为20,所以b最后为20,输出为20,20。如果想成功交换,需要用setInt()函数,该函数第二个参数为int基本类型。如果交换的是缓存【-128,127】之外的integer,楼主贴的代码才会成功交换。
w1252675615机器人#7 · 2019/4/18
【 在 faith 的大作中提到: 】 : 猜测一下:field.set()函数的两个入参都是对象,所以field(b,x)会将x进行装箱,由于Integer类的【-128,127】缓存机制,x装箱获得的是缓存数组中的第100+128个对象,而第100+128个对象就是a,此时a已经被赋值为20,所以b最后为20,输出为20,20。如果想成功交换,需要用setInt()函数,该函数第二个参数为int基本类型。如果交换的是缓存【-128,127】之外的integer,楼主贴的代码才会成功交换。 大佬[ema21]
alisapapapa机器人#8 · 2019/4/18
正解!!!!感谢感谢 【 在 faith 的大作中提到: 】 : 猜测一下:field.set()函数的两个入参都是对象,所以field(b,x)会将x进行装箱,由于Integer类的【-128,127】缓存机制,x装箱获得的是缓存数组中的第100+128个对象,而第100+128个对象就是a,此时a已经被赋值为20,所以b最后为20,输出为20,20。如果想成功交换,需要用setInt()函数,该函数第二个参数为int基本类型。如果交换的是缓存【-128,127】之外的integer,楼主贴的代码才会成功交换。