ArrayList的学习和对象之间比较的一些理解

来源:互联网 发布:java api 编辑:程序博客网 时间:2024/05/18 05:34

         最近做的项目经常用到ArrayList,由于以前对java一些基础知识没仔细滴弄明白,所以出现了好多滴bug,弄的晕头转向滴,一个不注重基础的菜鸟,现在终于懂得基础的重要,开始慢慢积累了。可怜

    首先我碰到的第一个问题是:有个简单的Test类, 我建立2个对象   Test t1 = new Test(); Test t2 = new Test();,这个2个对象是不是相等的System.out.println(t1.equals(t2)) 很显然输出false,对象的equals(Object)方法和String对象的equals(Object)是不同的,Object对象的equals方法:

 public boolean equals(Object obj) {
return (this == obj);
    }

而String对象滴equals方法为:

 public boolean equals(Object anObject) {
if (this == anObject) {
   return true;
}
if (anObject instanceof String) {
   String anotherString = (String)anObject;

           //此处的count为改String类的长度 有多少个字符(character)
   int n = count;
   if (n == anotherString.count) {

               // /** The value is used for character storage.private final char value[]; */

                //一个字符数组,储存了改字符串的 字符
                char v1[] = value;
char v2[] = anotherString.value;

               //offset指当前的偏移量 开始一般为0 从索引为0开始比较
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
   if (v1[i++] != v2[j++])
return false;
}
return true;
   }
}
return false;
    }

PS: 在此说明下,==号是比较2个对象的内存地址,而基本的数据类型则是比较值如int、double、float 、char等(上例中的v1[i++] != v2[j++] 就是比较的值(字符的asciI值)),String的equals值比较值的,Object对象的equals方法则是比较了2个对象的地址(用==比较),所以要使2个对象的equals是比较对象值得话,一般都是重写equals方法。

    然后开始使用ArrayList了,ArrayList一般是使用在不确定有多少个对象,并且还会继续动态的增加或者减少的时候。 比如说经典的坦克大战游戏了, 我需要创建许多的坦克对象,用ArrayList结构储存,但当我击毙一辆坦克时,就得从当前坦克链表中移除此坦克,当到达一定时间时,我又得添加几辆坦克到当前链表中,因此我需要可以动态增长的数据结构,用链表就比较合适了。我先构造个ArrayList<Tank>对象的链表,当我需要坦克时,我就创建一辆坦克,并掉用链表的add(E Object)方法,将坦克添加到链表中,当我击毙一辆坦克时,就调用remove(E Object)方法移除此坦克(PS:E 是使用了泛型),对于此种需求链表结构就比较好维护。

   说了链表的维护,开始说说我的问题了,首先看看下面一段代码:

ArrayList<Test> alTest = new ArrayList<Test>

Test t1 = new Test();

alTest.add(t1);

alTest.add(t2);

System.out.println(alTest.size());//输出2

System.out.println(alTest.get(0) == alTest.get(1));//输出true


此例子说明了,add添加了2个Test对象,但这个2个对象是相等的(内存地址一样),说明2个对象是同一个,alTest是添加了1个对象2次(没有覆盖)。

[PS:在此说下Test类的结构 Class Test{int i,public Test(){ i = 0; }  }       ]

t1.i = 2;

for(Test t:alTest){

System.out.println(t.i);

}

//输出 2,2

此部分代码充分的说明了是同一个对象,并且add的不是拷贝,而只是此对象的引用,也就是说:没有再构造一个新的Test对象在ArrayList中。

  在此只是复习下java的基础而已,本人是从事android开发的,菜鸟一个,遇到过许多基础问题(往往是忽略了这些,出现了很多bug,调试了相当长时间),多多记录,希望能和大家一起讨论,一起成长!

原创粉丝点击