public class TestListSet {
private static String LABEL = "testlistset";
public static void main(String[] args) {
List<String> list = getList();
Set<String> set = getSet();
String tt = LABEL + 83445;
long tt0 = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
list.contains(tt);
}
long tt1 = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
set.contains(tt);
}
long tt2 = System.currentTimeMillis();
System.out.println(String.format("compare list(%d) vs set(%d) ", (tt1 - tt0), (tt2 - tt1)));
}
/**
* @Title: getSet
* @Description: TODO
* @return
*/
private static Set<String> getSet() {
long t0 = System.currentTimeMillis();
Set<String> set = new HashSet<>();
for (int i = 0; i < 100000; i++) {
set.add(LABEL + i);
}
long t1 = System.currentTimeMillis();
System.out.println("init set 10W times = " + (t1 - t0));
return set;
}
/**
* @Title: getList
* @Description: TODO
* @return
*/
private static List<String> getList() {
long t0 = System.currentTimeMillis();
List<String> list = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
list.add(LABEL + i);
}
long t1 = System.currentTimeMillis();
System.out.println("init list 10W times = " + (t1 - t0));
return list;
}
}
结果
init list 10W times = 23
init set 10W times = 50
compare list(70529) vs set(4)
说明
List中contains():调用indexOf(o)方法 遍历List中的每个元素,每个元素与比较对象进行equals()比较,只要有一个相同,就返回true 意思是说他就是会扫描整个List
Set中的contain():调用的是map.containKey(o),内部使用的是Hashtable
/**
* Returns <tt>true</tt> if this map contains a mapping for the
* specified key.
*
* @param key The key whose presence in this map is to be tested
* @return <tt>true</tt> if this map contains a mapping for the specified
* key.
*/
public boolean containsKey(Object key) {
return getNode(hash(key), key) != null;
}
所以如果在大队列中嵌套循环中比较存在的话,请选用hashset,效率会大大提升。
分享到:
相关推荐
hash的另一个特点是查找效率为O(1),惊人的高! 对于这道题目要是算出来O(M*N)的同学就应该补课了。出来混,迟早要还的。 HashSet类 HashSet类主要是设计用来做高性能集运算的,例如对两个集合求交集、并集、差集...
Java容器 有两种容器:一个是Collection容器,存放对象的集合;...LinkedHashSet:具有HashSet查找效率,同时前后链维持数据的插入顺序。 TreeSet:基于红黑树实现,支持有序性操作。 List List集合看重的是有序,同
Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...
Collection是集合类的上级接口,继承与他的接口主要有Set 和List. Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 10、&和&&的区别。 &是位运算符...
Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...
Collection是集合类的上级接口,继承与他的接口主要有Set 和List. Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 13、&和&&的区别。 &是位运算符...
List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问,查找元素效率高,插入删除效率低。 Set集合是无序集合,集合中的元素不可以重复,检索效率低下,删除和插入效率高,访问集合...
角色是一组权限的集合,将角色赋给一个用户,这个用户就拥有了这个角色中的所有权限。 系统预定义角色 预定义角色是在数据库安装后,系统自动创建的一些常用的角色。下面我们就简单介绍些系统角色: CONNECT...
而Remoting可以利用TCP/IP,二进制传送提高效率。 31.公司要求开发一个继承System.Windows.Forms.ListView类的组件,要求达到以下的特殊功能:点击ListView各列列头时,能按照点击列的每行值进行重排视图中的所有行...
Karen Morton及其团队在本书中提供了专业的方案:先掌握语言特性,再学习Oracle为提升语言效率而加入的支持特性,进而将两者综合考虑并在工作中加以应用。作者通过总结各自多年的软件开发和教学培训经验,与大家...