概述
最近遇到了一个问题,大家看过代码之后就会名白
问题:两者都为引用类型,为什么第一种情况能得到修改过后的值,而第二种不能?
// 案例1
Customer customer = new Customer();
customer.setCust_name("aaa");
List<Customer> listTest = new ArrayList<Customer>();
listTest.add(customer);
Map<String,Customer> map1 = new HashMap<String, Customer>();
map1.put("1",customer);
Customer customer1 = map1.get("1");
customer.setCust_name("令狐冲冲冲");
System.out.println("a的值为多少Map:"+map1.get("1").getCust_name()); // 输出令狐冲冲冲
System.out.println("a的值为多少List:"+listTest.get(0).getCust_name());// 输出令狐冲冲冲
// 两者都为引用类型,为什么第一种情况能得到修改过后的值,而第二种不能
// 案例2
Integer a = 1;
List<Integer> listTest2 = new ArrayList<Integer>();
listTest2.add(a);
Map<String,Integer> map2 = new HashMap<String, Integer>();
map2.put("a",a);
Integer b = map2.get("a");
b=666;
System.out.println("a的值为多少Map2:"+map1.get("a").getCust_name());// 输出1
System.out.println("a的值为多少ListTest2:"+listTest.get(0).getCust_name());// 输出1
拆箱:将引用类型转换成基本类型
装箱:将基本类型包装成引用类型
解释:因为八种基本类型的包装类会发生拆箱和装箱操作,在我定义变量的时候(Integer a = 1;)发生装箱操作,此时为引用类型。在我从map中取值的时候,发生拆箱操作,此时的到的值为基本类型,然后我将这个基本类型有赋值给了Integer b = map2.get(“a”);。此时b也是引用类型,但是它与之前的a已经不是同一个变量了,所以取不到更改后的值,所以以后用到包装类就把它们当做基本类型来对待就成了,否则很多坑。
案例一中,是自定义的引用类型,所以不管我怎么更改,都是通过地址值,来改变该对象的属性,存和取都是通过地址来改变的,所以可以保证操作的是同一个对象,所以,能得到更改后的值。
注:String类型有不可变性,所以尽管它是引用类型,但是如果用在这里是的不到更改后的值的,因为它的不可变性。
最后向大家推荐一个八种包装类写的比较好的播客
https://www.cnblogs.com/dolphin0520/p/3780005.html
最后
以上就是缥缈铃铛为你收集整理的八种基本类型的包装类,与引用类型的问题的全部内容,希望文章能够帮你解决八种基本类型的包装类,与引用类型的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复