黑马程序员--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();
}
}

posted on 2012-03-26 03:54  黑马程序员  阅读(335)  评论(0编辑  收藏  举报

导航