这两天忽然有个想法 就是关于两个装满对象的list,其中ist1要去取id相同的list2中对象的值.java
原来一直用深层遍历的方法来取值,可是总感受这个方法很慢.一旦数据量过大 这遍历次数就成几何的增长,dom
今天忽然想到能够用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条数据,另外一个100code
Map取值速度 大概是 2W纳秒左右对象
List深层遍历的速度是 4W纳秒左右get
而后又测试 一个list 1W数据,另外一个1千数据string
Map的取值速度 大概900W纳秒io
List的速度 大概是8000W纳秒左右class
可是 若是数据量不大import
好比一个List中的数据在5条如下那么用深层遍历反而比map的取值要快上很多,
5条的话基本持平 .
因此这仍是看状况而定.
话说各位大神若是有更好的方法,望不吝赐教.