int ,integer 源码解析

先来看一个经典的int,integer 的面试题。

public void  main (String[] args){
    Integer a=1,b=2;
    system.out.println("a= "+a+" b= "+b);
    swap(a,b);
    system.out.println("a= "+a+" b= "+b);
}
public void swap(int m,int n){
    //实现交换a,b的值。
}
  • 如果不了解a,b在内存的存储,那么这个肯定会写错。
  • int 在内存的存储方式是1-128是存在一个常量池里。即m和a指向同一个地址,交换m,n的值只是交换了引用的地址。
  • 没有改变地址里存储的值。
  • 这个传参是一个值传参,而不是一个引用传参。这里写图片描述
  • 通过修改m,n 的值来改变a,b的值,就是要改变m,n指向地址里的值。
  • 普通的交换只是单纯的交换了m,n指向的地址,并不改变原来地址里存放的值。
  • 由于a,b都是对象,通过反射来实现。
  • `
    private static void swap(Integer a, Integer b) {
    // TODO Auto-generated method stub

    try {
        Field field = Integer.class.getDeclaredField("value");
        Integer temp=new Integer(d.intValue());
        field.setAccessible(true);
        field.set(b, a);
        field.set(a, temp);
    } catch (NoSuchFieldException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    System.out.println();
    

    }`

  • 如果swap 定义为swap(int a, int b),如何实现交换呢?
  • 那可以直接将a,b转换为integer,再进行修改。
  • `static void swap(int a, int b) {
    // TODO Auto-generated method stub

    try {
        Integer c=a,d=b;
        Field field = Integer.class.getDeclaredField("value");
        Integer temp=new Integer(d.intValue());
        field.setAccessible(true);
        field.set(d, c);
        field.set(c, temp);
    } catch (NoSuchFieldException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    

    }`

  • 如果main 方法里 如下定义: int x=1211,y=1922;,那么能够实现交换x ,y的值吗?

  • 本次环境: jdk1.8

猜你喜欢

转载自blog.csdn.net/m0_37948170/article/details/80834654