代理一个类需特别注意的点
java的23种模式中,有代理模式。
然而,我们仅仅是代理实现了interface的方法,却忘记了Object的equals和hashcode的方法!!
?
今天在处理Hadoop的Text的时刻遇到了一点问题,Text是Hadoop中类似于JDK的String类。
?
MapWritable result = new MapWritable(); Map<String, Integer> resultTmp = new HashMap<String, Integer>(); for (MapWritable hmw : results.getResults()) { for(Writable writable:hmw.keySet()){ Text text = (Text)writable; String key = new String(text.getBytes());Integer total = resultTmp.get(key); IntWritable increment = (IntWritable)hmw.get(writable); if (total!=null){ resultTmp.put(key, total+increment.get()); }else{ resultTmp.put(key, increment.get()); } } } for(String key:resultTmp.keySet()){ result.put(new Text(key), new IntWritable(resultTmp.get(key))); } return result;?
上面得到的Key的String会多出一些空格。所以直接使用Text来代替,无需转换为String。
?
MapWritable result = new MapWritable(); Map<Text, Integer> resultTmp = new HashMap<Text, Integer>(); for (MapWritable hmw : results.getResults()) { for(Writable writable:hmw.keySet()){ Text key = (Text)writable;Integer total = resultTmp.get(key); IntWritable increment = (IntWritable)hmw.get(writable); if (total!=null){ resultTmp.put(key, total+increment.get()); }else{ resultTmp.put(key, increment.get()); } } } for(Text key:resultTmp.keySet()){ result.put(key, new IntWritable(resultTmp.get(key))); } return result;?考虑到另一个问题,加入到Map后,equals和hashcode是否与String一样的呢!?Hadoop的源码还是OK的。
?