Java 传参时修改参数内容

以下时个人观点:

Java 传参数传的是引用,并且是使用 final 修饰了参数。这导致不能将引用指向另一个对象。

public static void main(String[] args) {
    Map<String, String> map = new HashMap<>();
    map.put("a", "a");
    
    change1(map);
    System.out.println(map.size());  // 输出结果 1

    change2(map);
    System.out.println(map.size());  // 输出结果 2
}

// 直接将参数指向另一个对象,不会修改原参数
public static void change1(Map map) {
    map = new HashMap<>();
}

// 修改内容,可以修改参数
public static void change2(Map map) {
    map.put("b", "b");
}

在传参数时,在不修改参数的指向的前提下,修改其内容就可以修改原参数。

String 是不可变的类型,当值发生改变是,会生成新的对象,并将指针指向新的对象,所以通过以上方法修改不了参数值。

public static void main(String[] args) {
    String str = "a";
    
    change1(str);
    System.out.println(str); // 输出结果 a

    change2(str);
    System.out.println(str); // 输出结果 a

    change3(str);
    System.out.println(str); // 输出结果 ab

}

// 改变值,实际已经指向了新的对象,不会修改原参数
public static void change1(String str) {
    str += "b";
}

// 指向新的对象,不会修改原参数
public static void change2(String str) {
    str = new String("ab");
}

// 通过反射修改值,可以修改原参数
public static void change3(String str) {
    Field valueField = null;
    try {
        valueField = String.class.getDeclaredField("value");
        valueField.setAccessible(true);
        char[] ch = {'a', 'b'};
        valueField.set(str, ch);
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

}
发布了16 篇原创文章 · 获赞 3 · 访问量 4532

猜你喜欢

转载自blog.csdn.net/qq_29697901/article/details/88730706
今日推荐