如何在Java中使用HashMap改进查找性能

  介绍

如何在Java中使用HashMap改进查找性能吗?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

Java中,HashMap,其实就是键值对。一个关键,对应一个值;写数据时,指定主要写对应值;读取时凭关键找到相应值。感觉就跟复述,差不多。

//,创建,HashMap 对象,网站   HashMap<整数,String>, Sites =, new  HashMap<整数,,String> ();//,添加键值对   Sites.put (1,“Google");   Sites.put (2,“Runoob");   Sites.put (3,“Taobao");   Sites.put (4,“Zhihu");//读取   String  val =, Sites.get(1);//得到谷歌

为什么说可以用HashMap来改进性能呢?原因不是说HashMap这种数据结构存储性能就比其他的,比如数组,集合先进多少。我主要看中的,是在知道关键的情况下,找到相应值得速度非常快。如果是用数组,最简单的,用循环;讲究一点,排好序,用折半查找(二分查找)。都比不上用关键在HashMap里直接读取。不知道为什么HashMap在查找方面为啥这么快,估计是存储结构,使用了啥树,并为关键的建立了索引。这是另外一个课题,以后再了解。昨天,我只是利用了这个特性,将运行几个小时都没结束的问题,只耗费了十几秒。

问题如下:
万有25条记录,每条记录含经纬度;存在不同记录坐标相同情况。现在想将坐标相同的记录归并在一起。

如果数据是保存在数据库里,那么用SQL进行坐标分组,应该能解决问题。然而并没有数据库,数据是从gdb文件里读出来的。

好吧,将数据保存到数组里,再新建一个集合,然后循环数组,与新集合中的记录逐个比较,坐标相同就归并到新集合,不同就插入新集合。最简单了。结果2个小时过去了,还没有结束的迹象。

想想也对,新集合越来越大,比较的次数也越来越多,仿佛棋盘里的大米一样,每格的大米数量是前一格的两倍;最后即使是整个国家粮库的大米都放进去,都填不满整个棋盘。

将25万条记录先排好序再处理?单是排序就忙死了,不行吧。

将25万条记录先保存到数据库里,再分组?应该也可以,但总觉得笨了一些,而且速度应该也是以分钟算的。

最后决定用HashMap来做这个新集合。
如上所述,HashMap按照关键来写入或读取值。关键是这个关键怎么得来。上面的例子,是写代码的人自己给出了一些字符作为关键。而在我们项目中,可以用经纬度之和的哈希值来作为关键。哈希值相同的,就认为是经纬度相同,只需要判断新集合中,是否存在这个关键对应的元素就可以了,根本无须循环比较。

由于存在两个不同的经纬度加起来,结果是一样的可能性,因此先将经度乘以1000,再加纬度,这样基本杜绝冲突的机会。

代码如下:

private  HashMap<长,SimpleItem>, recGeo(时间长,HashMap,地图,String 地理,int  j) {   ,/*   ,,,将相同坐标的记录合成一条   ,,,HashMap<长,SimpleItem>,地图,新集合   ,,,String 地理,,坐标字符串   ,,,int  j 记录ID   ,,*/try {才能   ,,,Point  p =,(点)reader.read (geo);   ,,/*   ,,,,,计算哈希值   ,,,,,因为如果采用循环来比较,数据量太大,速度太慢了   ,,,,,为避免不同坐标出现经度+纬度结果相同的情况,将经度,*,1000再相加   ,,,*/,,,//计算的关键   ,,,long  k =, Long.valueOf (Double.doubleToLongBits (p.getX (), *, 1000, +, p.getY ())) .hashCode ();   ,,,,   ,,,SimpleItem  si =, map.get (k);   ,,,如果(si  !=, null){//新集合中该密钥对应元素已存在,应该是相同坐标的记录   ,,,,,si.getPointers阀门()(j);//归并   ,,,},else {//否则插入   ,,,,,si =, new  SimpleItem ();   ,,,,,si.setGeo (geo);   ,,,,,List, pointers =, new  ArrayList ();   ,,,,,pointers.add (j);   ,,,,,si.setPointers(指针);   ,,,,,map.put (k, si);   ,,,}   ,,},catch  (ParseException  e), {   ,,,e.printStackTrace ();   ,,}      return 才能;地图;   }      private  static  GeometryFactory  GeometryFactory =, JTSFactoryFinder.getGeometryFactory (, null );   private  static  WKTReader  reader =, new  WKTReader (, geometryFactory );   class  SimpleItem {   private 才能Point 地理;   private 才能;List< Integer>,指针;      public 才能;Point  getGeo (), {   ,,,return 地理;   ,,}      public 才能;void  setGeo (String 地理),{   ,,,try  {   ,,,,,this.geo =,(点)reader.read (geo);   ,,,},catch  (ParseException  e), {   ,,,,,e.printStackTrace ();   ,,,}   ,,}      public 才能;List< Integer>, getPointers (), {   ,,,return 指针;   ,,}      public 才能;void  setPointers (List

如何在Java中使用HashMap改进查找性能