删除元素再看一下删除元素的方法
remove()
的源码:// 按照下标删除元素public E remove(int index) { // 加锁,保证线程安全 final ReentrantLock lock = this.lock; lock.lock(); try { // 获取原数组 Object[] elements = getArray(); int len = elements.length; E oldValue = get(elements, index); // 计算需要移动的元素个数 int numMoved = len - index - 1; if (numMoved == 0) { // 0表示删除的是数组末尾的元素 setArray(Arrays.copyOf(elements, len - 1)); } else { // 创建一个新数组,长度是原数组长度-1 Object[] newElements = new Object[len - 1]; // 把原数组下标前后两段的元素都拷贝到新数组里面 System.arraycopy(elements, 0, newElements, 0, index); System.arraycopy(elements, index + 1, newElements, index, numMoved); // 替换原数组 setArray(newElements); } return oldValue; } finally { // 释放锁 lock.unlock(); }}
删除元素的流程:- 先使用ReentrantLock加锁,保证线程安全 。
- 再创建一个新数组,长度是原数组长度-1 , 并把原数组中剩余元素(不包含需要删除的元素)拷贝到新数组里面 。
- 使用新数组替换掉原数组
- 最后释放锁
批量删除再看一下批量删除元素方法
removeAll()
的源码:// 批量删除元素public boolean removeAll(Collection<?> c) { // 参数判空 if (c == null) { throw new NullPointerException(); } // 加锁,保证线程安全 final ReentrantLock lock = this.lock; lock.lock(); try { // 获取原数组 Object[] elements = getArray(); int len = elements.length; if (len != 0) { // 创建一个新数组,长度暂时使用原数组的长度 , 因为不知道要删除多少个元素 。 Object[] temp = new Object[len]; // newlen表示新数组中元素个数 int newlen = 0; // 遍历原数组,把需要保留的元素放到新数组中 for (int i = 0; i < len; ++i) { Object element = elements[i]; if (!c.contAIns(element)) { temp[newlen++] = element; } } // 如果新数组没有满,就释放空白位置,并覆盖原数组 if (newlen != len) { setArray(Arrays.copyOf(temp, newlen)); return true; } } return false; } finally { // 释放锁 lock.unlock(); }}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 姜黎黎真是美了一辈子,69岁穿衣极简仍优雅高级,到老都没大妈感
- 睡觉多梦怎么办
- 跳绳怎么练能跳更快?
- 皮肤最好的状态是什么?
- 手机电脑的芯片主要是由什么物质组成
- 双胞胎名字是一对成语 双胞胎女儿洋气名字
- 忽见陌头杨柳色下一句,悔教夫婿觅封侯的完整诗句是什么
- 怎么用QQ开通微信,为什么用QQ账号还是登录不上微信
- 章子怡还是朱丹?这次周一围用行动说明了一切
- 久未露面的赵薇现身机场,手臂伤疤明显疑被家暴,47岁活像是个60岁大妈