java - ArrayList问题 ArrayList list = new ArrayList();String str1 = "aa";list.add(str1);System.out.println(list.get(0));/** 输出 :aa */str1 = "bb";System.out.println(list.get(0));/** 输出 :aa */既然ArrayList存放的是引用, 为什么上面的输出始终是aa, 第二次不是bb呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 String str1 = "aa";//str1存的是"aa"的地址 打个比方是0x001;list.add(0x001);str1 = "bb";//更改了str1的值变成了0x002;System.out.println(list.get(0));实际上还是0x001 这个你可以了解一下JAVA的值传递.实际"aa"是一个对象,在相当于new String("aa"),str1是一个引用,指向"aa"所在的地址.调用list.add(str1)的时候,传递给list对象的是"aa"对象所对应的地址当执行str1="bb"的时候是把str1引用指向了另一个地址,实际上这时候堆中有两个字符串对象,"aa"和"bb"lsit.get(0)指向"aa",str1指向"bb".可能描述的比较麻烦,不知道你能不能看明白,如果不明白建议看一下值传递及Java的内存机制. String 不是引用类型。你的代码情况执行后,数组的结果如下:ArrayList list = new ArrayList();list[0] = "aa";所以不管你怎么去list.get(0)都是返回aa String是个特殊情况,正常情况你只要把它当成值类型使用就可以了。包括你现在的情况 一楼、二楼说的都对。一楼比较清晰点。二楼有点繁。你的List中保存的是String类型的地址,其实不是地址所以不管str1怎么变,你的List中的值还是之前的那个地址...... 多谢, 也就是说 ‘引用’就 = ‘地址’,因为引用里面存放的就是地址的值, list里面存放的既是引用, 又是地址。 可以这么理解吧? 你所增加到list的值是aa,即使改变了str1的值,但是你并没有改变list的值,况且对于list.get(0)来说只有aa一个值 因为String是不可变类,如果想看效果的话,可以定义一个类,如果通过修改对象的属性要看效果。 核心部分就是JAVA值传递,这个很简单的.上网找一下相关的说明介绍就可以了. 对对,1 、2 楼都说的蛮好的,LZ可以想象一下“图”的内存空间,str1 只是一个引用,传递给list 的时候把str1自己的 地址”值“传递给list,然后他指向另一个对象“bb”,打算你list里面 的值和他是没再有关系了。 这样实现代码,就可以输出两个都是aa,import java.util.ArrayList;import java.util.List;public class ArrayListTest{public static void main(String [] args){List <String> list = new ArrayList<String>();String str1 = "aa";list.add(str1);System.out.println(list.get(0));/** 输出 :aa */str1 = "bb";System.out.println(list.get(0));}} 句柄-->对象内存地址 str1是句柄,list.add(str1);首先list也是由数组组成的。假如是date[] 数组。而上面的list.add(str1)的意思是 date[0]=str1所指向的对象。所以date[m]指向的也就是某一个地址,不会受到改变。然后str1指向了另外一个地址,也就是跟date[0]没有关系。也就是某些大神说的,只有值传递,没有引用传递。 在java里面,只有值传递,没有引用传递。 "aa"相当于一个地址,将这个地址放入到了ArrayList里,然后让str指向另一个地址"bb",但是存入到ArrayList的地址还是指向对象"aa" 基于java的图片里面的字符识别? 新手问题,,,安装jdk和NetBeans的组合包完成后报错 高手帮我看看与什么问题 JComboBox的值和显示分离 DownloadAction下载文件 如何实现像FTP一样的下载任务和百分比的时时更新 applet的jdbc问题,高手救命!! 关于路径设置的问题,问了三遍怎么就没人回答呢??? 关于java socket编程中服务器与客户机通信的问题。怎样实时现实对方的信息。 如何得到从一个弹出的窗体中的输入框录入的字符? 请问,Java如何使用多线程重绘?有哪几种方法,哪种比较好? 弱弱的问一句,我怎么把action里的一个数组传递到JSP页面
list.add(0x001);
str1 = "bb";//更改了str1的值变成了0x002;
System.out.println(list.get(0));实际上还是0x001
lsit.get(0)指向"aa",str1指向"bb".可能描述的比较麻烦,不知道你能不能看明白,如果不明白建议看一下值传递及Java的内存机制.
你的代码情况执行后,数组的结果如下:
ArrayList list = new ArrayList();
list[0] = "aa";所以不管你怎么去list.get(0)都是返回aa
所以不管str1怎么变,你的List中的值还是之前的那个地址......
多谢, 也就是说 ‘引用’就 = ‘地址’,因为引用里面存放的就是地址的值, list里面存放的既是引用, 又是地址。 可以这么理解吧?
如果想看效果的话,可以定义一个类,如果通过修改对象的属性要看效果。
import java.util.ArrayList;
import java.util.List;
public class ArrayListTest
{
public static void main(String [] args)
{
List <String> list = new ArrayList<String>();
String str1 = "aa";
list.add(str1);
System.out.println(list.get(0));
/** 输出 :aa */
str1 = "bb";
System.out.println(list.get(0));
}
}