Collection框架集合(1)
Collection
类集设置的目的
普通数组,并不是动态数组,在扩容时候每次是自己进行new一个更大的新的数组,而在实践开发的时候,方便实际Java实现了类集。
类集中的三大接口:Collections,Map,Iterator。
所有的类集合都在java.util包中。
Collection接口
Collection 接口是在整个 Java 类集中保存单值的最大操作父接口,里面每次操作的时候都只能保存一个对象的数据
def:采用泛型技术
public interface Collection<E> extends Iterable<E>;
常用方法
public boolean add(E e); //return无论如何只有ture public Iterator<E>
List
ArrayList,Vecter,LinkList(链表结构)
ArrayList
ArrayList:使用泛型数组结构,对于增加删除操作快,查找慢
ArrayList<Integer> data=new ArrayList
构造方法
构造器 | 描述 |
---|---|
ArrayList() | 构造一个初始容量为10的空列表。 |
ArrayList(int initialCapacity) | 构造具有指定初始容量的空列表。 |
ArrayList(Collection<? extends E> c) | 按照集合的迭代器返回的顺序构造一个包含指定集合元素的列表。 |
每次扩容为原始的1.5倍,若需要极大的空间,需要在初始化时候进行声明
ArrayList的内部原理
首先我们来看一下它的定义
public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }
传入一个默认的数组,而private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
显然是一个空数组
所以ArrayList在构造开始是一个空数组,但是jdk里面说是10个长度,为什么呢
当我们在添加元素时候看一看add方法的定义
public boolean add(E e) { modCount++; add(e, elementData, size); return true; }
首先modCount记录修改的次数,然后使用add方法,它接受三个参数:要添加的元素e,集合的元素数据数组elementData,以及集合数组大小size
进一步的我们在看一下此处的add定义
private void add(E e, Object[] elementData, int s) { if (s == elementData.length) elementData = grow(); elementData[s] = e; size = s + 1; }
如果当前的size,s已经等于了数组的长度则进行grow扩容
所以我们来看一下grow的定义
private Object[] grow() { return grow(minCapacity:size + 1); }
再来看看此处的grow的具体逻辑
private Object[] grow(int minCapacity) { int oldCapacity = elementData.length; if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { int newCapacity = ArraysSupport.newLength(oldCapacity, minCapacity - oldCapacity, /* minimum growth */ oldCapacity >> 1 /* preferred growth */); return elementData = Arrays.copyOf(elementData, newCapacity); } else { return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)]; } }
首先定义了一一个原数组的长度由于扩容1.5倍首先就得排除初始的为空或者只有1的情况如何创建一个新的更大数组copy过来
Vector
Vector是同步的,如果不需要线程安全建议使用ArraysList
每次扩容的数量是可以定义的
LinkedList
Linkedlist:使用的双向链表
可以实现队列和栈
本文作者:califorium
本文链接:https://www.cnblogs.com/aihaotian/p/17862035.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!