一、用ArrayList实例
要求:
将自定义对象作为元素存到ArrayList集合中,并去除重复元素。
比如:存人对象。同姓名同年龄,视为同一个人。为重复元素。
分析:
1.对人描述,将数据封装进入对象
2.定义容器,将人存入。
3.取出。
实例代码如下;
import java.util.*;
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;
}
/*
public boolean equals(Object obj)//集合元素Person的equals方法
{
if(!(obj instanceof Person))
return false;
Person p = (Person) obj;
return this.name.equals(p.name)&&(this.age==p.age);
}
*/
}
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("zhangsang",11));
al.add(new Person("zhangsang",21));//add(Object obj)// Object obj = Person("zhangsang",21) 向上转型
al.add(new Person("lisi",55));
al.add(new Person("zhangsang",11));
al.add(new Person("lihong",89));
//sop(al);
//al = singalElement(al);
sop("remove 03 : "+al.remove(new Person("lisi02",32)));//取消注释:集合元素Person的equals方法 看两者效果
Iterator it = al.iterator();
while(it.hasNext())
{
//sop(it.next().getName()+":"+it.next().getAge());//【编译出错】Object 为Person的父类 编译看父类(多态) 这里需要强制向下转型
Person p = (Person)it.next();
sop(p.getName()+":"+p.getAge());
}
}
public static ArrayList singalElement(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;
}
}
代码总结:
1.直接用集合的方法输出集合ArrayList类变al,结果是hashCode。在这里需要用迭代器输出,结果便是字符串数组。但是迭代器返回的对象是Object类,对于调用Person类中的方法,主里属于多态,类变量需要向下转型才能访问子类Person中的方法。
2.多态特点有,编译时要查问父类,运行时参考子类。因些,在Person类不复写Object类的equals方法时,没法比较Person类中的属性,所我们这里需要复写父类equals函数。
3.得出的结论是ArrayList集合甚至其父集合List 集合判断元素是否相同,都依据的是元素的equal方法。
二、List的另一个子集合LinkedList
LinkedList底层使用的是链表数据结构。增删速度很快,查寻稍慢。而ArrayList底层数据结构使用的是数组。特点:查寻速度很快,但增删稍慢。线程不同步。
LinkedList集合除了有Conllection中共性方法外,还有如下特有方法:
addFirst();从最前面增加元素
addLast();从最后面增加元素
getFrist();从最前面获取元素
getLast();从最后面获取元素,但不删除元素,如果集合中没有元素,会出现NoSuchElementException。
removeFirst();
removeLast();获取元素,但是删除元素,如果集合中没有元素,会出现NoSuchElementException。
JDk1.6出现了替代方法。
offerFirst();
offerLast();
peekFirst();
peekLast();
获取元素,但不删除元素,如果集合中没有元素,会出现NoSuchElementException。
pollFirst();
pollLast();
获取元素,但是删除元素,如果集合中没有元素,会出现NoSuchElementException。
实例代码如下:
/*
使用LinkedList模拟一个堆栈或者队列数据结构。
堆栈:先进先出,如同一个杯子。
队列:先进先出,Firs in Fisrst out FIFO 如同一个水管
*/
import java.util.*;
class DuiLie
{
private LinkedList link;
DuiLie()
{
LinkedList link = new LinkedList();
}
public void myAdd(Object obj)
{
link.addFirst(obj);
}
public Object myGet()
{
return link.removeLast();//这里改成First 就是堆栈实例
}
public boolean isNull()
{
return link.isEmpty();
}
}
class LinkedListTest
{
public static void main(String[] args)
{
DuiLie dl = new DuiLie();
dl.myAdd("java01");
dl.myAdd("java02");
dl.myAdd("java03");
dl.myAdd("java04");
while (!dl.isNull())
{
System.out.println(dl.myGet());
}
}
}