这两天突然有个想法 就是关于两个装满对象的list,其中ist1要去取id相同的list2中对象的值.
原来一直用深层遍历的方法来取值,但是总感觉这个方法很慢.一旦数据量过大 这遍历次数就成几何的增加,
今天突然想到可以用Map的方法来取值,然后我就进行了下测试 关于深层遍历和Map的取值的速度问题
package demo.mapLisr;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import demo.model.student;
public class demo {
public static void main(String[] args) {
demo d = new demo();
List<student> sl = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
String a = i + "";
student ss = new student();
ss.setId(Long.parseLong(a));
//随机两个汉字
ss.setName(demo.getRandomJianHan(2));
sl.add(ss);
}
List<student> sl2 = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
String a = i + "";
student ss = new student();
ss.setId(Long.parseLong(a));
java.util.Random random = new java.util.Random();
String b = random.nextInt(10) + "";
ss.setSex(b);
sl2.add(ss);
}
long sa = System.nanoTime();
// d.list(sl, sl2);
d.map(sl, sl2);
long aaa = System.nanoTime();
System.out.println(aaa - sa);
// System.out.println(sl2);
// System.out.println(sl);
}
private void map(List<student> sl, List<student> sl2) {
Map<String, Object> map = new HashMap<>();
for (int i = 0; i < sl2.size(); i++) {
student student = sl2.get(i);
map.put(student.getId().toString(), student);
}
for (int i = 0; i < sl.size(); i++) {
student ss = sl.get(i);
String string = ss.getId().toString();
student object = (student) map.get(string);
if (object != null) {
ss.setSex(object.getSex());
}
}
}
private void list(List<student> sl, List<student> sl2) {
for (int i = 0; i < sl.size(); i++) {
student student = sl.get(i);
for (int j = 0; j < sl2.size(); j++) {
if (student.getId().longValue() == sl2.get(j).getId()) {
student.setSex(sl2.get(j).getSex());
}
}
}
}
public static String getRandomJianHan(int len) {
String ret = "";
for (int i = 0; i < len; i++) {
String str = null;
int hightPos, lowPos; // 定义高低位
Random random = new Random();
hightPos = (176 + Math.abs(random.nextInt(39))); // 获取高位值
lowPos = (161 + Math.abs(random.nextInt(93))); // 获取低位值
byte[] b = new byte[2];
b[0] = (new Integer(hightPos).byteValue());
b[1] = (new Integer(lowPos).byteValue());
try {
str = new String(b, "GBk"); // 转成中文
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
}
ret += str;
}
return ret;
}
}
然后测试了一下速度问题 先测试了一下一个list1000条数据,另一个100
Map取值速度 大概是 2W纳秒左右
List深层遍历的速度是 4W纳秒左右
然后又测试 一个list 1W数据,另一个1千数据
Map的取值速度 大概900W纳秒
List的速度 大概是8000W纳秒左右
但是 如果数据量不大
比如一个List中的数据在5条以下那么用深层遍历反而比map的取值要快上不少,
5条的话基本持平 .
所以这还是看情况而定.
话说各位大神如果有更好的方法,望不吝赐教.