`
naouguhtaeyeti
  • 浏览: 20631 次
文章分类
社区版块
存档分类
最新评论

Java 集合

    博客分类:
  • java
阅读更多
今天在做如何从两个数组中取出相同的元素时碰到了一个问题,想知道下面哪种算法更快,(听说是HashSet 的会更快,但是想知道为什么会更快呢?):
具体测试程序:
/**
 * get the same element in two arrays 
 */
import java.util.*;
import java.io.*;
public class AlgorithmTest{
	public static void main(String[] args)throws Exception{
		
		// read the data from file
		FileReader fr = new FileReader("C:/test_data_1.txt");
		int temp;
		StringBuilder sb= new StringBuilder();
		while((temp=fr.read())!=-1){
			sb.append((char)temp);
		}
	//	System.out.println(sb);
		String[] a = sb.toString().split(" ");
		Integer[] in1 = new Integer[a.length];
		for(int i=0;i<a.length;i++){
		 	in1[i] = Integer.parseInt(a[i]);
			}

		Integer[] in2 = new Integer[10000];
		for(int i=0;i<10000;i++){
			in2[i] = in1[i*2];
		}
		long before,after;
		
	
		
		
		// Algorithm 1
		Set bs = new HashSet(Arrays.asList(in2));
		List<Integer> result = new ArrayList<Integer>();
		before = System.currentTimeMillis();
		for(int i=0;i<in1.length;i++){
			if(bs.contains(in1[i])){
			//	System.out.println(a[i]);
				result.add(in1[i]);
			}
		}
		after = System.currentTimeMillis();
		System.out.println("HashSet Result :" + result.size());
		System.out.println("HashSet Algorithm using time :" + (after-before));
		
		// Algorithm 2
		result = new ArrayList<Integer>();
		before = System.currentTimeMillis();
		for(int i=0;i<in1.length;i++)
			for(int j=0;j<in2.length;j++)
			{
				if(in1[i].equals(in2[j])){
					result.add(in1[i]);
				}
			}
		after = System.currentTimeMillis();
		System.out.println("two loops Result :" + result.size());
		System.out.println("two loops Algorithm using time :" + (after-before));
	}
}


其中,test data file 是用这个类生成的
/**
 * generate the large test data
 */
import java.io.*;
public class GenTestData{
	public static void main(String[] args)throws Exception{
	  String fn = "C:/test_data_1.txt";
		FileWriter fs = new FileWriter(fn);
		for(int i=0;i<100000;i++){
			// 直接写字符串
			fs.write(i+" ");
		}	
	}
}



运行结果:

HashSet Result :10001
HashSet Algorithm using time :15
two loops Result :10001
two loops Algorithm using time :11060


结果分析:

java 的HashSet 的contains(Object o) 方法内部采用的是map.containsKey()方法。
private transient HashMap<E,Object> map;
public boolean contains(Object o) {
	return map.containsKey(o);
}
而containsKey 方法的具体实现:
/**
     * 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) {
        Object k = maskNull(key);

        int hash = hash(k.hashCode());
        int i = indexFor(hash, table.length);
        Entry e = table[i]; 
        while (e != null) {
            if (e.hash == hash && eq(k, e.key)) 
                return true;
            e = e.next;
        }
        return false;
}


上面的具体实现用到了哈希算法,即根据一个对象的hashCode 可以用(1)的时间判断该对象是否在这个map 里,如果在,只需要跟一些hashCode 值跟该对象一样的对象比较一下内容,就可得出答案,而这个在双重循环里需要一个一个跟所有的对象比较,显然效率不一样。











在上面的代码实现中用到了API一些函数,列出在此了解参考
    /**
     * Check for equality of non-null reference x and possibly-null y.
     */
    static boolean eq(Object x, Object y) {
       return x == y || x.equals(y);
    }
Entry class : static class Entry<K,V> implements Map.Entry<K,V>
        //  Returns internal representation for key. Use NULL_KEY if key is null.

  static <T> T maskNull(T key) {
        return key == null ? (T)NULL_KEY : key;
    }

分享到:
评论

相关推荐

    java集合思维导图

    Java集合框架是Java编程语言中的一个核心部分,它为数据存储和管理提供了高效且灵活的解决方案。本思维导图及总结旨在深入理解并掌握Java集合的相关概念和使用方法。 首先,我们来了解一下Java集合框架的基本构成。...

    java 集合

    本文将深入探讨Java集合框架的基础知识,包括接口、类、以及它们在实际开发中的应用。 首先,Java集合框架由一系列接口和实现这些接口的类组成。主要的接口有`List`、`Set`和`Queue`,它们各自代表了不同特性的数据...

    java 集合练习题

    在这个“java集合练习题”中,我们主要关注如何使用Java集合框架来处理数据,特别是对于学生信息的存储、排序和输出。以下是对这个练习题的详细解析: 1. **集合框架简介**: Java集合框架是Java API的一部分,它...

    Java集合思维导图.xmind.zip

    Java集合框架是Java编程语言中不可或缺的一部分,它提供了一组高效的数据结构和算法,使得开发者可以方便地存储和管理对象。这份"Java集合思维导图.xmind.zip"压缩包文件,显然旨在帮助学习者深入理解Java集合框架的...

    java集合知识大全

    ### Java集合知识大全 #### 一、集合概述 在Java编程语言中,集合是一组用于存储其他对象的对象。集合框架提供了多种数据结构,用于管理不同类型的数据。这些数据结构包括列表(List)、集(Set)、映射(Map)等,每种...

    【Java】Java集合框架思维导图。

    xmind格式的Java集合框架学习导图,包括Collection接口/Map接口以及具体实现类。 同样包含大厂面试题,也在导图中有所体现。 能学到什么: 更加成体系的知识框架,更加全面的、系统的知识。 思维导图: 思维导图具有...

    Java集合排序及java集合类详解

    Java集合框架是Java编程语言中的一个核心组成部分,它为数据存储和操作提供了丰富的接口和类。在本篇中,我们将深入探讨Java集合的排序机制以及集合类的详细使用。 首先,我们来了解一下Java集合的基本分类。Java...

    java 集合分组与排序

    Java集合框架中的`List`接口和数组(Array)是两种常用的数据结构,它们在处理数据时各有优势。下面我们将深入探讨如何在Java中实现集合的分组与排序。 1. **集合分组**: 集合分组通常涉及到`GroupingBy`操作,这...

    实验七:Java集合与泛型

    Java集合框架是Java编程语言中用于存储和管理对象的核心组件,它包括了各种接口和类,为处理数据提供了丰富的选择。在本次实验中,我们深入学习了Java集合框架中的两个主要部分:List接口和Map接口,以及它们的主要...

    java 集合部分笔记

    【Java集合】 Java集合框架是Java编程语言中用于存储和操作对象的工具,它提供了多种数据结构,如列表、集、映射等,以适应不同的数据处理需求。集合类通常位于`java.util`包下,是Java程序员必备的知识点。 1. **...

    Java集合框架总结

    ### Java集合框架总结 #### 一、Java集合框架概述 Java集合框架是Java标准库的一部分,它提供了一系列的接口和类来存储和操作各种类型的对象集合。这些接口和类遵循一致的设计模式,使得开发人员可以方便地管理和...

    java集合类详解(set list ArrayList等java集合类详述)

    Java 集合类详解 Java 集合类是 Java 语言中的一种基本数据结构,用于存储和操作大量数据。集合类可以分为三大类:Collection、List 和 Set。 Collection 是集合框架中的根接口,提供了基本的集合操作,如 add、...

    实验05 Java集合.doc

    Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了一组高级的数据结构,使得开发者能够更方便地管理和操作对象。在本次实验中,我们主要关注了三个主要的集合接口:Set、List和Map,以及它们的一些常见...

    java集合框架的使用。集合的运算

    Java集合框架是Java编程语言中一个非常重要的组成部分,它为开发者提供了存储和操作对象的统一接口和类。这个框架使得处理各种数据结构变得更加方便和高效。在这个“java集合框架的使用”主题中,我们将深入探讨如何...

    一个讲解很清晰的Java集合框架PPT

    Java集合框架是Java编程语言中不可或缺的一部分,它提供了一组接口和类,用于高效地存储、管理和操作数据。这个“一个讲解很清晰的Java集合框架PPT”显然是一个对外公开的教育资源,旨在帮助学习者深入理解Java集合...

    Java集合详解,详细讲解java的集合类

    Java集合框架是Java编程语言中的核心部分,它提供了一种高效、灵活的方式来组织和操作对象的集合。在Java中,集合主要分为两大类:Collection和Map。本文将深入讲解Java集合类,特别是Collection接口和其下的List、...

    Java集合整体讲解

    Java集合整体讲解,其中包含了Collection,Map,Iterator和一些工具类,以及集合整体大框架

    深入Java集合学习系列

    Java集合框架是Java编程语言中的核心组件之一,它为存储、管理和操作对象提供了一套高效且灵活的工具。本系列深入讲解了Java集合框架中的重要组成部分,包括HashMap、ArrayList、LinkedHashMap、HashSet以及...

    Java基础篇:Java集合.pdf

    该文档主要详细总结了Java集合的相关知识,包括Collection和Map接口、Collection接口的子接口List和Set接口以及具体的实现类、存储原理等;Map接口的子接口HashMap、LinkedHashMap、TreeMap、Properties等

Global site tag (gtag.js) - Google Analytics