Java 传参时修改参数内容

1 篇文章 0 订阅

以下时个人观点:

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();
    }

}

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值