2021.01.18 第一阶段11

(一)Collection

(一)概述
1、Collection:收集、集合。
2、单列集合的顶层接口,定义了所有单列集合共性的功能
3、Collection是一个接口,无法直接创建对象,要依靠实现类来创建对象,不同底层的实现类,具有不同的特性。将来创建对象,可以使用Collection接口的引用指向具体的实现类的对象。
(二)常用方法
1、add(E e) 将参数元素添加到集合中
2、remove(Object o) 从集合中删除指定元素
3、size() 返回集合中的元素个数
4、contains(Object o) 如果此集合包含指定的元素,则返回true
5、isEmpty() 判断集合是否为空
6、clear() 清空集合
(三)Collection的第一种遍历方式
1、将集合转为数组,之后遍历数组
2、toArray() 返回包含此集合中所有元素的数组
(四)Collection中带All的方法
1、addAll(Collection c) 将参数几何的所有元素添加到调用者集合中去
2、removeAll(Collection c) 从调用者集合中删除也包含在参数集合中的元素
3、retainAll(Collection c) 保留调用者集合中和参数集合重复的元素
4、containsAll(Collection c) 参数集合中的元素和是调用者集合元素的子集返回true(不考虑顺序)
(五)Collection的第二种遍历方式:迭代器
1、迭代:一个有一个的更迭,有从上一个到下一个的意思
2、迭代器:专门用于将集合元素进行逐个迭代的对象
3、迭代器的获取:iterator() 用于获取调用者集合的迭代器对象
4、迭代器的方法:
(1)hasNext() 判断如果有下一个可以迭代的元素,返回true
(2)next() 获取下一个元素并且将迭代器向下移动一位
(3)remove() 删除迭代器目前为止获取到的最后一个元素
5、注意事项:
(1)hasNext() 只能判断下一个元素是否存在
(2)next() 获取下一个元素并且将迭代器向下移动一位
(3)一般情况下,都是先使用hasNext()方法判断是否有下一个元素,如果有再去调用next()方法获取
(4)【调用一次hasNext(),只调用一次next()方法,不要调用一次hasNext(),多次调用next()】
二、List
(一)概述
1、是Collection接口的一个子接口
2、特点:
(1)有序:存取顺序一致。
(2)可重复:允许存储重复元素,并且允许存储多个null值。【有索引】,当存储重复元素之后,可以通过不同的索引来区分相同的元素
(二)特有方法
1、add(int index, E element) 在集合制定索引处,插入一个指定元素
2、remove(int index) 删除指定索引对应的元素
3、set(int index, E element) 用于在已有元素上进行修改
4、get(int index) 返回指定索引对应的元素
(三)集合的第三种遍历方式
1、针对List集合特有的遍历方式,因为要用List集合特有的方法
2、结合size()方法可以获取到集合的索引范围,结合get(int index)方法可以通过索引获取指定位置上的元素
(四)并发修改异常
1、ConcurrentModificationException
并发 修改 异常
2、产生原因:在使用【迭代器对象】遍历集合的同时,使用【集合对象】进行修改操作
3、解决办法:
(1)迭代器遍历,迭代器修改
(2)集合遍历,集合修改
4、在Iterator中没有出了删除之外的修改操作,在List接口中,有一个方法叫做listIterator(),可以获取到Iterator接口的子接口ListIterator实现类对象,这个迭代器中具有出了删除以外的其他方法,可用于修改集合

三、List接口的实现类

(一)概述
1、List是一个接口,无法实例化,根据底层的不同,拥有不同的实现类
2、ArrayList:数组实现,顺序存储
3、LinkedList:节点实现,链式存储
4、Vector:数组实现,顺序存储
(二)Vector
1、出现在JDK1.0,这个类型已经过时,在JDK1.2的时候,被ArrayList取代
2、特点:
(1)线程安全,效率较低
(2)顺序存储,增删较慢
3、常用方法:
(1)addElement(E obj) 将制定元素添加到集合的末尾,并且将容积+1
(2)removeElement(Object obj) 删除集合中的元素,如果有重复,删除第一个
(3)elements() 返回Vector的枚举对象,用于遍历集合
4、Vector特有的遍历方式:
(1)使用elements()方法得到Enumeration对象
(2)hasMoreElements()相当于hasNext()
(3)nextElement()相当于next()
(三)Cloneable接口
1、Cloneable接口没有任何方法,相当于是在A类型对象调用Object类中clone()方法时的一个许可,如果A类型实现了Cloneable接口,当A类型的对象调用clone()方法时,就会顺利的拷贝一个对象,如果A类型没有实现Cloneable接口,则在A类型的对象调用clone()方法时,抛出CloneNotSupportedException
2、因为Object类型中的clone方法时protected权限,所以在使用的时候,一般情况下,要在具体的类中重写clone方法,再在其他的类中创建具体类型的对象进行调用
(四)ArrayList
1、是List接口的一个实现类
2、没有业务逻辑方面的特有方法,但是有一些操作底层容积的方法
3、存储方式:
(1)数组实现,顺序存储(底层是一个数组)
(2)数组实现:通过内存物理结构的位置关系,来表达、描述逻辑顺序的相邻
(3)查询快,增删慢
4、图示:
在这里插入图片描述
(五)ArrayList源码分析
1、JDK7的情况
(1)ArrayList list = new ArrayList();在底层调用构造方法,创建一个对象,其中有一个私有的、长度为10的Object类型数组用于集合存储元素
(2)当add方法添加元素的时候,会调用ensureCapacityInternal方法进行扩容
(3)扩容是首先根据数组现在的长度扩大1.5倍,如果足够装目前所有的元素,就进行数组拷贝;如果不够装目前所有的元素,就将现在元素的个数作为新数组的大小,进行数组的拷贝;如果扩容后的数值数特别巨大,大于2147483639会调用hugeCapacity方法进一步确认扩容,如果没有超过int取值范围的极限,则会决定容积是否-8,如果超出int取值范围,抛出OutOfMemoryError错误
(4)注意:一般开发中,尽量使用有参构造创建对象,使用有参的好处是在一开始就指定好底层数组有多大,尽量避免内存中过多的数组拷贝,来提升效率
2、JDK8的情况:
(1)ArrayList list = new ArrayList();在底层并没有创建容量为10的数组,先将static Object数组的地址引用过来
(2)当我们调用add方法向数组添加元素的时候,才开始底层扩容创建数组,最终创建了一个容量为10的数组用于存储元素,扩容依然是原来的1.5倍,扩容操作实际上和JDK7没有差别
3、总结:JDK7的创建就类似于单例设计模式的饿汉式的思想,只要一调用就创建容量为10的数组;JDK8的创建就相当于是单例设计模式懒汉式的思想,直到必须要创建底层数组才去创建,更能够节约内存
(六)LinkedList
1、是List接口的实现类
2、存储方式:
(1)节点实现,链式存储
(2)不通过内存的物理结构相邻,通过逻辑顺序相邻
3、链表:
在这里插入图片描述
4、特点:
(1)查询慢,因为不是连续的物理结构,要查到某个数据,先从头部或者尾部开始,如果不是要查找的元素,根据节点中存储的下一个节点的地址找到下一个节点,以此类推,直到找到位置
(2)增删速度快:增删一个元素,实际上只需要修改前后两个节点中的地址即可
5、LinkedList特有的方法:
(1)addFirst(E e) 头部添加
(2)addLast(E e) 尾部添加
(3)removeFirst()删除头部元素并且【返回】
(4)removeLast() 删除尾部元素并且【返回】
(5)getFirst() 获取头部元素
(6)getLast() 获取尾部元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值