Java的对象容器Collection
Collection的子接口有Set(元素不可重复),List(元素可重复有索引),Queue(队列).
一.List
ArrayList基于数组,LinkedList基于双向链表的实现。对于快速的随机取元素来说,ArrayList速度很快(有索引),但如果需要频繁的在中间插入或删除元素,就会造成后面元素都要进行移动,这种情况就适用于LinkedList(基于链表实现,每一个元素都有前一个和后一个元素的标记,直接断开重新建立元素间的指向就可以了)。
public class Employee {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Employee(){
}
public Employee(String name) {
super();
this.name = name;
}
public Employee(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
public class ListTest {
public static void main(String[] args) {
List<string> list = new ArrayList<string>();
list.add("wanghaijun");
list.add("mayu");
list.add("liqiang");
list.add("wanghaijun");
list.add("luxiangdong");
printList(list);
list.remove(3);
System.out.println();
printList(list);
System.out.println("--------------------");
addEmp();
}
static void addEmp(){
List<Employee> list = new ArrayList<Employee>();
list.add(new Employee("wanghaijun"));
list.add(new Employee("mayu"));
list.add(new Employee("luxiangdong"));
list.add(new Employee("liqiang"));
System.out.println(list.contains(new Employee("wanghaijun")));
}
static void printList(List list){
int listLength = list.size();
for(int i = 0; i < listLength; i++){
System.out.println(list.get(i));
}
}
}
List接口有一个方法contains,它默认是根据对象的equals来判断容器中是否包含指定元素,比如上面这段ListTest类addEmp方法的最后一句输出的是false;此处的equals方法是继承自Object类,也就是用==来比较,所以new Employee("xxxx") == new Employee("yyyy")返回false(比地址)。
那这里如果要比较一个雇员该怎么办呢?我们可以重写equals方法,在Employee类增加如下方法:
<span style="white-space:pre"> </span>@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Employee other = (Employee) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
再次运行输出的就变为true了。所以这里可以得出一个结论,当用自定义类型比如Employee作为List的元素的时候,必须重写自定义类型的equals方法。