ArrayList类对象里装载的是对象,还是对象的引用呢?还是其它什么东西?

importjava.util.ArrayList;publicclassALittleTest3{ArrayList<String>strArray;publicALi... import java.util.ArrayList;

public class ALittleTest3
{
ArrayList<String> strArray;
public ALittleTest3()
{
strArray = new ArrayList<String>();
String a = new String("i love you");
String b = new String("i love you");

System.out.println("在把元素放进数组列表之前,数组列表的元素个数为: " +

strArray.size());

//先把a元素放入数组列表中
strArray.add(a);
System.out.println("把a对象放入数组列表后的元素个数为:" + strArray.size());
System.out.println("a对象在数组列表中的序列号为: " + strArray.indexOf(a));

//再把b元素放入数组列表中
System.out.println();
showTheResult(b);

//接着把b元素移出数组列表
strArray.remove(b);

//改变b元素里的数值
System.out.println();
b = "hate";
showTheResult(b);
}

public void showTheResult(String b)
{
strArray.add(b);
System.out.println("把b对象放入数组列表后的元素个数为:" + strArray.size());
System.out.println("b对象在数组列表中的序列号为:" + strArray.indexOf(b));
}

public static void main(String[] args)
{
new ALittleTest3();
}
}

以上程序的结果为:
在把元素放进数组列表之前,数组列表的元素个数为: 0
把a对象放入数组列表后的元素个数为:1
a对象在数组列表中的序列号为: 0

把b对象放入数组列表后的元素个数为:2
b对象在数组列表中的序列号为:0

把b对象放入数组列表后的元素个数为:2
b对象在数组列表中的序列号为:1

我从结果中发现一些很奇怪的东西:
1、当我字符串引用变量a与b的值相同时,两者在数组列表中的序列号是一样的,均为0;
2、当这两个变量不同时,a与b在列表中的序列号不同:一个为0,另一个为1;
3、当列表中的元素个数均为2,没发生变化。
问题:为什么其序列号不同呢?为什么元素个数总为2呢?
对于结果,我存在疑问就是:
如果认为a和b引用了同一个对象,那么数组列表中的元素个数为什么是2.
如果认为a和b引用了不同的对象,那么数组列表中的元素b的序列号在开始时为0,后又变为1.
这样的结果是不是由于String类本身的一些特殊性造成的呢?
---------------------------------------
你说:String s = "a" + "b" + "c";这条语句执行过程中会产生5个String对象。为什么呢?执行之后不就是得到一个名叫s的对象吗?难道执行之后,5个对象会合成一个对象吗?你是不是认为有这样一个过程:"a"和"b"和"c"就是执行过程中产生的3个对象,然后"a"和"b"通过+符号合成第四个对象(即"a"+"b"),然后第四个对象再和"c"对象合成第五个对象,也就是最终的对象s。
不好意思,由于自己还是个java菜鸟,所以对String类的了解只是表面的东西。
展开
 我来答
依土天羽
2008-10-22 · TA获得超过289个赞
知道小有建树答主
回答量:337
采纳率:100%
帮助的人:399万
展开全部
这个问题其实只要看看ArrayList的jdoc就可以明白了,你使用ArrayList的add方法向ArrayList中添加了两个对象,所以,它的元素个数为2,你使用indexOf来查找对象,在ArrayList中indexOf方法实际上是调用对象的equals方法进行比较,并返回第一个符合条件的对象位置,所以,当你的两个字符串内容相同时使用equals方法比较的话,当然会返回第一个对象的位置了.
--
关于补充:
这么说吧,你把arraylist看作为一个链表,向其中添加对象就是为链表创建一个新的对象指针,不管你放入的对象是一个还是多个同样的,他都是会创建一个对应的对象指针的所以size会为2
"如果认为a和b引用了不同的对象,那么数组列表中的元素b的序列号在开始时为0,后又变为1. "我觉得这种情况是不会出现的,你的程序中之所以第二次放入b的时候序号变为1是因为第二个b的内容和a不同,可以看一下arraylist.indexof的说明.跟string特性没有关系,indexof方法会 调用 对象的 equals方法 string的equals方法不就是对串的内容作比较么

换一种想法,如果你自己作一个类,声明两个对象并放入arraylist中,就算你对象内容完全一样,但是没有覆写equals方法的话indexof 的结果就不会出现b = 0的情况,但是如果你按照string的equals方式覆写equals(就是比对内容),那么当a,b对象内容一样的情况下,用indexof 查找得到的一定是先放入arraylist的对象的位置

所以,出现你说的那种情况是由arraylist内对象的equals方法的不同所造成的,而不是string的特殊性

string的特殊性应该是内容不可变,如: String s = "a" + "b" + "c";这条语句执行过程中会产生5个String对象

-------------------------------------------
String,之所以我说String s = "a" + "b" + "c";会产生5个字符串对象的原因就是String的内容是不可变的,就是说,上面的语句中首先有三个字符串对象("a" , "b", "c") 然后,"a" + "b"产生第四个字符串"ab", "ab" + "c" 产生最后一个字符串"abc"所以一共是5个,这是String的特点,其他的类似Integer, Long, Double等(注意,这是类,不是基本类型)也都有这个特点,具体的可以看JDK帮助文档,或者看看java的源程序
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ajax_2003
2008-10-21 · TA获得超过4995个赞
知道大有可为答主
回答量:2628
采纳率:0%
帮助的人:2464万
展开全部
ArrayList也好数组也好在存放对象的时候他们存入的都是对那个对象的引用
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
雪鹤百芸溪
2019-09-22 · TA获得超过1109个赞
知道小有建树答主
回答量:1531
采纳率:100%
帮助的人:6.9万
展开全部
你好!
ArrayList也好数组也好在存放对象的时候他们存入的都是对那个对象的引用
希望对你有所帮助,望采纳。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式