关于两个list深层遍历

原创
2017/11/12 22:37
阅读数 184

这两天突然有个想法 就是关于两个装满对象的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条的话基本持平 .

所以这还是看情况而定.

话说各位大神如果有更好的方法,望不吝赐教.

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部