前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >java列表删除指定位置元素_怎么删除数组中的某个元素

java列表删除指定位置元素_怎么删除数组中的某个元素

作者头像
全栈程序员站长
发布于 2022-09-22 09:58:22
发布于 2022-09-22 09:58:22
5.5K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

思路

1. 因为数组长度在初始化的时候是指定的并且不可变的,所以不能在原有的数组上直接进行删除操作,需要新建一个长度为当前长度减1的数组

2. 向新数组写数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
     * remove element at the specified position from the given array by loop
     * 
     * @param array
     * @param position
     * @return
     */
    public static String[] removeElementByLoop(String[] array, int position) {
        if (position < 0 || position > array.length) {
            throw new IndexOutOfBoundsException("the position is out of the array indices");
        }
        long startTime = System.currentTimeMillis();
        String[] newArray = new String[array.length - 1];
        int index = position - 1;
        for (int i = 0; i < array.length; i++) {
            if (i < index) {
                newArray[i] = array[i];
            } else if (i > index) {
                newArray[i - 1] = array[i];
            }
        }
        System.out.println("took:" + (System.currentTimeMillis() - startTime) + " ms by loop solution");
        return newArray;
    }

    /**
     * remove element at the specified position from the given array by copy
     * 
     * @param array
     * @param position
     * @return
     */
    public static String[] removeElementByCopy(String[] array, int position) {
        int length = array.length;
        if (position < 0 || position > length) {
            throw new IndexOutOfBoundsException("the position is out of the array indices");
        }
        long startTime = System.currentTimeMillis();
        String[] newArray = new String[array.length - 1];
        int index = position - 1;
        System.arraycopy(array, 0, newArray, 0, index);
        if (index < length - 1) {
            System.arraycopy(array, index + 1, newArray, index, length - index - 1);
        }
        System.out.println("took:" + (System.currentTimeMillis() - startTime) + " ms by copy solution");
        return newArray;
    }

对比: 从时间复杂度来说removeElementByCopy的性能能优于removeElementByLoop,因为removeElementByLoop是0(n)而removeElementByCopy是0(1)。

从空间复杂度来说removeElementByLoop的性能能优于removeElementByCopy,因为removeElementByCopy需要更多次的swap。

下面是测试结果 1. 当原数组长度较少的时候.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<String> elements = new ArrayList<String>();
for (int i = 0; i < 90000; i++) {
    elements.add(i + "");
}
String[] array = elements.toArray(new String[elements.size()]);
int position = 80000;
removeElementByCopy(array, position);
removeElementByLoop(array, position);

—-> took:0 ms by copy solution took:2 ms by loop solution

2.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<String> elements = new ArrayList<String>();
for (int i = 0; i < 1000000; i++) {
    elements.add(i + "");
}
String[] array = elements.toArray(new String[elements.size()]);
int position = 80000;
removeElementByCopy(array, position);
removeElementByLoop(array, position);

—-> took:7 ms by copy solution took:88 ms by loop solution

