關於兩個list深層遍歷

這兩天忽然有個想法 就是關於兩個裝滿對象的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條的話基本持平 .

因此這仍是看狀況而定.

話說各位大神若是有更好的方法,望不吝賜教.

相關文章
相關標籤/搜索