标题:LinkedList部分解析
一、解析
对于如下LinkedList<Person>
LinkedList<Person> list = new LinkedList<Person>();
1)list.add(null);//只是使节点的某个值为null
所以这样子添加没有问题
2)
System.out.println(list.contains(null));
也只是使节点的某个值为null 源码中,当传入参数等于null时,contains中判断的是x.item == null
System.out.println(list.contains(new Person("aa",18)));
/源码中,当传入参数不等于null时,使用的时equals(Object o),若这个传入的形参,所在的类【Object的子类】覆盖了Object的equals方法,【发生多态】则发生调用子类的方法o.equals(x.item)
因此若本文中的Person类没有****重写equals方法【重写equals可以方便的使用自己想要的条件,来判断相等】,则LinkedList调用的是Object的equals方法【判断两个引用是否相等】
list.add(null);//只是使节点的某个值为null
list.add(new Person("aa",18));
list.add(new Person("bb",18));
list.add(new Person("cc",18));
部分源码:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
int index = 0;
if (o == null) {
for (Node<E> x = first; x != null; x = x.next) {
if (x.item == null)
return index;
index++;
}
} else {
for (Node<E> x = first; x != null; x = x.next) {
if (o.equals(x.item))
return index;
index++;
}
}
return -1;
}
测试代码:
public class TestEquals {
public static void main(String[] args) {
LinkedList<Person> list = new LinkedList<Person>();
list.add(null);//只是使节点的某个值为null
list.add(new Person("aa",18));
list.add(new Person("bb",18));
list.add(new Person("cc",18));
// for(Person p:list) {
// System.out.println(p);
// }
//也只是使节点的某个值为null 等于null时,contains判断是x.item == null
System.out.println(list.contains(null));
//节点的某个值不为null时,contains判断是,可以发生多态,传入的为Object子类时,
//若这个子类覆盖了Object的equals方法,则调用子类的方法o.equals(x.item)
System.out.println(list.contains(new Person("aa",18)));
}
}
class Person{
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if(o==null) {
return false;
}
if(!(o instanceof Person)) {
return false;
}
Person p=(Person)o;
if(this.name.equals(p.name) && this.age==p.age) {
return true;
}
return false;
}
}
class Student extends Person{
public Student(String name, int age) {
super(name, age);
// TODO 自动生成的构造函数存根
}
}