集合类
集合就是一个只能用以存储对象的容器
特点:
1, 只能存储对象
2, 长度可变的容器
集合和数组的区别:
1, 集合长度可变,数组长度不可变
2, 数组可以用于存储基本数据类型和对象,集合只能存储对象。
集合有多种体现,是因为每一个容器的内部数据结构不同(存储数据的方式)导致的。
Collection:
集合的最顶层容器。
增删改查
1, 添加
boolean add(Object):添加一个元素
boolean addAll(Collection):添加一个指定容器中的所有元素
2, 删除
void clear() :清空容器
boolean remove(Object) :删除指定元素
booleanremoveAll(Collection):删除与指定容器中相等的元素
3, 判断
boolean IsEmpty():判断容器是否为空。
boolean contains(Object):是否包含指定元素
booleancontainsAll(Collection):是否包含指定容器中的所有内容
4, 获取
Int size():获取容器中元素的个数。
Iteratoriterator():得到一个迭代器
booleanretainAll(Collection):保留交集
5, 将集合变成数组
Object[] toArray():返回容器中所有元素的数组
只有List可以对元素进行增删改查。
集合细节:
1, 创建容器其实就是在堆内存中定义了一个可以存储对象的对象
集合中存储的是对象的地址值(引用)
2, add方法什么类型都可以接收。
原因:因为add方法的参数类型是Object,所有的元素在存储时都被自动提升
为了Object类。取出对象时,取出类型是Object。
3,对于remove contains方法。
其实内部都是用到了一个对对象进行判断相等的方法equals。
4,coll.add(4):可以不可以?
在jdk1.4 版本,不可以,必须写成coll.add(new Integer(4));
在jdk1.5版本,可以,因为有自动装箱。
Collection:
|--List:有序(存入的顺序和取出的顺序一致),元素都有索引,元素可以重复。
|--Set:元素不可以重复,无序(存入的顺序和取出的顺序不一定一致)。
了解一下List子接口的常见特有方法:
因为List集合是由索引的,所以它的特有的方法都是围绕索引定义的。
1,添加
add(index,element):在指定位置插入元素。
addAll(index,colletion):在指定位置插入一堆元素。
2,获取
Objectget(index):根据索引获取元素。
intindexOf(object):获取指定元素的索引。
intlastIndexOf(Object)
ListsubList(startIndex,endIndex);
3,删除
remove(index):根据索引删除元素。
4,修改
set(index,element):修改指定位置上的元素,用指定的元素进行替换。
这就是传说中的增删改查(c-create,u-update,r-read,d-delete).
记住:只有list可以对元素进行增删改查。
List:常见的子类对象。
|--Vector:内部是数组数据结构。
而且是一个可变长度的数组(无非就是新建数组并将原数组元素复制到新数组中)
jdk1.0版本就存在了,jdk1.2版本才加入了java集合框架中。
是同步。因为效率很低,所以很少用。
该集合支持枚举接口Enumeration,但是被Iterator替代。
|--ArrayList:内部也是数组数据结构,是不同步的。替代了Vector.查询元素的速度很快。
|--LinkedList:内部是链表数据结构,是不同步的。该数据结构的特点:对元素的增删速度很快。
LinkedList:
addFirst();
addLast();
jdk1.6时,
offerFirst()
offerLast();
获取元素,但不删除。集合长度不改变。如果集合中没有元素会出现NoSuchElementException
getFirst():
getLast();
jdk1.6时,获取元素,但不删除。集合长度不改变。如果集合中没有元素会返回null。
peekFirst()
peekLast();
获取元素,但是会将该元素删除,集合长度改变。如果集合中没有元素会出现NoSuchElementException
removeLast();
removeFirst();
jdk1.6时,获取元素,但是会将该元素删除,集合长度改变。如果集合中没有元素会返回null。
pollFirst()
pollLast();
介绍两个常见的简单数据结构:
堆栈:先进后出。firstin last out FILO
队列:先进先出。firstin first out FIFO
面试:请使用LinkedList模拟一个堆栈或者队列。
对于ArrayList判断元素是否相同,依据的是元素的equals方法。
对于contains,或者remove内部都是使用equals来判断是否有相同的元素。
所以存储自定义元素时,必须覆盖equals方法,建立自定义元素的比较相同的方式,通常都依据自定义元素的属性。
迭代器:
是一种取出元素的方式。
迭代器的基本使用:
Iterator接口:
iterator():返回一个Iterator接口类型的对象。
NoSuchElementException(常见的异常)
hasNext():对于迭代器取出元素,先要进行判断是否有元素,有就取。
如果元素很多,会判断多次并取出多次。
while和for循环的比较:
for好些:迭代器变量在元素取完以后就释放了。
循环中不要写多个next()方法
迭代器的基本原理:
数据结构不同,取出元素方式不同。
为了方便于对每一个容器进行取出的操作,对容器进行共性的抽取。
每一个去出方式都包含:
hasNext()
{
code
}
next()
{
}
好处:降低了数据结构的耦合性。
List集合取出元素有两种方式:1,迭代;2,遍历
listIterator:列表迭代器
ConcurrentModification:并发修改,不允许时发生的异常。
在迭代中操作集合中的元素:引用迭代器中的方法。
Iterator中的方法较少,只能判断、获取、删除
List中的listIterator方法,具备更多的操作。可以增删改查。因为list集合具备索引的属性。
局限性:只能用在List派系中。
该方法返回ListIterator列表迭代器。