集合类
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
出现集合类的原因
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一个方式.
数组和集合都是容器有何不同?
数组虽也可存储对象,但长度是固定的,集合长度是可变的,数组中可以存储基本数据类型,集合只能存储对象.
特点
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象.
Collection ****
|--List:元素是有序的,元素可以重复。因为该集合体系有索引。
|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。50%延长
|--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
|--Vector:底层是数组数据结构。被ArrayList替代了。因为增删,查询效率都低。线程同步。100%延长
元素不是很多,同时涉及增删与查询,建议使用ArrayList
|--Set:元素是无序,元素不可以重复。
|--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
|--TreeSet:可以对Set集合中的元素进行排序。底层数据结构是二叉树。
共性方法
void clear() 清空集合
移除此列表中的所有元素。
boolean contains(Object o) 判断元素是否存在
如果此列表中包含指定的元素,则返回 true。
boolean isEmpty() 判断集合是否为空
如果此列表中没有元素,则返回 true
int size() 获取集合长度
返回此列表中的元素数。
boolean retainAll(Collection<?> c) 取交集
仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。
如al1. retainAll(al2); al1中只会保留和al2中相同的元素
Iterator<E>iterator() 迭代器
返回在此 collection 的元素上进行迭代的迭代器。
Iterator it = al.iterator();
while(it.hasNext())
{
sop("next:"+it.next());
}
List集合特有方法
特有方法。凡是可以操作角标的方法都是该体系特有的方法。
增
add(index,element);在指定位置添加元素
addAll(index,Collection);
删
remove(index); 删除指定位置的元素
改
set(index,element); 修改元素
查
get(index): 通过角标获取元素
subList(from,to);
listIterator(); 特有迭代器,可对集合进行操作
intindexOf(obj): 获取指定元素的位置。
ListIteratorlistIterator();
List集合特有的迭代器。ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素。
因为会发生ConcurrentModificationException异常。所以,在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法是有限的,
只能对元素进行判断,取出,删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。
该接口只能通过List集合的listIterator方法获取。
Vector
特有的取出方式:枚举(io中有用到)与迭代器一样。
Enumeration<E> elements()
返回此向量的组件的枚举。
Enumeration en = v.elements();
while(en.hasMoreElements())
{
System.out.println(en.nextElement());
}
LinkedList:特有方法:
void addFirst(); addLast();
添加元素
getFirst(); getLast();
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
removeFirst(); removeLast();
获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException
在JDK1.6出现了替代方法。
boolean offerFirst(); offerLast();
添加元素
peekFirst(); peekLast();
获取元素,但不删除元素。如果集合中没有元素,会返回null。
pollFirst(); pollLast();
获取元素,但是元素被删除。如果集合中没有元素,会返回null。
堆栈数据结构 :先进后出,FirstIn Last Out -- FILO如同杯子。
队列数据结构 :先进先出,FirstIn First Out -- FIFO如同水管。
List集合
判断元素是否相同,依据是元素的equals方法。
contains()与remove()方法底层调用的是equals。
Set集合
Set集合的功能与Collection是一致的。
HashSet集合
如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。如果元素的HashCode值相同,才会判断equals是否为true;如果元素的hashcode值不同,不会调用equals。
注意,对于HashSet集合判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。
TreeSet集合
保证元素唯一性的依据:compareTo方法return 0.
compareTo方法return 正数,元素向后放;compareTo方法return 负数,元素向前放。
用该方法直接return正数或负数,来完成集合元素的正序或逆序。
TreeSet排序的第一种方式:
让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。也种方式也成为元素的自然顺序,或者叫做默认顺序。
TreeSet排序的第二种方式:。
当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式(传入比较器)。
当两种方式都存在时,以比较器为主。
如何定义比较器?
定义一个类,实现 Comparator 接口,覆盖 compare 方法。