# 与IntegerCache有关的一个比较坑的面试题

```public static void main(String[] args) {

Integer a = 1;
Integer b = 2;
System.out.println("before swap: a="+a+" b="+b);
swap(a,b);
System.out.println("before swap: a="+a+" b="+b);
}

private static void swap(Integer a,Integer b) {

}```

```private static void swap(Integer a,Integer b) {
a = a^b;
b = a^b;
a = a^b;
}```

```before swap: a=1 b=2
before swap: a=1 b=2```

```    /**
* The value of the {@code Integer}.
*
* @serial
*/
private final int value;```

```private static void swap(Integer a,Integer b) {
try {
Field field = Integer.class.getDeclaredField("value");
field.setAccessible(true);
int tmp1 = a.intValue();
int tmp2 = b.intValue();
tmp1 = tmp1^tmp2;
tmp2 = tmp1^tmp2;
tmp1 = tmp1^tmp2;
field.set(a,tmp1);
field.set(b,tmp2);
} catch (Exception e) {
e.printStackTrace();
}
}```

```before swap: a=1 b=2
before swap: a=2 b=2```

```  public static void main(String[] args) {
Integer a = Integer.valueOf(1);
Integer b = Integer.valueOf(2);
System.out.println("before swap: a=" + a + " b=" + b);
swap(a, b);
System.out.println("before swap: a=" + a + " b=" + b);
}

private static void swap(Integer a, Integer b) {
try {
Field field = Integer.class.getDeclaredField("value");
field.setAccessible(true);
int tmp1 = a.intValue();
int tmp2 = b.intValue();
tmp1 ^= tmp2;
tmp2 = tmp1 ^ tmp2;
tmp1 ^= tmp2;
field.set(a, Integer.valueOf(tmp1));
field.set(b, Integer.valueOf(tmp2));
} catch (Exception e) {
e.printStackTrace();
}
}```

```   /**
* Returns an {@code Integer} instance representing the specified
* {@code int} value.  If a new {@code Integer} instance is not
* required, this method should generally be used in preference to
* the constructor {@link #Integer(int)}, as this method is likely
* to yield significantly better space and time performance by
* caching frequently requested values.
*
* This method will always cache values in the range -128 to 127,
* inclusive, and may cache other values outside of this range.
*
* @param  i an {@code int} value.
* @return an {@code Integer} instance representing {@code i}.
* @since  1.5
*/
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}```

`field.set(a, Integer.valueOf(tmp1));`

`Integer c = 5;`

```	private static void swap(Integer a,Integer b) {
try {
Field field = Integer.class.getDeclaredField("value");
field.setAccessible(true);
int tmp1 = a.intValue();
int tmp2 = b.intValue();
tmp1 = tmp1^tmp2;
tmp2 = tmp1^tmp2;
tmp1 = tmp1^tmp2;
field.set(a,new Integer(tmp1));
field.set(b,new Integer(tmp2));
} catch (Exception e) {
e.printStackTrace();
}
}```

```  private static void swap(Integer a, Integer b) {
try {
Field field = Integer.class.getDeclaredField("value");
field.setAccessible(true);
int tmp1 = a.intValue();
int tmp2 = b.intValue();
tmp1 ^= tmp2;
tmp2 = tmp1 ^ tmp2;
tmp1 ^= tmp2;
field.set(a, new Integer(tmp1));
field.set(b, new Integer(tmp2));
} catch (Exception e) {
e.printStackTrace();
}
}```

• 1.java中的方法传递和值传递。对于不可变类型实际上还是值传递。
• 2.反射修改私有变量需要setAccessible(true)。
• 3.自动装箱调用ValueOf方法会走IntegerCache。
• 4.如果不想走IntegerCache，那么new一个新的对象。

0 条评论

• ### 有关JAVA自动装箱-拆箱的分析

在java常量与常量池 中已经介绍过一些java自动装箱与拆箱的例子。现在单独对自动装箱/拆箱进行总结。

• ### 解决elasticsearch“Too many open files in system”问题

在前两次集群扩容的过程中，总是会出现Too many open files in system问题。对于这个问题，困扰了一段时间。由于elasticsearch...

• ### 在springboot中对kafka进行读写操作

只需要在dependencies中增加 spring-kafka的配置即可。完整效果如下：

• ### java学习之路：16.掌握Integer,Long,Short对象的创建以及其类提供的各种方法

java.lang包中的Integer类，Long类，和Short类分别将int，long，short类型封装成一个类，由于这些类都市Number的子类，区别就...

• ### 奇怪的Java题：为什么128 == 128返回为false，而127 == 127会返回为true?

奇怪的Java题：为什么128 == 128返回为false，而127 == 127会返回为true?

• ### 面试官六连问拆箱装箱Integer那些事，给我整懵圈了！

小萌：由于基本数据类型不是对象，所以java并不是纯面向对象的语言，好处是效率较高（全部包装为对象效率较低）。Java是一个面向对象的编程语言，基本类型并不具有...

• ### 夯实Java基础系列8：深入理解Java内部类及其实现原理

本系列文章将整理到我在GitHub上的《Java面试指南》仓库，更多精彩内容请到我的仓库里查看

• ### 再谈Integer对象比较

在上一篇文章中介绍了Integer的特性及面试中常考的几个知识点，本篇文章再做些扩充。

• ### 2020Java核心面试题--基础题

答：byte、short、 int 、long、 float double、 boolean、 char

• ### 搞清楚一道关于Integer的面试题

面试题3中的a=99相当于a=new Integer(99);重新给把一个新的对象引用地址给了a，所以a变了，最后输出是99。