public static void
main(String [] args){
Integer a=
1
,b=
2
;
System.
out
.println(
"a = "
+ a +
",b = "
+ b);
swap1
(a,b);
System.
out
.println(
"a = "
+ a +
",b = "
+ b);
}
版本1
public static void
swap1(Integer a,Integer b){
Integer temp=b;
b=a;
a=temp;
}
如果传值是基本值,传的是原始值的副本
函数中修改,只是修改了副本,原始值不变
如果传的引用值,则是原始值的地址
怎么做?
Integer源码
/**
* The value of the {
@code
Integer}.
*
*
@serial
*/
private final int
value
;
修改这个成员变量的值,修改地址
版本2
public static void
swap2(Integer a,Integer b)
throws
Exception{
Field field = Integer.
class
.getDeclaredField(
"value"
);
//通过反射拿到成员变量
field.setAccessible(
true
);
//设置访问权限 访问私有变量
int
temp = a.intValue();
field.set(a,b.intValue());
field.set(b,temp);
}
为什么还是没有达到预期的效果??? a和b的值还是没有交换
field.set(a,b.intValue()); //这句话改变了a,也改变了temp
temp和a用的一块内存地址,a改了temp也改了
/**
* Cache to support the object identity semantics of autoboxing for values between
* -128 and 127 (inclusive) as required by JLS.
*
* The cache is initialized on first usage. The size of the cache
* may be controlled by the {
@code
-XX:AutoBoxCacheMax=
<size>
} option.
* During VM initialization, java.lang.Integer.IntegerCache.high property
* may be set and saved in the private system properties in the
* sun.misc.VM class.
*/
private static class
IntegerCache {
static final int
low
= -
128
;
static final int
high
;
static final
Integer
cache
[];
static
{
// high value may be configured by property
int
h =
127
;
String integerCacheHighPropValue =
sun.misc.VM.
getSavedProperty
(
"java.lang.Integer.IntegerCache.high"
);
if
(integerCacheHighPropValue !=
null
) {
try
{
int
i =
parseInt
(integerCacheHighPropValue);
i = Math.
max
(i,
127
);
// Maximum array size is Integer.MAX_VALUE
h = Math.
min
(i, Integer.
MAX_VALUE
- (-
low
) -
1
);
}
catch
( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high
= h;
cache
=
new
Integer[(
high
-
low
) +
1
];
int
j =
low
;
for
(
int
k =
0
; k <
cache
.
length
; k++)
cache
[k] =
new
Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert
IntegerCache.
high
>=
127
;
}
private
IntegerCache() {}
}
验证缓存的存在
public static void
main(String [] args)
throws
Exception{
Integer a=
1
,b=
1
;
System.
out
.println(a==b);
}
返回true则说明是a,b在同一块地址
版本3
public static void
swap3(Integer a,Integer b)
throws
Exception{
Field field = Integer.
class
.getDeclaredField(
"value"
);
//通过反射拿到成员变量
field.setAccessible(
true
);
//设置访问权限 访问私有变量
Integer temp = new Integer(a.intValue()); //修改 new Integer对象 开辟新空间
field.set(a,b.intValue());
field.set(b,temp);
}
考点:
1,值传递与引用传递
2,自动装箱与拆箱
3,Integer -128 - 127 有cache
4,通过反射修改private final成员变量(注意修改访问权限)