今天遇到了一个问题,本来以为很好能解决,结果却使我对结果有了不一样的认识
背景:就是我有一个int类型的值,我需要调用一个方法,把这个参数传进去,希望在方法里面改变这个的值,我知道基本类型不会改变,所以我就用了Integer,发现还是不行,我接着就用了AtomicInteger这个类型,发现还是不行,我就觉得很懵逼,后来发现,凡是继承于Number里面的,调用一个方法,给这个值重新覆值,就会有问题
public void test(){
int a = 1;
String str = "1";
Integer integer = new Integer(1);
AtomicInteger atomicInteger = new AtomicInteger(1);
changeInt(a);
changeString(str);
changeInteger(integer);
changeAtomicInteger(atomicInteger);
System.out.println(a);
System.out.println(str);
System.out.println(integer);
System.out.println(atomicInteger);
}
private void changeInt(int a){
a = a +1;
}
private void changeString(String str){
str = str + "___";
}
private void changeInteger(Integer integer){
integer = integer + 1;
}
private void changeAtomicInteger(AtomicInteger atomicInteger){
atomicInteger = new AtomicInteger(2);
}
返回值为
1
1
1
1
不过这个也是有解决办法的,第一种解决办法很笨拙,就是我把之前传递的int改为int[]数组的表达形式,第二种方式,就是我们对于AtomicInteger这种类型的对象,我不要采用重新覆盖值的方式,而是要采用set的方式,对于这样而言,就相当于是我不改变你的地址的值,我只是改变这个地址引用对象的值
@Test
public void test1(){
AtomicDouble atomicDouble = new AtomicDouble(1);
changeAtomicDouble(atomicDouble);
System.out.println(atomicDouble);
}
private void changeAtomicDouble(AtomicDouble atomicDouble){
atomicDouble.set(3);
}
返回值
3
结论:通过这件事情,我发现其实有些时候,我们认为理所应当的事情,并没有我们想的那么容易,有些时候,我们认为正确的事情,恰恰在有些时候就是错误的,对于学习来说呀,还是一个要谦虚的过程,是一个持续学习的过程