您的位置:首页 > 其它

2.ArrayList LinkedList之remove

2014-03-18 09:43 246 查看
remove操作,其实真实的开发中很少用到,可能是我经验尚少的缘故吧,我在开发中很少用到删除操作。

但是,虽然是一个很少用到的操作,其原理还是很值得大家学习的。

1.尾部删除

这种方式针对ArrayList和LinkedList 时间复杂度是一样的 都是常数时间

2.头部删除

这种方式针对ArrayList和LinkedList的时间复杂度是不同的

针对ArrayList

如果在头部删除元素,那么尾部元素会逐个向前移动一个位置,此时的时间复杂度是O(n)

针对LinkedList

此时在头部删除元素,只是将头部的下一个元素变成头部元素即可,原来的头部元素置为null(方便gc)。这样,时间复杂度是一个常数时间

3.中间位置删除

针对ArrayList,会将site()/2的元素向前移动一个位置,时间复杂度是O(n)

针对LinkedList,如果要删除中间元素,首先需要的就是找到该元素,如果我们频繁的删除中间元素,那么就会频繁的查找中间位置的元素然后才会执行删除操作。这样来说,其实并不比ArrayList所用的时间少。

package com.luzm.datastructure.list;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class TestList {

public static void main(String[] args) {
List<Integer> arrayList = new ArrayList<Integer>();
List<Integer> linkedList = new LinkedList<Integer>();

generateList(arrayList);
generateList(linkedList);

System.out.println("测试ArrayList");
testRemove(arrayList);

System.out.println("测试LinkedList");
testRemove(linkedList);
}

public static void generateList(List<Integer> list) {
for(int i = 0 ; i < 100000 ; i ++) {
list.add(i);
}
}
/**
* 测试删除,删除偶数
* @param list
*/
public static void testRemove(List<Integer> list) {
if (list == null) {
return;
}
if (0 == list.size()) {
return;
}

// 方式1
long before = System.currentTimeMillis();
//		for (int i = 0; i < list.size(); i++) {
//			if (list.get(i) % 2 == 0) {
//				list.remove(i);
//			}
//		}
long after = System.currentTimeMillis();
//		System.out.println("使用for循环的方式 使用时间:" + (after - before) + "毫秒");

//方式2 -增强for循环 -抛出异常
//		before = System.currentTimeMillis();
//		for(Integer tem : list) {
//			try{
//				if(tem % 2 == 0) {
//					list.remove(tem);
//				}
//			} catch (Exception ex) {
//				System.out.println(ex);
//				System.out.println("增强for循环异常");
//			}
//		}
//		after = System.currentTimeMillis();
//		System.out.println("使用增强for循环 使用时间:" + (after - before) + "毫秒");
//方式3-Iterator方式

Iterator<Integer> ite = list.iterator();
before = System.currentTimeMillis();
while(ite.hasNext()) {
if(ite.next() % 2 == 0) {
ite.remove();
}
}
after = System.currentTimeMillis();
System.out.println("使用Iterator方式 使用时间:" + (after - before) + "毫秒");

}

}


源码中有几个例子,大家看看,如有任何疑问可以留言,我会尽我所能解答的。如有任何错误,请不吝赐教!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: