List<Bean> list = new ArrayList<Bean>();Bean里面有个属性id,把id等于1的全部删掉;这个list里可能有很多数据,请问高手们要怎么删除才最有效率?
解决方案 »
- Struts2提交页面时报404错误
- java获取红旗linux 5的系统字体抛出异常,急急急
- Oracle存Clob出错
- javamail中的webapp里的那个demo登陆不进,请高手帮忙
- 50分求mod_jk_1.2.6_2.0.50.dll这个文件
- 求助:我安装后j2ee后不能运行,是不是与安装了Tomcat有关啊!(郁闷中)
- struts框架中一jsp页面的问题,100分
- 请教更改XML的方法
- 请教高手:如何用软件实现新旧两个基于Struts的WebApp系统的实时热切换(内详)
- 关于applet的问题
- hibernate 多条更新操作 放在同一个事务里面 是否可行
- Java调用webservice问题
for如果从最后的元素先前遍历删除,比从最前向最后遍历删除理论上移动的记录要少点,要快一点。如果删除太多建议直接用linkedlist会快点。
eg:Map<Long,Bean> map = new Map<Long,Bean>();
1)定义两个下标变量i,j都指向List的初始下标0,
2)判断i的位置是否是要删除的元素,如果是j先下移看j的下标处元素是否应该删除,如果是则j继续
向下移动,遇到不要删除的记录是把j处元素拷贝到i处同时i++,j++。重复上面的操作直到遍历完
整个列表
3)循环判断List.size > i + 1,每次循环删除List的最后一个元素。end~~
import java.util.List;public class HighEffectDelete { public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 100000; i++) {
list.add(i);
if (i % 10 == 0)
list.add(0);
} Long start = System.currentTimeMillis();
effectiveDelete(list, 0);
//normalDelete(list, 0);
System.out.println((System.currentTimeMillis() - start));
} public static void normalDelete(List<Integer> list, Object key) {
for (int i = list.size() - 1; i > -1; i--) {
if (key.equals(list.get(i)))
list.remove(i);
}
} public static void effectiveDelete(List<Integer> list, Object key) {
int i = 0, j = 0, size = list.size();
while (j < size) {
Integer elem = list.get(j);
if (key.equals(elem)) {
for (j = j + 1; j < size && key.equals(list.get(j)); j++)
; while (j < size) {
Integer o = list.get(j);
if (!key.equals(o)) {
list.set(i, o);
i++;
j++;
} else {
break;
}
}
} else {
i++;
j++;
}
} for (int k = size - 1; k >= i; k--) {
list.remove(k);
}
}}normalDelete的时间要远大于effectiveDelete,effectiveDelete可以实现100万级删除,而normalDelete在10万级的测试中性能已经不能接受了。