1.什么是hash
来源于百度百科:
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
2.hash表的作用:
我拿了10w级别的数据,分别对3种结构,数组实现的Arraylist,链表实现的LinkedList和hashmap进行了测试,
测试了增删查改4种操作
测试结果表明hashmap在查询上不具有任何优势,它的优势在于修改,增加,删除数据时提高效率,它是链表和数组的一种结合.(测试代码在本文结尾处)
3.hash表可能存在的问题:
碰撞:不同的输入值,得到相同的散列值,
解决方法:挂外链,重新构造hash函数
4.测试代码如下
4.1ArrayList
package s0404数组列表哈希表效率测试; import java.util.ArrayList; public class ArrayMain { public static void main(String[] args){ int n=100000; ArrayList<User> list=new ArrayList<User>(); long startTime=System.currentTimeMillis(); //增加100w个数据的时间********************************************************* for(int i=0;i<n;i++) { list.add(new User(i)); } long endTime=System.currentTimeMillis(); System.out.println("增加10w个数据所用的时间"+(endTime-startTime)+"ms"); //增加100w个数据的时间********************************************************* // //删除数据的时间********************************************************* // long startTime3=System.currentTimeMillis(); // for(int i=list.size()-1;i>=0;i--) // { // list.remove(list.get(i)); // // } // long endTime3=System.currentTimeMillis(); // System.out.println("删除10w个数据所用的时间"+(endTime3-startTime3)+"ms"); // //删除数据的时间********************************************************* // //查询10w个数据的时间********************************************************* // long startTime4=System.currentTimeMillis(); // for(int i=list.size()-1;i>=0;i--) // { // list.get(i).getAge(); // // } // long endTime4=System.currentTimeMillis(); // System.out.println("查询10w个数据所用的时间"+(endTime4-startTime4)+"ms"); // //查询10w个数据的时间********************************************************* // //改数据的时间********************************************************* // long startTime4=System.currentTimeMillis(); // for(int i=0;i<list.size();i++) // { // list.get(i).setAge(i+1); // // } // long endTime4=System.currentTimeMillis(); // System.out.println("改数据所用的时间"+(endTime4-startTime4)+"ms"); // //改数据的时间********************************************************* } }
4.2LinkedList
package s0404数组列表哈希表效率测试; import java.util.LinkedList; public class LieBiaoMain { public static void main(String[] args){ int n=100000; LinkedList<User> list=new LinkedList<User>(); long startTime=System.currentTimeMillis(); //增加数据的时间********************************************************* for(int i=0;i<n;i++) { list.add(new User(i)); } long endTime=System.currentTimeMillis(); System.out.println("增加10w个数据所用的时间"+(endTime-startTime)+"ms"); //增加数据的时间********************************************************* // //删除数据的时间********************************************************* // long startTime3=System.currentTimeMillis(); // for(int i=0;i<list.size();i++) // { // list.remove(list.get(i)); // } // long endTime3=System.currentTimeMillis(); // System.out.println("删除10w个数据所用的时间"+(endTime3-startTime3)+"ms"); // //删除数据的时间********************************************************* // //查询数据的时间********************************************************* // long startTime4=System.currentTimeMillis(); // for(int i=0;i<list.size();i++) // { // list.get(i).getAge(); // } // long endTime4=System.currentTimeMillis(); // System.out.println("查询10w个数据所用的时间"+(endTime4-startTime4)+"ms"); // //查询数据的时间********************************************************* // //改数据的时间********************************************************* // long startTime4=System.currentTimeMillis(); // for(int i=0;i<list.size();i++) // { // list.get(i).setAge(i+1); // // } // long endTime4=System.currentTimeMillis(); // System.out.println("改数据所用的时间"+(endTime4-startTime4)+"ms"); // //改数据的时间********************************************************* } } 4.3 hashmap package s0404数组列表哈希表效率测试; import java.util.HashMap; public class HashMain { public static void main(String[] args){ int n=100000; HashMap<Integer,User> list=new HashMap<Integer,User>(); long startTime=System.currentTimeMillis(); //增加100w个数据的时间********************************************************* for(int i=0;i<n;i++) { list.put(i,new User(i)); } long endTime=System.currentTimeMillis(); System.out.println("增加"+n+"个数据所用的时间"+(endTime-startTime)+"ms"); //增加100w个数据的时间********************************************************* // //删除数据的时间********************************************************* // long startTime3=System.currentTimeMillis(); // for(int i=list.size()-1;i>=0;i--) // { // list.remove(list.get(i)); // // } // long endTime3=System.currentTimeMillis(); // System.out.println("删除"+n+"个数据所用的时间"+(endTime3-startTime3)+"ms"); // //删除数据的时间********************************************************* // //查询10w个数据的时间********************************************************* // long startTime4=System.currentTimeMillis(); // for(int i=0;i<list.size();i++) // { // list.get(i).getAge(); // // } // long endTime4=System.currentTimeMillis(); // System.out.println("查询"+n+"个数据所用的时间"+(endTime4-startTime4)+"ms"); //查询10w个数据的时间********************************************************* //改数据的时间********************************************************* long startTime4=System.currentTimeMillis(); for(int i=0;i<list.size();i++) { list.get(i).setAge(i+1); } long endTime4=System.currentTimeMillis(); System.out.println("改数据所用的时间"+(endTime4-startTime4)+"ms"); //改数据的时间********************************************************* } }
4.4User类
package s0404数组列表哈希表效率测试; public class User { private int age; public User(int age) { this.age=age; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }