首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【动手实现系列】手撕ArrayList

文章目录 说到前面 实现ArrayList 基本操作 结构定义 初始化集合 初始化指定容量大小的集合 添加元素 将元素添加到集合中的指定位置 将元素直接添加到集合尾部 移除集合中的所有元素 返回集合中首次出现的指定元素的索引...添加元素 接下来我们实现ArrayList的add()方法,add()方法分为两种: 将元素添加到集合中的指定位置 将元素直接添加到集合尾部 将元素添加到集合中的指定位置 在添加元素之前,我们需要判断当前集合是否满...} 通过遍历集合中的所有元素来匹配指定的元素值,若匹配成功,则返回索引,若无匹配成功,则返回0。...,在这之前,先将指定位置的元素值保存,否则将被后面的元素覆盖,最后记得元素个数减1。...pList);//如果此列表中没有元素,则返回 1 int LastIndexOfList(PArrayList pList,int val);//返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含索引

55810
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    leetcode刷题(81)——103. 二叉树的锯齿形层次遍历

    最关键的是使用双端队列遍历,可以在队列的任一端插入元素。 如果需要 FIFO (先进先出)的顺序,则将新元素添加到队列尾部,后插入的元素就可以排在后面。...如果需要 FILO (先进后出)的顺序,则将新元素添加到队列首部,后插入的元素就可以排在前面。 算法 实现 BFS 的几种算法。 使用两层嵌套循环。...将元素添加到队列尾部,保证后添加的节点后被访问。从上图中可以看出,输入序列 [1, 2, 3, 4, 5],按照 FIFO 顺序得到输出序列为 [1, 2, 3, 4, 5]。...将元素添加到队列头部,保证后添加的节点先被访问。输入序列 [1, 2, 3, 4, 5],按照 FILO 顺序得到输出序列为 [5, 4, 3, 2, 1]。...List> zigzagLevelOrder(TreeNode root) { if (root == null) { return new ArrayList

    28210

    多线程场景下使用 ArrayList,这几点一定要注意!

    * 如果新建ArrayList对象时没有指定大小,那么会将EMPTY_ELEMENTDATA赋值给elementData, * 并在第一次添加元素时,将列表容量设置为DEFAULT_CAPACITY...执行add方法时,主要分为两步: 首先判断elementData数组容量是否满足需求——》判断如果将当前的新元素加到列表后面,列表的elementData数组的大小是否满足,如果size + 1的这个需求长度大于了...线程不安全的两种体现 2.1 数组越界异常 ArrayIndexOutOfBoundsException 由于ArrayList添加元素是如上面分两步进行,可以看出第一个不安全的隐患,在多个线程进行add...并且后续除非使用set方法修改此位置的值,否则将一直为null,因为size为2,添加元素时会从下标为2的位置上开始。 3....代码示例 如下,通过两个线程对ArrayList添加元素,复现上面的两种不安全情况。

    1.5K20

    Java将列表转换为数组,反之亦然

    如果您希望总体上了解有关ArrayList的更多信息,请随时阅读我们有关Java ArrayLists的文章。     同时,让我们开始吧!    ...传递数组的主要目的是通知要返回的数组类型:     如果传入的数组有足够的空间,则将元素存储在同一数组中,并返回对该数组的引用  如果其空间大于元素数,则首先使用列表元素填充数组,并将其余值填充为null...  否则,如果没有足够的空间来存储元素,则会创建,填充并返回具有相同类型和足够大小的新数组    将Java数组转换为    要将数组转换为Java中的List ,我们可以选择以下方法之一:    1....天真的方法(迭代):    一种简单的方法是遍历所有数组元素,并将它们添加到新创建的List中:    public List convertArrToList(T[] array) {...众所周知, java.util.Collections提供了addAll(Collection c,T ... elements)方法,该方法将所有元素添加到给定的collection c中 。

    3.4K20

    【数据结构】ArrayList原理及实现学习总结

    ArrayList是基于数组实现的,当添加元素的时候,如果数组大,则在将某个位置的值设置为指定元素即可,如果数组容量不够了,以add(E e)为例,可以看到add(E e)中先调用了ensureCapacity...具体实现如下:  (1) 当调用下面这两个方法向数组中添加元素时,默认是添加到数组中最后一个元素的后面。内存结构变化如下:  ?...= 0; } (2)当调用下面这两个方法向数组中添加元素或集合时,会先查找索引位置,然后将元素添加到索引处,最后把添加前索引后面的元素追加到新元素的后面。  ?...调整数组容量ensureCapacity (1)从上面介绍的向ArrayList中存储元素的代码中,我们看到,每当向数组中添加元素时,都要去检查添加后元素的个数是否会超出当前数组的长度,如果超出,数组将会进行扩容...// 则将ArrayList的全部元素都拷贝到数组a中。

    1.9K50

    大厂面试题集合之阿里一面

    说一下ArrayList和LinkedList区别 首先,他们的底层数据结构不同,ArrayList底层是基于数组实现的,LinkedList底层是基于链表实现的 由于底层数据结构不同,他们所适用的场景也不同...Deque接口,所以LinkedList还可以当做队列来使用 说一下HashMap的Put方法 先说HashMap的Put方法的大体流程: 根据Key通过哈希算法与与运算得出数组下标 如果数组下标位置元素为空...,则将key和value封装为Entry对象(JDK1.7中是Entry对象,JDK1.8中是Node对象)并放入该位置 如果数组下标位置元素不为空,则要分情况讨论 如果是红黑树Node,则将key和value...封装为一个红黑树节点并添加到红黑树中去,在这个过程中会判断红黑树中是否存在当前key,如果存在则更新value 如果此位置上的Node对象是链表节点,则将key和value封装为一个链表Node并通过尾插法插入到链表的最后位置去...,如果不用扩容就生成Entry对象,并使用头插法添加到当前位置的链表中 如果是JDK1.8,则会先判断当前位置上的Node的类型,看是红黑树Node,还是链表Node 说一下ThreadLocal ThreadLocal

    19310

    面试官:兄弟,说说 ArrayList 和 LinkedList 有什么区别

    1)ArrayList ArrayList 新增元素有两种情况,一种是直接将元素添加到数组末尾,一种是将元素插入到指定位置。...,最后通过索引将元素添加到指定的位置。...Java 的作者们明知故犯啊),然后生成新的 Node 节点,并赋给 last,如果 l 为 null,说明是第一次添加,所以 first 为新的节点;否则将新的节点赋给之前 last 的 next。...并将 succ 的前一个节点变更为 newNode,如果 pred 为 null,说明插入的是队头,所以 first 为新节点;否则将 pred 的后一个节点变更为 newNode。...ArrayList 在添加元素的时候如果不涉及到扩容,性能在两种情况下(中间位置新增元素、尾部新增元素)比 LinkedList 好很多,只有头部新增元素的时候比 LinkedList 差,因为数组复制的原因

    63731

    Java学习笔记之集合2

    没有带索引的方法,所以不能使用普通for循环遍历     由于是Set集合,所以是不包含重复元素的集合 HashSet集合的基本使用 package HashSetDemo; import...根据对象的哈希值计算存储位置       如果当前位置没有元素则直接存入       如果当前位置有元素存在,则进入第二步     2....当前元素的元素和已经存在的元素比较哈希值       如果哈希值不同,则将当前元素进行存储        如果哈希值相同,则进入第三步     3....通过equals()方法比较两个元素的内容       如果内容不相同,则将当前元素进行存储       如果内容相同,则不存储当前元素 HashSet集合保证元素唯一性的图解 1.5 常见数据结构之哈希表...> : 表示元素类型未知的List,它的元素可以匹配任何的类型       这种带通配符的List仅表示它是各种泛型List的父类,并不能吧元素添加到其中     类型通配符上限: <?

    68720

    ArrayList VS LinkedList,最后一战

    1)ArrayList ArrayList 新增元素有两种情况,一种是直接将元素添加到数组末尾,一种是将元素插入到指定位置。...,最后通过索引将元素添加到指定的位置。...Java 的作者们明知故犯啊),然后生成新的 Node 节点,并赋给 last,如果 l 为 null,说明是第一次添加,所以 first 为新的节点;否则将新的节点赋给之前 last 的 next。...并将 succ 的前一个节点变更为 newNode,如果 pred 为 null,说明插入的是队头,所以 first 为新节点;否则将 pred 的后一个节点变更为 newNode。...ArrayList 在添加元素的时候如果不涉及到扩容,性能在两种情况下(中间位置新增元素、尾部新增元素)比 LinkedList 好很多,只有头部新增元素的时候比 LinkedList 差,因为数组复制的原因

    32530

    深入剖析LinkedList:揭秘底层原理

    综上所述,LinkedList 适合在需要频繁进行插入和删除操作,但是不需要频繁随机访问元素的场景下使用。如果需要随机访问或者占用空间比较重要时,可以考虑使用其他数据结构,比如ArrayList。...extends E> c) { // size表示为当前 LinkedList 中的元素数量 // 调用另一个名为 addAll 的方法来将参数 c 中的所有元素添加到 LinkedList...if (x.item == null) return index; // 如果当前节点不是要查找的元素,则将索引变量 index 加 1,继续向下查找...if (o.equals(x.item)) return index; // 如果当前节点不是要查找的元素,则将索引变量 index...如果需要频繁进行随机访问,插入和删除操作相对较少,则选择ArrayList更合适。

    10510

    Java源码阅读之LinkedList - JDK1.8

    你应该也注意到了第二个构造函数中的addAll方法,看名字也知道是将集合c中的所有元素添加到LinkedList中。所以不能错过,往下看 ?...list中移除第一个匹配的元素 * 如果不存在,则list不改变 * * 更正式点说,是移除在低位匹配到的元素 * 如下所示 * (o==null?...,则移除第一个匹配的元素,如果不存在,则list不改变 * * @param o 要移除的元素 * @return {@code true} 如果存在的话,返回true * @since 1.6...return remove(o); } /** * 从list尾部->头部进行遍历,如果存在指定元素的话,则移除第一个匹配的元素,如果不存在,则list不改变 * * @param o...,跟ArrayList一样,通过查找元素的下标后判断下标是否存在,来判断元素是否存在,不一样的是元素的查找方法。

    45220

    大厂校招真实题目:List去重你能想到几种?

    基础方法:for循环遍历判断最简单直接的方法是使用for循环遍历List,检查每个元素是否已经存在于新的List中。如果不存在,则将其添加到新的List中。...进阶方法:使用Set去重Set是一种不允许重复元素的集合,因此可以利用这一特性来去除List中的重复元素。...这里可以使用HashSet或者LinkedHashSet,前者不保证元素的顺序,而后者则保持元素的插入顺序。...使用indexOf和lastIndexOf前后索引不一致这种方法通过比较元素的第一次出现和最后一次出现的索引来判断是否存在重复。如果两个索引不一致,则说明存在重复元素,可以将其从List中移除。...双for循环对比这是一种较为传统的方法,通过嵌套for循环来比较元素是否相同,如果相同则从List中移除。这种方法的时间复杂度较高,不推荐在大数据量时使用。

    7510
    领券