这代码很怪异啊,哪位大神给解释下

有点儿困 2019-07-03 05:51:49
public static void main(String[] args) {
Test7 t = new Test7();

Map<String,String> map = new HashMap<String,String>();
map.put("test","123qwe");
t.test(map);
for(String key:map.keySet()){
String value = map.get(key);
System.out.println(key+":"+value);
}

String s = "123qwe";
t.test1(s);
System.out.println(s);
}

public void test(Map s){
s.put("test","asd");
s.put("tt","123");
}

public void test1(String s){
s.concat("123");
}

输出结果:

tt:123
test:asd
123qwe
...全文
146 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
有点儿困 2019-07-04
  • 打赏
  • 举报
回复
引用 14 楼 maradona1984 的回复:
[quote=引用 13 楼 有点儿困 的回复:]
你们说的对,String对象是不可改变的,修改字符串的值实际上是在重新创建实例并赋值,很早的东西给忘记了

跟对象不可变一毛钱关系都没[/quote]
maradona1984 2019-07-04
  • 打赏
  • 举报
回复
引用 13 楼 有点儿困 的回复:
你们说的对,String对象是不可改变的,修改字符串的值实际上是在重新创建实例并赋值,很早的东西给忘记了
跟对象不可变一毛钱关系都没
有点儿困 2019-07-04
  • 打赏
  • 举报
回复
你们说的对,String对象是不可改变的,修改字符串的值实际上是在重新创建实例并赋值,很早的东西给忘记了
maradona1984 2019-07-04
  • 打赏
  • 举报
回复
引用 8 楼 若城 的回复:
[quote=引用 6 楼 maradona1984 的回复:] [quote=引用 5 楼 若城 的回复:] 这个问题很简单啊,你只要看一下concat()这个方法的源码你就知道了,首先,String类是不可变类,一旦对象创建,就已经不可变了,那么s就是指向“123qwe”,在你的test1()方法里,你虽然通过concat()得到了一个新的字符串,但是s仍然指向的是“123qwe”,所以你输出s他是不会改变的,明确基础类性质就可以了
你说的不够对,不管String类是不是final修饰,都对结果不影响 s变量的指向是可以改变的,除非s变量被final修饰(反射也可以修改被final修饰的变量的指向) 但你的结果推断是对的,过程是错误的,test1方法体内无论做什么,s的指向都不会变(反射修改常量池什么的咱就不讨论了),反射修改System.out这个对象什么的也不讨论 如果要解释map修改为啥能成功,s为啥不能成功,我觉得建议去补下基础知识,或者根据现象推断原因,老生常谈,到处都能找到的知识[/quote] 不过老哥实在是严谨,学习了[/quote] 写代码就是个严谨的活,大脑里常年模拟代码运行,自然会以计算机的角度看待问题
♥♡♥♡ 2019-07-04
  • 打赏
  • 举报
回复
你可以理解为 test1里面 就是副本 方法执行完 就清除了 S变量对它的指向 最后S变量还是会指向原来的。
maradona1984 2019-07-04
  • 打赏
  • 举报
回复
引用 7 楼 若城 的回复:
[quote=引用 6 楼 maradona1984 的回复:] [quote=引用 5 楼 若城 的回复:] 这个问题很简单啊,你只要看一下concat()这个方法的源码你就知道了,首先,String类是不可变类,一旦对象创建,就已经不可变了,那么s就是指向“123qwe”,在你的test1()方法里,你虽然通过concat()得到了一个新的字符串,但是s仍然指向的是“123qwe”,所以你输出s他是不会改变的,明确基础类性质就可以了
你说的不够对,不管String类是不是final修饰,都对结果不影响 s变量的指向是可以改变的,除非s变量被final修饰(反射也可以修改被final修饰的变量的指向) 但你的结果推断是对的,过程是错误的,test1方法体内无论做什么,s的指向都不会变(反射修改常量池什么的咱就不讨论了),反射修改System.out这个对象什么的也不讨论 如果要解释map修改为啥能成功,s为啥不能成功,我觉得建议去补下基础知识,或者根据现象推断原因,老生常谈,到处都能找到的知识[/quote] 我又没说s变量的指向不可变,我只是说s仍然指向“123qwe”啊[/quote] 后面的回复多打了个不字
maradona1984 2019-07-04
  • 打赏
  • 举报
