最近做的项目经常用到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,调试了相当长时间),多多记录,希望能和大家一起讨论,一起成长!