黑马程序员--Java基础学习第十四天
一、为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
二、集合和数组同为容器,有什么不同?
数组:长度是固定的,可以存储基本数据类型和对象。
容器:长度是可变的,只能存储对象,可以存储不同类型的对象。
三、集合体系概述
四、为什么会出现这么多的容器?
每种容器对数据的存储方式不同,存储方式称之为:数据结构。
五、Collection接口
六、迭代器
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
不可以通过集合对象的方法操作集合中的元素,会发生ConcurrentModificationException异常。
七、List接口实现的类
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。List允许有相同的元素。
1、ArrayList类
底层的数据结构是数组结构,查询快,增删慢。线程不同步。允许所有元素,包括null。
2、ListIterator,List迭代器
void add(E e) 将指定的元素插入列表(可选操作)。
boolean hasNext() 以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true)。
boolean hasPrevious() 如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。
E next() 返回列表中的下一个元素。
int nextIndex() 返回对 next 的后续调用所返回元素的索引。
E previous() 返回列表中的前一个元素。
int previousIndex() 返回对 previous 的后续调用所返回元素的索引。
void remove() 从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。
void set(E e) 用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。
3、Vector类
底层的数据结构是数组结构。线程同步,性能比ArrayList低。
4、LinkedList类
底层数据结构式链表,增删快,查询慢。线程不同步。
LinkedList类特有方法:
void addFirst(E e) 将指定元素插入此列表的开头。
void addLast(E e) 将指定元素添加到此列表的结尾。
E getFirst() 返回此列表的第一个元素。
E getLast() 返回此列表的最后一个元素。
E removeFirst() 移除并返回此列表的第一个元素。
E removeLast() 移除并返回此列表的最后一个元素。
如果列表为空,抛出NoSuchElementException异常。
在1.6之后出现了替换方法:
boolean offerFirst(E e) 在此列表的开头插入指定的元素。
boolean offerLast(E e) 在此列表末尾插入指定的元素。
E peekFirst() 获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。
E peekLast() 获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。
E pollFirst() 获取并移除此列表的第一个元素;如果此列表为空,则返回 null。
E pollLast() 获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。
5、ArrayList类练习
练习一、去除ArrayList集合中重复的元素
public static ArrayList singleElement(ArrayList al)
{
ArrayList newAl=new ArrayList();
Iterator itr=al.iterator();
while(itr.hasNext())
{
Object obj=itr.next();
if(!newAl.contains(obj))
newAl.add(obj);
}
return newAl;
}
练习二、将自定义对象作为元素保存到ArrayList集合中,并去除重复元素
import java.util.*;
class ArrayListDemo
{
public static void main(String[] args)
{
ArrayList al=new ArrayList();
al.add(new Person("001","zhangsan",20));
al.add(new Person("002","lisi",26));
al.add(new Person("003","wangwu",24));
al.add(new Person("003","maliu",27));
al.add(new Person("002","tianqi",28));
System.out.println(al);
ArrayList a2=singleElement(al);
System.out.println(a2);
}
public static ArrayList singleElement(ArrayList al)
{
ArrayList newAl=new ArrayList();
Iterator itr=al.iterator();
while(itr.hasNext())
{
Object obj=itr.next();
if(!newAl.contains(obj))
newAl.add(obj);
}
return newAl;
}
}
class Person
{
private String id;//id相同表示同一个人。
private String name;
private int age;
Person(String id,String name,int age)
{
this.id=id;
this.name=name;
this.age=age;
}
public String toString()
{
return "<id:"+this.id+",name:"+this.name+",age:"+age+">";
}
//List集合判断元素是否相同,依据是元素的equals()方法。
public boolean equals(Object obj)
{
if(!(obj instanceof Person))
return false;
Person p=(Person)obj;
return this.id==p.id;
}
}
6、LinkedList类练习
使用LinkedList模拟一个栈或者队列的数据结构
(1)模拟栈
class MyStack
{
private LinkedList list;
MyStack()
{
list=new LinkedList();
}
public boolean empty()
{
return list.isEmpty();
}
public Object pop()
{
return list.removeLast();
}
public void push(Object obj)
{
list.addLast(obj);
}
}
(2)模拟队列
class MyQueue
{
private LinkedList list;
MyQueue()
{
list=new LinkedList();
}
public void offer(Object obj)
{
list.addLast(obj);
}
public Object poll()
{
return list.removeFirst();
}
public boolean empty()
{
return list.isEmpty();
}
}