目录
首先我们先理解一下如下图:
1.认识了解Collection方法,迭代器(Iterator)
(1)查找了解接口Collection
在线api浏览器搜索:
http://tool.oschina.net/apidocs/apidoc?api=jdkh
(2)迭代器
举一个形象的例子:
把夹娃娃机比作集合;那么夹娃娃的钩子就可以看成集合中的迭代器;夹娃娃必须通过娃娃机内部的钩子;
而钩子的外挂、移动方式等等都不相同,所以只能定义一个规则,而这个规则就可以看成几何内部的一个迭代器接口Iterator;
怎么取迭代器(Iterator)里的容器
(子类具备父类所拥有的所有方法)
集合的remove方法与迭代器的remove方法的区别
1.在迭代器或者foreach循环删除的时候容易出现的常见问题
如果运行it.next()会打印23 28
取迭代器(Iterator)里的容器
—箭头代表迭代器(最开始创建时,迭代器是在最顶端)
it.hasNext()–在这个容器是否有元素(是否含有下一个元素)
箭头往下移
foreach循环删除
–移除后意味着后面的元素往前面移,则后面没有元素时会报角标越界异常
2.在迭代器中执行collection.remove方法
53行运行则是正确的
当前改变异常
本质上来说:这是一个并发问题(两个对象同时操作一个元素是有问题的)
2.集合框架List(ArrayList特有方法,特有迭代器,具体对象特点,增长因子论证)
(1)list特有的方法listIterator
http://tool.oschina.net/apidocs/apidoc?api=jdkh
有下标的容器
可以按照下标去取,删除等方式去操作容器的元素
【父类的引用只能调用父类的方法,如果是new ArrayList()方式调的是子类的实现方法】
输出打印:(it.hasPrevious代表上一个,如果没有30-32行代码直接找上一个元素会运行没有任何东西)
(2)具体对象特点
Collection
List : 有序 元素可以重复 因为该集合体系有索引
ArrayList : 数组结构 增删慢,查询快 有连续下标 线程不同步(看源码) 增长因子为0.5 10
Vector : 数组结构 增删改查都慢 有连续下标 线程同步(看源码) 增长因子2 10(淘汰原因:增长因子太大浪费空间)
LinkedList : 链表结构 增删快,查询慢 没有连续下标
Set : 无序 元素不可以重复
ArrayList与array的区别
1.list的长度可变,数组长度固定
2.list可以存放各类的元素对象,而数组一旦申明,只能存放对应的类型
ArrayList如何进行性能调优
为何list集合底层是数据结构,但是数组长度优势固定,而list长度又可变呢?
可变的原因是:一次次对底层的容器扩容
3.集合框架LinkedList
http://tool.oschina.net/apidocs/apidoc?api=jdkh
链表的数据结构
特有方法:(1)addFirst()
(2)addLast()
通过LinkedList集合来制作一个堆栈结构的容器
获取制作一个队列结构的容器
堆栈
输出:abcde
队列
输出:abcde
4.集合框架ArrayList中的重复元素去重及其底层原理
(1)元素是字符串
(2)元素是自定义对象
ArrayList al这容器中是否有重复元素?
(1)建立一个新的容器
(2)将老的容器遍历取出其中的元素
(3)如果说这个元素存在于新容器中,那么不再往新容器加入。如果不存在,就加。
元素是自定义对象
需求:判定两个人是同一个人的依据:
名字相同年龄相同
Repeat去重复方法无效
如下图分析理解:这六行代码在内存做了什么事
集合collection的contains在调用的时候底层调用容器元素对象的equals方法
之前元素对象是String (contains方法能够对比字符串是因为String已经重写了equals方法,不能对比自定义对象是因为还用于Object)
元素对象Object(Person)