两个Integer如何交换值?

package cn.chen.demo.fielddemo;

import java.lang.reflect.Field;

/**
 * 两个Integer的引用对象传给一个swap方法
 * 在方法内部进行交换,返回后,两个引用变量是否发生变化?
 * @author chenlf
 * 知识点:
 * 1.自动装箱和拆箱
 * 2.Integer -128~127之间的缓存
 * 3.反射:通过反射去修改 private final不可变变量
 */
public class SwapTest {
	
	public static void main(String[] args) {
		Integer a=1,b=2;//相当于 Integer a = Integer.valueOf(1);自动封装
						//调用到ValueOf()方法-->IntegerCache.cache()源码查看
						//-128到127已经缓存了,意味着这期间的值拿到的是同一个,即内存地址是同一个
		//private final int value; 存在这里(Integer类中)
		//所以我们如果要改变的话,就得去改它的内存地址
		//这个值(final修饰)是私有不可变的变量,只能通过反射去改变
		System.out.println("改变前值:a="+a+",b="+b);
		try {
			swap(a,b);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("改变后值:a="+a+",b="+b);
	}

	//传递的是引用类型,则是接受的是原始值的地址,而不是值本身
	//传递的是基本类型,则是接受的是原始值的副本,原始值不变
	public static void swap1(Integer a, Integer b) throws Exception {
		Field field = Integer.class.getDeclaredField("value");
		field.setAccessible(true);//设置可以访问成员的私有不可变的变量
		int tmp = a.intValue();//1
		field.set(a, b.intValue());//a = Integer.valueOf(b).intValue() = 2
								   //tmp修改的是内存地址,所以这里tmp的值变成2
		field.set(b, tmp);
		//会变成同一个值,a=2,b=2
	}
	
	//解决使用同一块内存,那么就是new一个
	public static void swap(Integer a, Integer b) throws Exception {
		Field field = Integer.class.getDeclaredField("value");
		field.setAccessible(true);//设置可以访问成员的私有不可变的变量
		Integer tmp =new Integer(a.intValue());
		field.set(a, b.intValue());
		field.set(b, tmp);
	}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是 Point<T> 类的定义和 main 方法的实现: ```java public class Point<T> { private T x; private T y; public Point(T x, T y) { this.x = x; this.y = y; } public T getX() { return x; } public void setX(T x) { this.x = x; } public T getY() { return y; } public void setY(T y) { this.y = y; } public void translate() { T temp = x; x = y; y = temp; System.out.println("x = " + x + ", y = " + y); } } public class Main { public static void main(String[] args) { Point<Integer> p1 = new Point<>(1, 2); System.out.println("p1: x = " + p1.getX() + ", y = " + p1.getY()); p1.translate(); System.out.println("p1 after translation: x = " + p1.getX() + ", y = " + p1.getY()); Point<Double> p2 = new Point<>(1.5, 2.5); System.out.println("p2: x = " + p2.getX() + ", y = " + p2.getY()); p2.translate(); System.out.println("p2 after translation: x = " + p2.getX() + ", y = " + p2.getY()); } } ``` 在上面的代码中,我们定义了一个泛型类 Point<T>,其中包含 x 和 y 两个类型为 T 的成员,以及带两个参数的构造方法来初始化 x 和 y 的。我们还定义了 setter 和 getter 方法来获取和设置 x 和 y 的,以及一个 translate 方法来交换 x 和 y 的,并输出交换后的。 在 main 方法中,我们创建了两个 Point 对象,一个是 Point<Integer> 类型,另一个是 Point<Double> 类型。我们分别调用了它们的 getX 和 getY 方法来获取 x 和 y 的,以及调用 translate 方法来交换 x 和 y 的,并输出交换后的
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值