从测试结果可以看出来,在执行时间上的花费,removeElementByCopy的效率明显高于removeElementByLoop

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169495.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java Review - ArrayList 源码解读
为追求效率,ArrayList没有实现同步(synchronized),如果需要多个线程并发访问,用户可以手动同步,也可使用Vector替代
小小工匠
2021/11/15
2260
Java 集合系列08: List总结(LinkedList, ArrayList等使用场景和性能分析)
这里写图片描述 (01) List 是一个接口,它继承于Collection的接口。它代表着有序的队列。 (02) AbstractList 是一个抽象类,它继承于AbstractCollection。AbstractList实现List接口中除size()、get(int location)之外的函数。 (03) AbstractSequentialList 是一个抽象类,它继承于AbstractList。AbstractSequentialList 实现了“链表中,根据index索引值操作链表的全部函数”。
好好学java
2019/09/19
7290
Java 集合系列08: List总结(LinkedList, ArrayList等使用场景和性能分析)
JDK源码阅读:ArrayList原理
查询快:由于数组在内存中是一块连续空间,因此可以根据地址+索引的方式快速获取对应位置上的元素。
鳄鱼儿
2024/05/21
1240
面经手册 · 第7篇《ArrayList也这么多知识?一个指定位置插入就把谢飞机面晕了!》
说到数据结构基本包括;数组、链表、队列、红黑树等,但当你看到这些数据结构以及想到自己平时的开发,似乎并没有用到过。那么为什么还要学习数据结构?
小傅哥
2020/08/28
3770
面经手册 · 第7篇《ArrayList也这么多知识?一个指定位置插入就把谢飞机面晕了!》
有助于改善性能的Java代码技巧
程序的性能受到代码质量的直接影响。这次主要介绍一些代码编写的小技巧和惯例。虽然看起来有些是微不足道的编程技巧,却可能为系统性能带来成倍的提升,因此还是值得关注的。
纪莫
2019/06/03
4030
ArrayList 源码分析
ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。
Jacob丶
2020/08/05
4120
Java工具集-数组(ArrayUtil)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/10/28
1.3K0
ArrayList 源码笔记
每次添加时modCount都会自增,modCount在迭代器开始迭代时会被记录,除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则迭代过程中modCount发生改变,就会抛出 ConcurrentModificationException 异常。
MashiroT
2022/10/28
1970
Java集合---CopyOnWriteArrayList(5)
该集合如其名字一样,是先创建一个新的数组,然后将旧的数组copy到新数组中,再切换数组引用。并且该数组是在每次添加时都会执行以上流程,所以不建议在多写入的场景使用。
兜兜毛毛
2019/10/23
3650
Java集合---CopyOnWriteArrayList(5)
有助于改善性能的Java代码技巧
程序的性能受到代码质量的直接影响。这次主要介绍一些代码编写的小技巧和惯例。虽然看起来有些是微不足道的编程技巧,却可能为系统性能带来成倍的提升,因此还是值得关注的。
lyb-geek
2019/07/08
4060
有助于改善性能的Java代码技巧
【Java】基础篇-ArrayList
说到面试,高频的当属 Java 的集合类了,这是完全绕不开的一道大坎,而且里面包含了许多的数据结构。而在我们的平常使用中,ArrayList 几乎可以说是随处可见,尤其是对刚入行的朋友们来说,ArrayList 可以说是万金油了,今天我们就来好好的看看它 里面到底有些啥,平常我们的使用又该怎么注意。
haoming1100
2019/05/17
6830
Java Review - 并发编程_并发List_CopyOnWriteArrayList源码剖析
并发包中的并发List只有CopyOnWriteArrayList。CopyOnWriteArrayList是一个线程安全的ArrayList,对其进行的修改操作都是在底层的一个复制的数组(快照)上进行的,也就是使用了写时复制策略。
小小工匠
2021/12/30
3570
Java Review - 并发编程_并发List_CopyOnWriteArrayList源码剖析
【面试必备】透过源码角度一步一步带你分析 ArrayList 扩容机制
细心的同学一定会发现 :以无参数构造方法创建 ArrayList 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为10。 下面在我们分析 ArrayList 扩容时会降到这一点内容!
本人秃顶程序员
2019/05/17
6440
ArrayList源码学习
重点了解:数组为EMPTY_ELEMENTDATA就走基于用户设置大小值进行1.5倍扩容(这里是空所以是0),数组为默认空DEFAULTCAPACITY_EMPTY_ELEMENTDATA就会走基于默认值的大小10扩容进行1.5倍扩容
晓果冻
2022/09/08
3820
ArrayList源码学习
【漫画算法学习笔记】第二章——2.1数组
文章目录 数组 1、数组算法之插入中间值 1.1、固定容量插中间值 1.2、超容量插中间值 1.3、数组删除元素 1.4、数组插值完整工具类 数组 1、数组算法之插入中间值 1.1、固定容量插中间值 编写工具类 ArrayUtil package utils; //数组算法之固定容量数组的中间值的插入 public class ArrayUtil { // private static int[] array; //初始化一个数组 private static int size = 0;
啵啵鱼
2022/11/23
2930
【漫画算法学习笔记】第二章——2.1数组
ArrayList和CopyOnWriteArrayList面试题总结与源码分析
首先我们来看List接口,如上因为ArrayList和CopyOnWriteArrayList都是实现了List接口,所有查看其相应的方法即可。
须臾之余
2019/07/19
1.7K0
ArrayList和CopyOnWriteArrayList面试题总结与源码分析
Java 集合深入理解:List 接口
注意:上述使用了 ArrayList 的转换构造函数: public ArrayList(Collection
张拭心 shixinzhang
2019/05/27
5310
在数组内删除指定元素_数组对象删除某一个指定对象
一般来说,我们用数组这种数据结构最多的情况,是用来做查询,时间复杂度为O(1),那么在这里我们来看一下如何用在数组中插入元素和删除元素。 数组的适用场景: 一般在查询中,适用数组的情况是比较多,因为可以根据下标直接访问元素,时间复杂度是O(1),所以适用于读多写少的场景。 数组的插入和删除元素,一般时间复杂度都是O(N),比较麻烦,所以对于插入和删除操作中,不建议选用数组这种数据结构,可以考虑链表。
全栈程序员站长
2022/09/22
2.1K0
面试官:ArrayList扩容机制,你了解吗?
如果觉得内容不错的话,希望大家可以帮忙点赞转发一波,这是对我最大的鼓励,感谢🙏🏻
小熊学Java
2023/07/16
2940
面试官:ArrayList扩容机制,你了解吗?
「源码分析」CopyOnWriteArrayList 中的隐藏知识,你Get了吗?
本觉 CopyOnWriteArrayList 过于简单,寻思看名字就能知道内部的实现逻辑,所以没有写这篇文章的想法,最近又仔细看了下 CopyOnWriteArrayList 的源码实现,大体逻辑没有意外,不过还是发现很多有意思的地方,固留此篇文章分享之。
未读代码
2020/10/29
8680
「源码分析」CopyOnWriteArrayList 中的隐藏知识,你Get了吗?
推荐阅读
相关推荐
Java Review - ArrayList 源码解读
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验