赋值问题

grinal 2014-10-20 03:59:26
ArrayList list= new ArrayList();
list.add("aaaa");
list.add(new ArrayList());
ArrayList list1=(ArrayList) list.get(1);
list1.add("2312");
list1.add("123123123");
String ssss=(String) list.get(0);
ssss="121weq";
那么问题来了,这时候取list.get(0),取到的是"aaaa",取list.get(1),取到的是list1;
请问谁能解释一下。
...全文
215 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
woshitaisha 2014-10-21
  • 打赏
  • 举报
回复
还是建议用泛型吧! 这样就是在水里加雪碧,谁知道容器里面装的是什么
lliiqiang 2014-10-21
  • 打赏
  • 举报
回复
list.get(0)中一直是"aaaa"字符串,赋给ssss的值,ssss自己指向新的对象,但是list,get(0)仍然指向原来字符串. list.get(1)一直存储ArrayList对象,只要这个对象内容改变,它访问这个对象获得的内容也跟着改变.
罗博士 2014-10-21
  • 打赏
  • 举报
回复
引用 6 楼 shixitong 的回复:
其实楼主可以去看看java编程思想的第三章赋值相关的说明,基本类型和类类型赋值
支持5、6楼,看看引用赋值以及不可变类的涵义。
shixitong 2014-10-21
  • 打赏
  • 举报
回复
其实楼主可以去看看java编程思想的第三章赋值相关的说明,基本类型和类类型赋值
coffee-time 2014-10-21
  • 打赏
  • 举报
回复
引用 4 楼 yegongjie123 的回复:
哥哥们,你们能审队题吗? list.get(0)赋值给String ssss后,对ssss操作不影响list.get(0); 而把list.get(1)赋值给list1后,在list1中添加了两个元素此时取list.get(1)时能取到这两个元素,这说明list.get(1)被修改了。 同样赋值,String 未 修改,arraylist修改了。 我想的是string 只赋了值,arraylist却赋了地址, 那么问题就来了,java中的“=”赋值的原理是什么。 如果class a{ String a; String[] aa; } 那赋值是什么,难道a是赋值,aa是赋的地址吗
大家都审错题,就是你自己的问题了,如果4#的话贴到1#的话就不会有人审错了。 java中的"="可以理解为值传递,等号右边的值传给左边,只不过对象传的是地址这个值,基本类型传的是数值。 你问这个问题是因为你没搞清String是特殊对象,不存在什么string只赋了值这种事,"abc"在java中不是一个值,而是一个隐式的字符串对象,所以才可以调用"abc".toString()这种方法。 此外,java中String不是存在堆内,而是string pool中,其本身是不可变对象,所以你当然不能改变它。
grinal 2014-10-21
  • 打赏
  • 举报
回复
哥哥们,你们能审队题吗? list.get(0)赋值给String ssss后,对ssss操作不影响list.get(0); 而把list.get(1)赋值给list1后,在list1中添加了两个元素此时取list.get(1)时能取到这两个元素,这说明list.get(1)被修改了。 同样赋值,String 未 修改,arraylist修改了。 我想的是string 只赋了值,arraylist却赋了地址, 那么问题就来了,java中的“=”赋值的原理是什么。 如果class a{ String a; String[] aa; } 那赋值是什么,难道a是赋值,aa是赋的地址吗
gz_Java_Se 2014-10-21
  • 打赏
  • 举报
回复
你有一个篮子,你往篮子里放了玉米和一个书包,书包里又有苹果和桔子,默认存放是有顺序的, 好,当list.get(0)时,得到的是玉米。当list.get(1)的时候就应该是个书包,书包又看做是一个集合。又能从里面 一次拿出苹果核桔子。
h576497619m 2014-10-21
  • 打赏
  • 举报
回复
引用 9 楼 h576497619m 的回复:
这里问的大概就是字符串为什么没有变,因为字符串是final类,比较特殊,具体的应该可以从楼上的一些回答找到答案。
不好意思,解释不到位 关于集合: 如果是普通对象,则存引用 如果是基础数据类型,则存值 字符串属于特殊的引用类型,有它自己的常量池,创建出的字符串会存在常量池中,是无法修改的 则: 1>.list.add("aaaa");//list.get(0)指向aaaa的常量池地址 2>.String ssss=(String) list.get(0);//ssss指向aaaa的常量池地址 3>.ssss="121weq";//ssss修改为指向121weq的常量池地址 所以list存的始终是常量池地址,是不受ssss影响的 那么即使将步骤改为2,1,3,.list.add("aaaa");改为list.add(ssss);,list存的依然是常量池地址,同样不受ssss影响
h576497619m 2014-10-21
  • 打赏
  • 举报
回复
这里问的大概就是字符串为什么没有变,因为字符串是final类,比较特殊,具体的应该可以从楼上的一些回答找到答案。
Paul_ZJ 2014-10-20
  • 打赏
  • 举报
回复
首先需要明确的是Arraylist里面存的是什么??Arraylist里面存放的都是基本对象类型Object, 也就是说从Arraylist里面取元素的时候我们并不知道元素的类型(String或者Arraylist)。 当我们需要从Arraylist里面获取元素的时候我们必须知道这个元素在没有放到Arraylist里面之前的类型,然后将该元素强制转化为此类型: ArrayList list1=(ArrayList) list.get(1); String ssss=(String) list.get(0); 为什么第一个强制转化为Arraylist,第二个强制转化为String??废话,在放到Arraylist之前,第一个元素的类型就是Arraylist,去出来的时候当然应该强制转化为Arraylist。 我们做一个假设,一个Arraylist对象,放到Arraylist当中,作为其中的一个元素,取出来的时候,强制将这个元素转化成String类型,这样还有什么后果???还是废话,肯定出错!! 所以用Arraylist的时候,最关键的是放进Arraylist的元素原本是什么类型,取出来的时候一定要记得将元素强制转化为这个类型,否则Arraylist是没办法用的
WinSpread 2014-10-20
  • 打赏
  • 举报
回复
It does not have to allocate a node object for each element in the List ArrayList 的元素类型默认是不限定的 这意味着,任何类型的对象都可以作为 ArrayList 的元素 那么,问题解决了
qzw1210 2014-10-20
  • 打赏
  • 举报
回复
list.add(new ArrayList()); ArrayList list1=(ArrayList) list.get(1); 因为你把new ArrayList()赋给list1了。

62,620

社区成员

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

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