這兩天忽然有個想法 就是關於兩個裝滿對象的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條的話基本持平 .
因此這仍是看狀況而定.
話說各位大神若是有更好的方法,望不吝賜教.