Java-day14集合Collection
存储对象的两种方式
A:数组Arrays
长度固定 类型固定 可以存放基本数据类型的数据
B:集合Collection
注意:集合中存放的不是对象实体而是对象的引用
长度不固定 类型不固定(是对象就能存放)
只能存放对象(引用类型的数据)
但是基本数据类型可以使用包装类,自动的装箱拆箱
二者都是容器
参阅顶层(共性,抽象),创建底层(具体实现)
Collection
List Set
ArrayList LinkedList Vector HashSet TreeSet
出现这么多的容器类型是因为每一个容器对数据的存储方式都有不同。
这个存储方式称之为数据结构;
Collection 根接口 从1.2版本出现的 支持增删改查
主要方法 add(E) 参数类型为Object 以便接收任意类型的数据
addAll(Collection E) 把一个容器添加进入另一个容器中
clear() 清空容器,清除所有元素
remove(Objcet o) 删除指定的元素
removeAll(Collection c) 删除集合c的所有元素
contains(Object o) 包含指定元素
isEmpty() 判断集合是否为空
retainAll(Collection c) 取交集 此对象与c集合的交集
Object[] obj = c.toArray()
toArray(T[] a)
iterator() 获取在该集合上迭代的迭代器,主要用于取出元素;
在取出元素的过程中,不能再使用集合来修改元素,否则会引起并发修改异常,选择一种方式来操作
iterator()为集合的内部类对外提供的方法 抽象为Iterator的接口 共性的方法 判断 取出 移除
返回值类型为Iterator 接口 Iterator it = c.iterator();获取迭代器;
内含三个方法:
boolean hasNext();
Object next();
remove();
size() 获取集合的长度
子类 ArrayList
ArrayList arr = new ArrayList();
Collection
List 元素是有序的,元素可以重复,因为该集合体系有索引
特有方法(可以操作角标):
增:
add(index Object)在指定位置上添加元素.
addAll(index Collection)在指定位置上添加元素.
删:
remove(index)移除指定位置的元素
改:
set(intdex Object)修改特定位置上的元素
查:
get(index);获取指定位置的元素
int i= indexOf(Object);
List l1 = l.subList(from,to);截取包含from 不包括to
listIterator();列表迭代器 继承自迭代器 其方法比迭代器多的多,可以添加,删除 修改 查找
这个是List集合特有的迭代器,是Iterator的子接口,在迭代时不可以与集合的操作方法混用
会发生并发修改异常;只能选择迭代器自己额方法操作,可是Iterator的方法太少,
不能完成操作,只能使用其子接口ListIterator
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 返回的最后一个元素(可选操作)。
使用方法ListIterator li = c.listIterator();
List下的三个常见的实现子类:ArrayList LinkedList Vector
ArrayList和Vector底层使用的是数组结构
物理内存的位置关系与逻辑位置关系一致
特点:查找和修改速度很快,增加和删除很慢,取决于数据的真实长度,越长越慢
Vector默认长度为10,超过时100%延长,在一定情况下浪费资源空间;
线程是同步的,线程安全,
其各种操作的速度都很慢,在JDK1.2后被ArrayList替代了;
Element是其特有的方法,
Enumeration e = c.elements() 返回此向量(集合的)枚举
e.hasMoreElements();是否存在多个元素;
nextElement();取出下一个元素;
枚举是Vector的特有取出元素的方式,
和迭代器的功能很像,此接口与迭代器接口的功能是重复的,
迭代器新增了移除操作,使用了较短的方法名,使用时优秀选择迭代器
取出元素的方法有迭代器,get(),枚举;
ArrayList默认的长度为10,超过时,会50%的延长,将原来的数组copy到新数组中,
然后再将新元素向后面添加;是线程不同步的,但是效率高,
在多线程的时候可以使用加锁的方法解决安全问题;
LinkedList底层使用的是链表结构,线程不同步;
物理内存的位置关系与逻辑位置关系不一致
特点:增删元素速度非常快,但是查询和修改较慢
LinkedList ll = new LinkedList();
特有的方法:
void addFirst(E e) 将指定元素插入此列表的开头。
void addLast(E e)将指定元素添加到此列表的结尾。
E getFirst()返回此列表的第一个元素。 取出不删
E getLast()返回此列表的最后一个元素 取出不删
E removeFirst()移除并返回此列表的第一个元素。取出然后删掉
E removeLast()移除并返回此列表的最后一个元素,取出然后删掉
*注意:get (peek)和remove(poll) 如果列表为空时,会抛出异常,
新方法pollFirst() 和pollLast() 空时返回null*
E peek() 获取但不移除此列表的头(第一个元素)。
E peekFirst()获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。
E peekLast()获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。
E poll() 获取并移除此列表的头(第一个元素)
E pollFirst()获取并移除此列表的第一个元素;如果此列表为空,则返回 null。
E pollLast()获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。