如果对此文章有什么疑问,可以加小编微信(foreverTXforever)!小编可以为你解答。
一:集合框架的概念和由来
1.集合类是用于存储对象的容器。该容器的长度是可以变的。
2.集合和数组的区别:
集合长度是可以变的,数组的长度是不可以变的。
集合中只能存储对象,但数组中可以存储基本数据类型。
集合中存在的对象可以是任意类型的,而数组中只能存储一种类型的对象。
3.框架的由来:
容器有很多,因为每个容器的数据结构是不同的。(数据结构:就是数据在容器中的存储方式,比如鸡蛋有散装鸡蛋,也有品牌鸡蛋。)
但这些容器都有一些相同的功能,比如都用来存储数据,那么这时就可以向上抽取,最后得出了一个他们共有相同功能的容器这个容器就是集合框架,也就是collection接口。
4.集合中常用的方法:
4.1添加方法:
boolean add(object e):一次添加一个元素。
booleanaddAll(Collection):将一个参数容器中的元素添加到当前容器中。
4.2删除方法:
boolean remove(object):删除指定对象。
booleanremoveAll(Collection):删除指定Collection中和本Collection中相同的元素。
void clear():直接将集合中的元素清空。
4.3判断方法:
boolean contains(object):是否包含指定元素。
boolean contains(Collection):是否包含指定容器中的元素。
boolean isEmpty():是否有元素。
4.4获取元素个数:
int size():获取元素有几个。
4.5取交集:
boolean retainAll(Collection):保留和指定Collection集合中相同的元素不同的元素会被删除。
4.6将集合转成数组:
Object[] toArray()
4.7取出元素的方法:
Iterator iterator()(后面有详细介绍此方法)
二:迭代器
1.什么是迭代器:
迭代器是取出集合元素的方式的一个对象,该对象本身就内置在容器中如何获取到集合迭代器呢?可以通过iterator()方法来完成。该方法返回一个iterator类型对象。
创建集合
Collection coll=new ArrayList();
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
获取该集合的迭代器对象
Iterator it=coll.iterator();
使用迭代器对象中的方法完成元素的获取。
叠代器中的方法:
hasNext():如果仍有有元素可以迭代,则返回true。
next():返回迭代的下一个元素。
remove():从迭代器指定的collection中移除迭代器返回的最后一个元素。
2.迭代器的原理
2.1. 如何获取到集合的迭代器:
可以通过iterator()方法来完成。法返回一个Iterator类型对象。
2.2. 迭代器接口出现:
将每一个容器中的取出方式进行了封装,并对外暴露。这样无论是什么容器或者数据结构,只要内部取出方式实现了Iterator接口,都可以通过该接口取出这些容器中的元素。
注意:集合细节问题:
创建一个集合容器,其实也是一个对象。
这个对象中存储着特定结构可以对对象进行存储。
存储时,add可以接收任意类型的对象因为参数类型是Object
所以对象元素存入时就被提升为Object
其实在集合中真正存储都是对象的引用。
在使用迭代器取出时如果要使用自定义对象的特有方法,一定要进行向下转型。
代码:
Iterator it=coll.iterator();
while(it.hasNext){
parson p=(person)it.next();
system.out.println(p.getName()+":"+p.getAge());
三:Collection的几个重要的子接口
1. List和set的特点:
1.1 List:
有序(存储元素的顺序和取出元素的顺序一致)
该集合中的元素都有索引所以可以通过索引(角标)未访问元素
它可以存储重复元素
1.2Set:
不包含重复元素。
(具体的容器对象数据结构不同,顺序也不同)这个集合存入元素的顺序和取出元素的顺序不一致
2. List子接口中的方法:
因为该接口的特点是对元素有索引标示,所以它的特有方法应该都是围绕索引定义的。
2.1添加:
void add(index ,element);
boolean addAll(index,collection);
2.2删除:
object remove(index):获取并删除。
2.3获取:
获取元素:
object get(index):获取
获取元素索引:
int indexOf(object);
int lastIndexOf(object);
获取子列表:
List subList(fromIndex,toIndex):获取列表中的一部分,包含fromIndex位置,不包含toIndex位置
2.4修改:
object set(index,element):替换指定位置的元素,并返回被替换掉的元素
3.实现List接口的子类:
常见子类对象:具体的子类对象,我们要学习应该是该对象的特有的数据结构,以及相关的特点。
3.1 Vector:
jdk1.0就存在了,底层是数据结构的da,可变长度数据。原理:一旦原数组长度不够,会创建新数组,将原数组的元素复制到新数组中,并将新元素添加到新数组中。
3.2 ArrayList:
底层是数组结构,也是支持长度可变数组的。是不同步的,替代了Vector,因为效率高查询效率高,但增删效率低。
3.3 LinkedList:
底层是链接列表结构,简称链表结构。这个中结构的好处,对元素的增删非常效率很高。好处是删除和增加效率高,但查询很慢,因为它的查询要一个一个的往下查询。
注意:那什么是链接列表结构呢:
在每个元素中有一个常量记录着下一个元素的地址这样一个连一个就成了链接。
3.4那么LinkeList和ArrayList的区别:
ArrayList:查询效率高,但增删效率低。
LinkedList:好处是删除和增加效率高,但查询很慢,因为它的查询要一个一个的往下查询。