一个笔试题,补充完整下面的代码,要求是,交换两个数字。
public static void swap(Integer x, Integer y) {
}
public static void swap(int x, int y) {
}
我的解答---------------------------
package com.yang.bean;
import java.lang.reflect.Field;
public class Number {
public static void swap(Integer a, Integer b) {
Class<?> aType = a.getClass();
Class<?> bType = b.getClass();
Integer c = b;
try {
Field afield = aType.getDeclaredField("value");
afield.setAccessible(true);
afield.set(a, b);
Field bfield = bType.getDeclaredField("value");
bfield.setAccessible(true);
bfield.set(b, c);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Integer a = 3;
Integer b = 5;
System.out.println(a);
System.out.println(b);
Number.swap(a, b);
System.out.println(a);
System.out.println(b);
}
}这个方法我试了,输出结果是3 5 5 5
只能把第一个数变成第二个数,而第二个数没变,我考虑了,你要想得到第一个数,而这时第一个数已经被你用第二个数替换了,所以,第一个数就没了。就得到这种结果!你引用地址没变而地址里的内容变了。所以先找个新的吧它寄存起来,可以new一下最后还是没成功!求高手出招
Java
面试题
--------------------编程问答--------------------
自己先等一下
--------------------编程问答--------------------
虽然我不知道为什么,但是把field.set改成field.setInt就好了
--------------------编程问答--------------------
我试了还是原来的结果什么都没变化!
--------------------编程问答--------------------
1.你的算法错了:c中应该保存a的值。
2.对象和对象的引用没分清楚。
不要用 Integer c = a,那样a和c就指向同一个对象了。
应该写成Integer c = new Integer(a),程序就没问题了。
3.反射的概念不清楚。
一个类只有一个class对象。所以aType和bType其实指向一个对象(afield和bfield也是)。
试试下面的代码。
public static void swap(Integer a, Integer b) {
Class type = a.getClass();
Integer c = new Integer(a);
try {
Field value = type.getDeclaredField("value");
value.setAccessible(true);
value.set(a, b);
value.set(b, c);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void swap(Integer a, Integer b) throws NoSuchFieldException, IllegalAccessException {
Field field = new Integer(5).getClass().getDeclaredField("value");
field.setAccessible(true);
int c = a;
field.setInt(a, b);
field.setAccessible(true);
field.setInt(b, c);
}
public static void swap(Integer a, Integer b) {
Class type = a.getClass();
Integer c = new Integer(a);
try {
Field value = type.getDeclaredField("value");
value.setAccessible(true);
value.set(a, b);
value.set(b, c);
} catch (Exception e) {
e.printStackTrace();
}
}
我想通了。我之前的代码是这样:
public static void swap(Integer a, Integer b) throws NoSuchFieldException, IllegalAccessException {
Field field = new Integer(5).getClass().getDeclaredField("value");
field.setAccessible(true);
int c = a;
field.setInt(a, b);
field.setAccessible(true);
field.setInt(b, c);
}
public static void swap(Integer a, Integer b) {
Class type = a.getClass();
Integer c = new Integer(a);
try {
Field value = type.getDeclaredField("value");
value.setAccessible(true);
value.set(a, b);
value.set(b, c);
} catch (Exception e) {
e.printStackTrace();
}
}
我想通了。我之前的代码是这样:
public static void swap(Integer a, Integer b) throws NoSuchFieldException, IllegalAccessException {
Field field = new Integer(5).getClass().getDeclaredField("value");
field.setAccessible(true);
int c = a;
field.setInt(a, b);
field.setAccessible(true);
field.setInt(b, c);
}
这一点可以很容易验证:你把setInt(a, b) 和 setInt(b, c)改成set(a, 5)和set(b, 3),输出的仍然是5,5。
setInt之所以没事是因为它没有经过重新装箱的过程,不会重用Integer对象
这个问题不在set 跟setInt上面,关键看你Integer c 是new出来,重新分配了内存,还是直接是一个引用指向原来A或者B的地址...亲。交换直接C =A ;A =B ; B=C就完事了,把AB指向的地址交换下
public class Test {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Integer a = 5;
Field field = a.getClass().getDeclaredField("value");
field.setAccessible(true);
field.set(a, 4);
Integer b = 5;
System.out.println(b);
}
}
请问b输出啥?这是我之前讨论的东西
--------------------编程问答--------------------
Integer a = 10;
Integer b = 11;
int temp = a.intValue();
a = b.intValue();
b = temp;
难道我把问题想简单了?
--------------------编程问答--------------------
Integer a = 1;
Integer b = 3;
Integer c = 0;
c = a;
a = b;
b = c;
System.out.println(a+":"+b);
--------------------编程问答--------------------
我错了的额额
--------------------编程问答--------------------
看了大家的回答。。。看不懂了
--------------------编程问答--------------------
我看看先,在帮你解答
--------------------编程问答--------------------
public static void swap(Integer a,Integer b){
try {
Integer c = new Integer(a);
Field field = a.getClass().getDeclaredField("value");
field.setAccessible(true);
field.set(a, b);
Field field1 = b.getClass().getDeclaredField("value");
field1.setAccessible(true);
field1.set(b, c);
public static void swap(Integer a, Integer b) {
Class type = a.getClass();
Integer c = new Integer(a);
try {
Field value = type.getDeclaredField("value");
value.setAccessible(true);
value.set(a, b);
value.set(b, c);
} catch (Exception e) {
e.printStackTrace();
}
}
我想通了。我之前的代码是这样:
public static void swap(Integer a, Integer b) throws NoSuchFieldException, IllegalAccessException {
Field field = new Integer(5).getClass().getDeclaredField("value");
field.setAccessible(true);
int c = a;
field.setInt(a, b);
field.setAccessible(true);
field.setInt(b, c);
}