------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流-----
一、概述
1、为什么会出现这个多余的容器呢?
因为每一个容器对数据的存储方式有所不同。
这个存储方式称之为:数据结构。
2、数组和集合类同是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。
数组中可以存储基本数据类型,集合只能存储对象。
3、集合类的特点
集合只用于存储对象,其实集合中存储的都是对象的引用(地址)
集合长度是可变的,
集合可以存储不同类型的对象。
4、集合框架的构成以及分类
5、集合框架中的常用接口
Collection接口中有两个常用的子接口:List(列表),Set(集)。
5.1、List:可存放重复元素,元素存取是有序的
5.1.1 ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。(可变长度数组:默认长度为10的数组 ,每次增加50%的长度)
5.1.2 LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
5.1.3 Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。(此为枚举功能)(可变长度数组:默认长度为10的数组 ,每次增加100%的长度)
5.2、Set:不可以存放重复元素,元素存取是无序的
二、collection常用的共性方法
1、共性方法“增、删、改、查”
从上图中可以看出“collection”是属于父类,故其中的方法都属于共性方法。
Collection定义了集合框架的共性功能。
import java.util.*;(因“collection”是包java.util中的功能故在使用前需先导包)
1.1,添加
boolean addAll(Collection<? extendsE> c);
1.2,删除
删除集合中的某个元素 boolean remove(Object o);
清空集合 void clear();
1.3,判断
判断某个元素是否在该集合中存在 boolean contains(Object o);
判断某个集合是否在该集合中存在 包含的集合.containsAll(被包含的集合);
判断整个集合是否为空 boolean isEmpty();
1.4,获取
集合长度 int size();
1.5,交集
获取交集: boolean retainAll(Collection<?> c)
删除交集: boolean removeAll(Collection<?> c)
1.6,集合变数组
Object[] toArray();
注意: 1,add方法的参数类型是Object。以便于接收任意类型对象。
2,集合中存储的都是对象的引用(地址)
3,具体程序用法举例请参阅JIHE1;
2、迭代器
定义:集合中取出元素的方式。
迭代器是取出方式,会直接访问集合中的元素。
所以将迭代器以内部类的形式来进行描述。
通过容器的iterator()方法获取该内部类的对象。
迭代器中的常用方法 (共性迭代器有很大局限性,只有“删”操作)
1,boolean hasNext(),如果下一个仍有元素可以迭代,则返回TRUE
2,E next(), 返回迭代的下一个元素
3,void remove() 从迭代器指向的COLLECTION中移除迭代器返回的最后一个元素(可选操作 )
注意:1、此为迭代器的共性方法(即collection中的迭代器的方法),只有移除操作,故有局限性。
2、使用迭代器时,每调用一次Next(),就要调用hasNext()判断一次。(不可以调用一次hasNext()而多次调用Next())
三、 各个常用的子接口
1、List(列表)接口
凡是可以操作角标的方法都是该体系特有的方法。(示例详见ListDemo)
1.1 、ArrayList函数常用的特有方法
1.1.1、增加
void add(int index, E element);在指定位置添加元素
boolean addAll(int index, Collection<? extendsE> c);
1.1. 2、删除
Eremove(int index); 移除列表中指定位置的元素
1.1.3、修改
Eset(int index, E element); 用指定元素替换列表中指定位置的元素
1.1.4、查询
List<E> subList(区间开始角标,区间结束角标)获取某区间的元素(含头不含尾)
int indexOf(预获取元素):获取指定元素的位置。
ListIterator listIterator();
ListIterator listIterator(int index);
将容器中的元素都打印一遍
方法一:For循环
for(int x=0;x<a1.size();x++)
{
System.out.println(a1.get(x));
}
方法二:迭代器
ArrayList it = new ArrayList();
while(a1.hasNext)
{
System.out.println(a1.next());
}
1.2 、List接口的特有迭代器ListIterator
1.2.1此迭代器的特有功能
1.2.1.1 增void add() 将指定的元素插入列表
1.2.1.2 删 voidremove() 移除
1.2.1.4 查hasPrevious()如果以逆向遍历列表,列表迭代器有多个元素,则返回true
Previous()返回列表中的前一个元素。
注意:1、ArrayList判断元素是否存在,以及删除等操作,依赖方法equals(equals的父类是Object)。
2、并发修改异常(ConcurrentModificationException)
在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生并发修改异常。所以,在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口迭代器ListIterator,这样在迭代的时候 可以随意进行增删改查等各种操作。
1.3、Vector枚举函数(几乎不用)
枚举是Vector特有的取出方式。
其实枚举和迭代是一样的,因为枚举的名称以及方法的名称都过长,所以被迭代器取代了。
特有方法: Enumeration<E> Elements() 返回此向量的组件的枚举。
Enumeration接口中的两个常用方法:
booleanhasMoreElements()测试此枚举是否包含更多的元素
EnextElement() 返回此枚举的下一个元素
代码示例:
Vectorv = new Vector();
v.add("java01");
Enumeration en = v.elements();
while(en.hasMoreElements())
{
System.out.println(en.nextElement());
}
1.4、 LinkedList中的特有方法
void addFirst(E e) 将指定元素插入此列表的开头
void addLast(E e) 将指定元素添加到此列表的结尾。
E getFirst()返回此列表的第一个元素。
E getLast()返回此列表的最后一个元素
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
E removeFirst() 移除并返回此列表的第一个元素。
E removeLast() 移除并返回此列表的最后一个元素。
获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException
在JDK1.6出现了替代方法。
boolean offerFirst(E e) 在此列表的开头插入指定的元素。
boolean offerLast(E e) 在此列表末尾插入指定的元素。
E peek() 获取但不移除此列表的头(第一个元素)。
E peekFirst();获取但不移除此列表的第一个元素;如果此列表为空,则返回null。
E peekLast();获取但不移除此列表的最后一个元素如果此列表为空,则返回null。
获取元素,但不删除元素。如果集合中没有元素,会返回null。
E poll() 获取并移除此列表的头(第一个元素)
E pollFirst();获取并移除此列表的第一个元素;如果此列表为空,则返回null。
E pollLast();获取并移除此列表的最后一个元素;如果此列表为空,则返回null。
获取元素,但是元素被删除。如果集合中没有元素,会返回null。
示例代码:
LinkedListlink = new LinkedList();
while(!link.isEmpty())
{
sop(link.removeLast());
}
Arraylist小练习
需求:将自定义对象作为元素存到ArrayList集合中,并去除重复元素。比如:存人对象。同姓名同年龄,视为同一个人。为重复元素。
List集合判断元素是否相同,依据是元素的equals方法。
运行结果为:
LinkedList小练习:
需求:用集合模拟堆栈和队列。堆栈特点:先进后出 如同一个杯子。队列特点:先进先出 First in First out FIFO 如同一个水管。
运行结果为 :
2、Set接口
Set接口含有两个子类: HashSet()和TreeSet();
2.1 HashSet()
底层数据结构是哈希表。
Set集合的功能和Collection是一致的,无自己的特有方法。
2.1.1 HashSet是如何保证元素唯一性的呢?
HashSet()功能是通过元素的两个方法,hashCode和equals完成的。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。
注意:
1、HashSet判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法,先判断hashcode,若哈希值不相同则不调用equals;若哈希值相同则调用equals。
2、ArrayList判断元素是否存在,以及删除等操作,只依赖方法equals。(数据结构不同依赖的方法就不相同)