- 浏览: 377188 次
- 来自: 北京
文章分类
- 全部博客 (237)
- XML (6)
- JavaSE (39)
- Junit (1)
- Maven (10)
- JavaScript (12)
- JavaEE (16)
- HTML5 (10)
- java多线程 (8)
- Hibernate (30)
- Java反射 (3)
- Spring (11)
- Struts (1)
- svn (2)
- linux (12)
- 代码实例 (1)
- 设计模式 (1)
- UML (1)
- javassist (1)
- Oracle (3)
- Hibernate异常 (9)
- DWR (6)
- Java泛型 (2)
- SpringMVC (11)
- Dbunit (3)
- github (2)
- Algorithm (1)
- zTree (1)
- jquery (7)
- freemarker (4)
- mysql (5)
- ffmpeg (1)
- 编码 (1)
- lucene (15)
- hadoop (1)
- JVM (1)
- Regular Expressions (5)
- myeclipse (1)
- 爬虫 (7)
- 加密 (3)
- WebService (2)
- Socket (2)
- Windows (1)
最新评论
-
wxpsjm:
好直接
HV000030: No validator could be found for type: java.lang.Integer. -
wxhhbdx:
学习了,对新手来说很不错的教程。
SpringMVC入门 (二) 数值传递 -
xgcai:
正好在学dwr
DWR入门 (二)用户实例
场景如下:
ArrayList<Obj> list
Obj-> createTime, sid.
现在要根据obj的createTime来进行定期清理。(释放内存)
-------------------------
首先想到的方法就是
这个是完全行不通的。这里看一下ArrayList的代码
这里会对elementDate进行循环,当满足条件时,就会执行fastRemove()方法。
fastRemove
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
这里实际上是让数组先位移,后删除最后一个。
关于arraycopy可以参考下面
这里就能明白为什么for循环+remove不能进行批量删除了。
每次执行完fastRemove, 集合里面的数组的size直接就减小1了。同时后面的数组内的对象全部被左移。
也就是说:
[0,1,2,3]
执行for循环第一轮变为-> [1,2,3]
第二轮的时候,指针已经指向了2, 此时 1就被留了下来,并且没有被做任何处理。。
==========================分割线===============================
解决方法是使用iterator
iterator相当于是执行remove之后,指针自动被移动到刚才被删除的地方。 因此再次执行next的时候,就会按照顺序执行下去了。 具体参考iterator源码。
ArrayList<Obj> list
Obj-> createTime, sid.
现在要根据obj的createTime来进行定期清理。(释放内存)
-------------------------
首先想到的方法就是
for(Obj o:list){ if(o.createTime-currentT>xxx){ list.remove(o); } }
这个是完全行不通的。这里看一下ArrayList的代码
public boolean remove(Object o) { if (o == null) { for (int index = 0; index < size; index++) if (elementData[index] == null) { fastRemove(index); return true; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); return true; } } return false; }
这里会对elementDate进行循环,当满足条件时,就会执行fastRemove()方法。
fastRemove
private void fastRemove(int index) { modCount++; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // Let gc do its work }
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
这里实际上是让数组先位移,后删除最后一个。
关于arraycopy可以参考下面
int arr1[] ={0,1,2,3,4,5}; System.arraycopy(arr1, 4, arr1, 3, 2); System.out.println("array1= "); System.out.println(arr1[0]+" "); System.out.println(arr1[1]+" "); System.out.println(arr1[2]+" "); System.out.println(arr1[3]+" "); System.out.println(arr1[4]+" "); System.out.println(arr1[5]+" "); //0 1 2 4 5 5 这里把3删除了,把4和5向左移动了。 elementData[--size]=null在这里就相当于把最后一个5删除了。
这里就能明白为什么for循环+remove不能进行批量删除了。
每次执行完fastRemove, 集合里面的数组的size直接就减小1了。同时后面的数组内的对象全部被左移。
也就是说:
[0,1,2,3]
执行for循环第一轮变为-> [1,2,3]
第二轮的时候,指针已经指向了2, 此时 1就被留了下来,并且没有被做任何处理。。
==========================分割线===============================
解决方法是使用iterator
List<String> list=new ArrayList<String>(); list.add("hello"); list.add("world1"); list.add("world2");list.add("world3"); list.add("world4"); for(Iterator<String>it=list.iterator();it.hasNext();){ String s=(it.next()); System.out.println(s); it.remove(); } System.out.println(list);
iterator相当于是执行remove之后,指针自动被移动到刚才被删除的地方。 因此再次执行next的时候,就会按照顺序执行下去了。 具体参考iterator源码。
发表评论
-
Socket编程的HelloWorld实例
2014-11-07 15:05 903public class Client { ... -
ImageIO宋体出现小方框的解决
2014-11-03 16:34 932http://www.blogjava.net/yuanqix ... -
Java内部类的实例化
2014-08-06 15:51 1039class A{ getInstance(){ ... -
通过Thread.sleep把任务平均分配给线程按顺序执行的小例子
2014-07-22 10:46 1089package com.lj.test.JavaSe4; ... -
输入两个整数, 计算百分比
2014-07-21 18:01 1469public static String getPercen ... -
timer cancel方法的一个小实例
2014-07-21 12:14 1139package com.lj.timer; import ... -
通过Calendar获取上个月的最后一天
2014-06-26 12:11 2877Calendar cal=Calendar.getI ... -
通过BigInteger进行数字进制的相互转换
2014-06-24 11:09 25681. 十六进制转换为十进制 BigInteger deci ... -
[转]RSA实例
2014-06-18 17:27 913package com.lj.rsa; import j ... -
[转]sun.misc.BASE64Encoder找不到jar包的解决方法
2014-06-18 15:43 9491.右键项目-》属性-》java bulid path-》jr ... -
空Object转换String的陷阱
2014-06-17 15:45 810Object a=null; String b ... -
Java Convert Long to Date
2014-06-16 18:06 772问题: I have list with long value ... -
[转]JAVA中List&Set转换
2014-06-07 14:23 535JAVA中List&Set转换 list = new ... -
aes加密时的Illegal key size or default parameters
2014-06-06 14:21 4208KeyGenerator kgen = KeyGenerat ... -
String.replaceLast()
2014-06-03 16:02 1100http://stackoverflow.com/questi ... -
通过正则表达式来获取json数值
2014-05-23 11:39 13private String getJsonValue(Str ... -
java找不到或无法加载主类
2014-05-19 13:21 1287用CMD运行java +类名, 居然碰到这个问题。 编译是没有 ... -
Java转义字符笔记 |
2014-01-12 21:01 921数据库有一个关键字列-keyword,里面存放的关键字格式如下 ... -
char和int类型相互转换
2013-12-10 18:43 1379今天看到别人使用一个方法 ->String.indexO ... -
Java实现Arrays.map2List
2013-12-02 18:18 750public class Test01 { pub ...
相关推荐
- 与DAO层类似,Service层也定义了一个批量删除的方法,参数同样为一个对象列表。 - **实现类**: ```java private DK_Info_BDao DK_Info_BDao; // 需要设置get和set方法 public void deleteAll(List list) { ...
标题中提到的“遍历并批量删除容器中元素”是引发此异常的一个典型操作。在Java中,我们通常会使用`Iterator`来安全地遍历并修改集合,因为`Iterator`提供了`remove()`方法来删除当前迭代的元素。但如果你在不使用`...
MyBatisPlus是MyBatis框架的一个扩展,它提供了更多的便捷功能,包括简化SQL操作、自动填充 CRUD(创建、读取、更新、删除)操作等。在MyBatisPlus 3.5版本中,批量插入功能是其核心优化之一,这对于大数据量的操作...
这段代码中,通过循环遍历`ArrayList`列表中的`GoodsBean`对象,构建对应的插入SQL语句,并使用`addBatch()`方法添加到批处理队列中。最后调用`executeBatch()`方法,一次性执行所有插入操作。 ### 总结 数据库...
在Java编程中,ArrayList是集合框架的一个重要组成部分,它提供了动态数组的功能,允许开发者方便地添加、删除和访问元素。然而,在处理大量数据时,一次性加载所有数据可能会导致内存压力,这时就需要进行分页处理...
例如,使用JPA的`EntityManager.persist()`方法进行批量保存时,实际上是在循环中逐个保存对象,这在性能上并不理想。 为了提升性能,我们可以利用Spring的JdbcTemplate。JdbcTemplate提供了多种方法来支持批量操作...
在本文档中,我们将深入探讨如何使用Java API与HBase数据库进行交互,特别是关于如何创建表、修改表结构以及批量插入数据。HBase是Apache的一个分布式、可扩展的大数据存储系统,它基于谷歌的Bigtable设计,适用于...
两种实现JDBC添加、删除、修改操作的方法对比 在本文中,我们将讨论两种实现JDBC添加、删除、修改操作的方法对比。这些方法可以用来实现添加、删除、修改操作的共用方法,分为两个方法:一个是设置...
### Java一次性查询处理几百万数据解决方法 在Java开发中,处理大数据量是常见的需求之一,特别是当数据规模达到几百万级别时,如何高效、稳定地处理这些数据变得尤为重要。本文将详细介绍一种Java一次性查询处理几...
下面将为大家介绍使用 Java 和 MySQL 实现递归删除树形结构的所有子节点的方法。 一、业务场景 在树形结构中,删除某个父节点时,需要删除其所有子节点,以避免遗留冗余数据。例如,以下树形结构: +—0 +—1 +—...
- **for循环**:一种常用的循环结构,用于重复执行一段代码多次。 - **程序调试技术**:找出并修复程序中的错误的过程。 - **while循环与do-while循环** - **while循环**:当条件为真时重复执行一段代码。 - **...
5. **条件语句与循环**:在处理员工信息时,可能需要使用if...else语句进行条件判断,或者使用for/while循环遍历数据。 6. **文件操作**:可能涉及读写文件,如保存和加载员工数据到文本文件或数据库,这就需要用到...
- `for`循环适用于已知循环次数的情况。 - `while`循环适合于未知循环次数的情况。 - 示例代码展示两种循环的不同应用场景。 **垃圾回收机制** - Java通过自动垃圾回收管理内存,回收不再使用的对象所占的空间。 - ...
-增强的for循环(foreach):`for (int element : myArray) { System.out.println(element); }` 6. **Java中的数组操作示例**: - `ArrayDemo.java`可能演示了基本的数组创建、初始化、访问和遍历操作。 - `...
- 遍历集合,可以使用迭代器(Iterator)或增强for循环(foreach)。 4. **泛型**: - 泛型在集合框架中的应用,用于限制集合中存储的数据类型,提高代码安全性和可读性。 5. **Collection和Iterable接口**: -...
例如,我们可以创建一个ArrayList来存储多个矩形的坐标,然后在一个循环中调用canvas.drawRect()来绘制这些矩形。这样可以方便地管理多个图形,同时进行添加、删除或修改操作。 ```java List<Rect> rects = new ...
此外,`Vector` 还提供了 `removeAllElements()` 方法来清空整个列表,这对于批量删除元素非常有用。 示例代码: ```java v.removeAllElements(); ``` **2.3 性能优化** 为了提高性能,建议在初始化 `Vector` 时...
在Java编程中,有时我们需要对批量数据进行分批处理,特别是在大数据或性能优化的场景下。List集合是Java集合框架中常用的一种数据结构,用于存储有序的元素序列。本篇文章将详细讲解如何使用Java实现将一个List集合...
- 循环添加数据:`for (int i = 0; i ; i++) { String str = "Item" + i; list.add(str); }` 3. **设置多选状态**: - 使用布尔变量`isMultiSelect`来控制多选模式的开启与关闭。 4. **创建适配器**: - 自定义...
Java 5之后,引入了增强型for循环,使得遍历集合更加简洁方便。 具体到实现层面,例如HashSet,它实现了Set接口,使用哈希表来存储集合元素,其内部通过HashMap实现。当我们创建HashSet实例时,可以指定初始容量和...