回复
引用 7 楼 若城 的回复:
[quote=引用 6 楼 maradona1984 的回复:] [quote=引用 5 楼 若城 的回复:] 这个问题很简单啊,你只要看一下concat()这个方法的源码你就知道了,首先,String类是不可变类,一旦对象创建,就已经不可变了,那么s就是指向“123qwe”,在你的test1()方法里,你虽然通过concat()得到了一个新的字符串,但是s仍然指向的是“123qwe”,所以你输出s他是不会改变的,明确基础类性质就可以了
你说的不够对,不管String类是不是final修饰,都对结果不影响 s变量的指向是可以改变的,除非s变量被final修饰(反射也可以修改被final修饰的变量的指向) 但你的结果推断是对的,过程是错误的,test1方法体内无论做什么,s的指向都不会变(反射修改常量池什么的咱就不讨论了),反射修改System.out这个对象什么的也不讨论 如果要解释map修改为啥能成功,s为啥不能成功,我觉得建议去补下基础知识,或者根据现象推断原因,老生常谈,到处都能找到的知识[/quote] 我又没说s变量的指向不可变,我只是说s仍然指向“123qwe”啊[/quote] "一旦对象创建,就已经不可变了"这句话具有歧义,final修饰类仅仅是不让类不能被继承,而不存在不可变的特性,只有修饰变量才有这种特性,所以我默认你的意思是s不可变,如果你不是说s不可变,那这句话自然也是不正确的
若城 2019-07-04
  • 打赏
  • 举报
回复
引用 6 楼 maradona1984 的回复:
[quote=引用 5 楼 若城 的回复:] 这个问题很简单啊,你只要看一下concat()这个方法的源码你就知道了,首先,String类是不可变类,一旦对象创建,就已经不可变了,那么s就是指向“123qwe”,在你的test1()方法里,你虽然通过concat()得到了一个新的字符串,但是s仍然指向的是“123qwe”,所以你输出s他是不会改变的,明确基础类性质就可以了
你说的不够对,不管String类是不是final修饰,都对结果不影响 s变量的指向是可以改变的,除非s变量被final修饰(反射也可以修改被final修饰的变量的指向) 但你的结果推断是对的,过程是错误的,test1方法体内无论做什么,s的指向都不会变(反射修改常量池什么的咱就不讨论了),反射修改System.out这个对象什么的也不讨论 如果要解释map修改为啥能成功,s为啥不能成功,我觉得建议去补下基础知识,或者根据现象推断原因,老生常谈,到处都能找到的知识[/quote] 不过老哥实在是严谨,学习了
若城 2019-07-04
  • 打赏
  • 举报
回复
引用 6 楼 maradona1984 的回复:
[quote=引用 5 楼 若城 的回复:] 这个问题很简单啊,你只要看一下concat()这个方法的源码你就知道了,首先,String类是不可变类,一旦对象创建,就已经不可变了,那么s就是指向“123qwe”,在你的test1()方法里,你虽然通过concat()得到了一个新的字符串,但是s仍然指向的是“123qwe”,所以你输出s他是不会改变的,明确基础类性质就可以了
你说的不够对,不管String类是不是final修饰,都对结果不影响 s变量的指向是可以改变的,除非s变量被final修饰(反射也可以修改被final修饰的变量的指向) 但你的结果推断是对的,过程是错误的,test1方法体内无论做什么,s的指向都不会变(反射修改常量池什么的咱就不讨论了),反射修改System.out这个对象什么的也不讨论 如果要解释map修改为啥能成功,s为啥不能成功,我觉得建议去补下基础知识,或者根据现象推断原因,老生常谈,到处都能找到的知识[/quote] 我又没说s变量的指向不可变,我只是说s仍然指向“123qwe”啊
maradona1984 2019-07-04
  • 打赏
  • 举报
回复
引用 5 楼 若城 的回复:
这个问题很简单啊,你只要看一下concat()这个方法的源码你就知道了,首先,String类是不可变类,一旦对象创建,就已经不可变了,那么s就是指向“123qwe”,在你的test1()方法里,你虽然通过concat()得到了一个新的字符串,但是s仍然指向的是“123qwe”,所以你输出s他是不会改变的,明确基础类性质就可以了
你说的不够对,不管String类是不是final修饰,都对结果不影响 s变量的指向是可以改变的,除非s变量被final修饰(反射也可以修改被final修饰的变量的指向) 但你的结果推断是对的,过程是错误的,test1方法体内无论做什么,s的指向都不会变(反射修改常量池什么的咱就不讨论了),反射修改System.out这个对象什么的也不讨论 如果要解释map修改为啥能成功,s为啥不能成功,我觉得建议去补下基础知识,或者根据现象推断原因,老生常谈,到处都能找到的知识
若城 2019-07-04
  • 打赏
  • 举报
回复
这个问题很简单啊,你只要看一下concat()这个方法的源码你就知道了,首先,String类是不可变类,一旦对象创建,就已经不可变了,那么s就是指向“123qwe”,在你的test1()方法里,你虽然通过concat()得到了一个新的字符串,但是s仍然指向的是“123qwe”,所以你输出s他是不会改变的,明确基础类性质就可以了
有点儿困 2019-07-03
  • 打赏
  • 举报
回复
难道是因为map是对象,String是变量的关系?
有点儿困 2019-07-03
  • 打赏
  • 举报
回复
按照我的理解,String的问题是不同对象,所以不会改变,问题是Map不是也是不同对象吗?为啥改变了?
有点儿困 2019-07-03
  • 打赏
  • 举报
回复
我的问题是:map就改变了,String为啥没变

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