Java中使用HashMap改进查找性能 比眉伴天荒 2022-10-29 00:46 104阅读 0赞 Java中,HashMap,其实就是键值对。一个Key,对应一个值;写数据时,指定Key写对应值;读取时凭Key找到相应值。感觉就跟Redis差不多。 // 创建 HashMap 对象 Sites HashMap<Integer, String> Sites = new HashMap<Integer, String>(); // 添加键值对 Sites.put(1, "Google"); Sites.put(2, "Runoob"); Sites.put(3, "Taobao"); Sites.put(4, "Zhihu"); //读取 String val = Sites.get(1);//得到Google 为什么说可以用HashMap来改进性能呢?原因不是说HashMap这种数据结构存储性能就比其他的,比如数组,集合先进多少。我主要看中的,是在知道Key的情况下,找到相应值得速度非常快。如果是用数组,最简单的,用循环;讲究一点,排好序,用折半查找(二分查找)。都比不上用Key在HashMap里直接读取。不知道为什么HashMap在查找方面为啥这么快,估计是存储结构,使用了啥树,并为Key建立了索引。这是另外一个课题,以后再了解。昨天,我只是利用了这个特性,将运行几个小时都没结束的问题,只耗费了十几秒。 问题如下: 有25万条记录,每条记录含经纬度;存在不同记录坐标相同情况。现在想将坐标相同的记录归并在一起。 如果数据是保存在数据库里,那么用SQL进行坐标分组,应该能解决问题。然而并没有数据库,数据是从gdb文件里读出来的。 好吧,将数据保存到数组里,再新建一个集合;然后循环数组,与新集合中的记录逐个比较,坐标相同就归并到新集合,不同就插入新集合。最简单了。结果2个小时过去了,还没有结束的迹象。 想想也对,新集合越来越大,比较的次数也越来越多,仿佛棋盘里的大米一样,每格的大米数量是前一格的两倍;最后即使是整个国家粮库的大米都放进去,都填不满整个棋盘。 将25万条记录先排好序再处理?单是排序就忙死了,不行吧。 将25万条记录先保存到数据库里,再分组?应该也可以,但总觉得笨了一些,而且速度应该也是以分钟算的。 最后决定用HashMap来做这个新集合。 如上所述,HashMap按照Key来写入或读取值。关键是这个Key怎么得来。上面的例子,是写代码的人自己给出了一些字符作为Key。而在我们项目中,可以用经纬度之和的哈希值来作为Key。哈希值相同的,就认为是经纬度相同,只需要判断新集合中,是否存在这个Key对应的元素就可以了,根本无须循环比较。 由于存在两个不同的经纬度加起来,结果是一样的可能性,因此先将经度 乘以1000,再加纬度,这样基本杜绝冲突的机会。 代码如下: private HashMap<Long,SimpleItem> recGeo(HashMap<Long, SimpleItem> map,String geo,int j){ /* 将相同坐标的记录合成一条 HashMap<Long, SimpleItem> map, 新集合 String geo, 坐标字符串 int j 记录ID */ try { Point p = (Point)reader.read(geo); /* 计算哈希值 因为如果采用循环来比较,数据量太大,速度太慢了 为避免不同坐标出现经度+纬度结果相同的情况,将经度 * 1000再相加 */ //计算Key long k = Long.valueOf(Double.doubleToLongBits(p.getX() * 1000 + p.getY())).hashCode(); SimpleItem si = map.get(k); if(si != null){ //新集合中该Key对应元素已存在,应该是相同坐标的记录 si.getPointers().add(j);//归并 } else { //否则插入 si = new SimpleItem(); si.setGeo(geo); List<Integer> pointers = new ArrayList(); pointers.add(j); si.setPointers(pointers); map.put(k,si); } } catch (ParseException e) { e.printStackTrace(); } return map; } private static GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory( null ); private static WKTReader reader = new WKTReader( geometryFactory ); class SimpleItem{ private Point geo; private List<Integer> pointers; public Point getGeo() { return geo; } public void setGeo(String geo) { try { this.geo = (Point)reader.read(geo); } catch (ParseException e) { e.printStackTrace(); } } public List<Integer> getPointers() { return pointers; } public void setPointers(List<Integer> pointers) { this.pointers = pointers; } } 短短几秒,新集合即得到5万个元素。
相关 Java集合框架中HashMap的性能分析 HashMap是Java集合框架中的一个映射数据结构,它提供了根据键(Key)快速获取值(Value)的功能。以下是对其性能进行的一些分析: 1. 平均查找时间:O(1),这 谁践踏了优雅/ 2024年09月11日 21:57/ 0 赞/ 16 阅读
相关 java中HashMap简单使用 public void HashMapDemo(){ HashMap<String, String> hashMap = new Hash 待我称王封你为后i/ 2024年02月17日 17:14/ 0 赞/ 27 阅读
相关 java map存储对象_JAVA:查找存储在hashMap中的对象的最佳性能方法 如果你想要速度并且总是在寻找一个特定属性,那么最好的办法是创建另一个用该属性键入的“缓存”哈希映射. 对于不到一百万个条目,占用的内存将是无关紧要的,并且哈希映射查找将比任何 本是古典 何须时尚/ 2022年11月03日 11:20/ 0 赞/ 100 阅读
相关 Java中使用HashMap改进查找性能 Java中,HashMap,其实就是键值对。一个Key,对应一个值;写数据时,指定Key写对应值;读取时凭Key找到相应值。感觉就跟Redis差不多。 // 创建 H 比眉伴天荒/ 2022年10月29日 00:46/ 0 赞/ 105 阅读
相关 使用异步Servlet改进应用性能 本文来源于我在InfoQ中文站原创的文章,原文地址是:[http://www.infoq.com/cn/news/2013/11/use-asynchronous-servle 女爷i/ 2022年09月18日 10:44/ 0 赞/ 126 阅读
相关 java8中HashMap相对于java7的改进 本文从性能、内存以及各种典型问题分析Java7到Java8中HashMap的改进: 原文地址:http://coding-geek.com/how-does-a-hashma 短命女/ 2022年06月09日 07:14/ 0 赞/ 155 阅读
相关 改进的二分查找 //改进的二分查找 //如果待查找的数组中存在相同元素,则返回相同元素第一个的下标 /\ 递归算法 int searchB1(int A\[\], int lo 谁借莪1个温暖的怀抱¢/ 2022年05月12日 01:48/ 0 赞/ 111 阅读
相关 Java HashMap 分析之四:查找和内存使用 获取元素 有了前面的分析,获取元素的逻辑就非常清晰。首先,调用者传递key,从key的hashCode方法获得值后,调用hash函数做一些低位置换,保证hash值的均匀分 系统管理员/ 2022年03月31日 02:19/ 0 赞/ 335 阅读
相关 Java HashMap 分析之四:查找和内存使用 有了前面的分析,获取元素的逻辑就非常清晰。首先,调用者传递key,从key的hashCode方法获得值后,调用hash函数做一些低位置换,保证hash值的均匀分布,之后和siz 拼搏现实的明天。/ 2021年09月10日 04:54/ 0 赞/ 196 阅读
还没有评论,来说两句吧...