Collection
|-List:元素是有序的,元素可以重复,因为该集合体系有索引
|-ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快,但是增删稍慢
|-LinkedList:底层使用的是链表数据结构。特点:增删的速度很快,查询稍慢
|-Vector:底层是数组数据结构。功能和ArrayList一模一样,比ArrayList早出。但是和ArrayList有区别:Vector是线程同步,ArrayLis线程t不同步(所以ArrayList更快)
-----------------------------------------------------
演示Vector的特点:
import java.util.*;
/*
枚举就是Vector特有的取出方式
发现枚举和迭代器很相似
其实枚举和迭代是一样的,因为枚举的名称以及方法的名称都过长,所以被迭代器取代了
*/
class VectorDemo{
public static void main(String[] args){
Vector v = new Vector();
v.add("java1");
v.add("java2");
v.add("java3");
v.add("java4");
//elements方法
Enumeration en = v.elements();
while(en.hasMoreElements())
System.out.println(en.nextElement());
}
}
---------------------------------------------------------------------------
LinkedList:
特有方法:
import java.util.*;
/*
LinkedList特有方法:
addFirst();
addLast();
getFirst();获取元素,元素不被删除。如果集合中没有元素,会抛出异常(NoSuchElementException)
getLast();
removeFirst();
removeLast();获取元素,但是元素被删除。如果集合中没有元素,会抛出异常(NoSuchElementException)
在JDK1.6出现了替代方法
offerFirst();
offerLast();
peekFirst();获取元素,元素不被删除。如果集合中没有元素,会返回null
peekLast();
pollFirst();获取元素,元素被删除。如果集合中没有元素,会返回null
pollLast()
*/
class LinkedListDemo{
public static void main(String[] args){
LinkedList link = new LinkedList();
link.addFirst("java1");
link.addFirst("java2");
link.addFirst("java3");
link.addFirst("java4");
sop(link);//打印结果为[java4,java3,java2,java1]
}
public static void sop(Object obj){
System.out.println(obj);
}
}
-----------------------------------------------------
ArrayList练习:去除重复元素
import java.util.*;
class ArrayListTest{
public static void sop(Object obj){
System.out.println(obj);
}
public static void main(String[] args){
ArrayList al = new ArrayList();
al.add("java1");
al.add("java2");
al.add("java1");
al.add("java2");
al.add("java1");
al.add("java3");
sop(al);
al = singleElement(al);
sop(al);
}
public static ArrayList singleElement(ArrayList al){
//定义一个临时容器
ArrayList newAl = new ArrayList();
Iterator it = al.iterator();
while(it.hasNext()){
Object obj =it.next();
if(!newAl.contains(obj))
newAl.add(obj);
}
return newAl;
}
}
--------------------------------------------------
ArrayList练习2(升级):
将自定义对象作为元素存放到ArrayList集合中,并去除重复元素
值得注意的第一点是关于向下转型:Object类转化为示例中的Person类;第二点是用ArrayListTest1中的去除相同元素的方法在这一题中并不适用
import java.util.*;
class ArrayListTest2{
public static void sop(Object obj){
System.out.println(obj);
}
public static void main(String[] args){
ArrayList al = new ArrayList();
al.add(new Person("lisi01",30));//al.add(Object obj);//Object obj = new Person("lisi01",30);
al.add(new Person("lisi02",32));
al.add(new Person("lisi02",32));
al.add(new Person("lisi03",33));
al.add(new Person("lisi04",35));
al.add(new Person("lisi04",35));
al = singleElement(al);
Iterator it = al.iterator();
while(it.hasNext()){
Object obj = it.next();
Person p = (Person)obj;//简化成Person p =(Person)it.next();
sop(p.getName()+"...."+p.getAge());
}
}
public static ArrayList singleElement(ArrayList al){
//定义一个临时容器
ArrayList newAl = new ArrayList();
Iterator it = al.iterator();
while(it.hasNext()){
Object obj =it.next();
if(!newAl.contains(obj))
newAl.add(obj);
}
return newAl;
}
}
class Person{
private String name;
private int age;
Person(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
这是应为ArrayList不知道你判断对象是否相同的标准,它自己是根据equals方法判断,所以要重写equals
import java.util.*;
class ArrayListTest2{
public static void sop(Object obj){
System.out.println(obj);
}
public static void main(String[] args){
ArrayList al = new ArrayList();
al.add(new Person("lisi01",30));//al.add(Object obj);//Object obj = new Person("lisi01",30);
al.add(new Person("lisi02",32));
al.add(new Person("lisi02",32));
al.add(new Person("lisi03",33));
al.add(new Person("lisi04",35));
al.add(new Person("lisi04",35));
al = singleElement(al);
Iterator it = al.iterator();
while(it.hasNext()){
Object obj = it.next();
Person p = (Person)obj;//简化成Person p =(Person)it.next();
sop(p.getName()+"...."+p.getAge());
}
}
public static ArrayList singleElement(ArrayList al){
//定义一个临时容器
ArrayList newAl = new ArrayList();
Iterator it = al.iterator();
while(it.hasNext()){
Object obj =it.next();
if(!newAl.contains(obj))
newAl.add(obj);
}
return newAl;
}
}
class Person{
private String name;
private int age;
Person(String name,int age){
this.name = name;
this.age = age;
}
//重写equals方法
public boolean equals(Object obj){
if(!(obj instanceof Person))
return false;
Person p =(Person)obj;
return this.name.equals(p.name)&&this.age == p.age;//这里的equals是字符串中的equals
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
解决了。疑问:singleElement方法中并没有调用equals方法啊?其实equals方法是在底层自动被调用的,可以理解为在调用contains方法的时候调用看equals方法
结论:List集合判断元素是否相同,依据 的是元素的equals方法。其实remove方法底层调用的也是equals方法