但是 为什么会有如下输出
hashcode
hashcode
{hi56=mmmmyn, hi=jinglong}
package Map;import java.util.*;public class SimpleHashMap<K, V> extends AbstractMap<K, V>{
static final int SIZE=997;
LinkedList<MapEntry<K,V>>[] buckets=new LinkedList[SIZE];
public V put(K key, V value){
V oldValue=null;
boolean found=false;
int index=Math.abs(key.hashCode())%SIZE;
if(buckets[index]==null){
buckets[index]=new LinkedList<MapEntry<K, V>>();
}
LinkedList<MapEntry<K, V>> bucket=buckets[index];
MapEntry<K, V> pair=new MapEntry<K,V>(key,value);
ListIterator<MapEntry<K, V>> it=(ListIterator<MapEntry<K, V>>) bucket.listIterator();
while(it.hasNext()){
MapEntry<K, V> ipairs=it.next();
if(ipairs.getKey().equals(key)){
oldValue=ipairs.getValue();
found=true;
it.set(pair);
break;
}
}
if(!found){
//System.out.println(index);
buckets[index].add(pair);
}
return oldValue;
}
@Override
public Set<Map.Entry<K, V>> entrySet() {
Set<Map.Entry<K,V>> set=new HashSet<Map.Entry<K,V>>();
for(LinkedList<MapEntry<K, V>> bucket:buckets){
if(bucket==null){continue;}
for(MapEntry<K,V> mpair:bucket){
set.add(mpair);
}
}
return set;
}
public static void main(String[] args){
SimpleHashMap<String, String> s=new SimpleHashMap<String, String>();
s.put("hi", "jinglong");
s.put("hi56", "mmmmyn");
System.out.println(s);
}}
package Map;
import java.util.*;
public class MapEntry<K,V> implements Map.Entry<K,V>{
private K key;
private V value;
public MapEntry(K key,V value){
this.key=key;
this.value=value;
}
@Override
public K getKey() { return key;
} @Override
public V getValue() {
// TODO Auto-generated method stub
return value;
} @Override
public V setValue(V v) {
V result =value;
value=v;
return result;
}
public int hashCode(){
System.out.println("hashcode");
return (key==null?0:key.hashCode())^(value==null?0:value.hashCode());
}
public boolean equals(Object o){
System.out.println("equals");
return true;
}
public String toString(){
return "sb";
}
public static void main(String[] args){
MapEntry m1=new MapEntry<Integer, Integer>(1, 1);
MapEntry m2=new MapEntry<Integer, Integer>(2, 1);
System.out.println(m1.equals(m2));
}}也就是说调用了MapEntry 里的int hashCode() 的方法这是什么意思 明白的解答一下
hashcode
hashcode
{hi56=mmmmyn, hi=jinglong}
package Map;import java.util.*;public class SimpleHashMap<K, V> extends AbstractMap<K, V>{
static final int SIZE=997;
LinkedList<MapEntry<K,V>>[] buckets=new LinkedList[SIZE];
public V put(K key, V value){
V oldValue=null;
boolean found=false;
int index=Math.abs(key.hashCode())%SIZE;
if(buckets[index]==null){
buckets[index]=new LinkedList<MapEntry<K, V>>();
}
LinkedList<MapEntry<K, V>> bucket=buckets[index];
MapEntry<K, V> pair=new MapEntry<K,V>(key,value);
ListIterator<MapEntry<K, V>> it=(ListIterator<MapEntry<K, V>>) bucket.listIterator();
while(it.hasNext()){
MapEntry<K, V> ipairs=it.next();
if(ipairs.getKey().equals(key)){
oldValue=ipairs.getValue();
found=true;
it.set(pair);
break;
}
}
if(!found){
//System.out.println(index);
buckets[index].add(pair);
}
return oldValue;
}
@Override
public Set<Map.Entry<K, V>> entrySet() {
Set<Map.Entry<K,V>> set=new HashSet<Map.Entry<K,V>>();
for(LinkedList<MapEntry<K, V>> bucket:buckets){
if(bucket==null){continue;}
for(MapEntry<K,V> mpair:bucket){
set.add(mpair);
}
}
return set;
}
public static void main(String[] args){
SimpleHashMap<String, String> s=new SimpleHashMap<String, String>();
s.put("hi", "jinglong");
s.put("hi56", "mmmmyn");
System.out.println(s);
}}
package Map;
import java.util.*;
public class MapEntry<K,V> implements Map.Entry<K,V>{
private K key;
private V value;
public MapEntry(K key,V value){
this.key=key;
this.value=value;
}
@Override
public K getKey() { return key;
} @Override
public V getValue() {
// TODO Auto-generated method stub
return value;
} @Override
public V setValue(V v) {
V result =value;
value=v;
return result;
}
public int hashCode(){
System.out.println("hashcode");
return (key==null?0:key.hashCode())^(value==null?0:value.hashCode());
}
public boolean equals(Object o){
System.out.println("equals");
return true;
}
public String toString(){
return "sb";
}
public static void main(String[] args){
MapEntry m1=new MapEntry<Integer, Integer>(1, 1);
MapEntry m2=new MapEntry<Integer, Integer>(2, 1);
System.out.println(m1.equals(m2));
}}也就是说调用了MapEntry 里的int hashCode() 的方法这是什么意思 明白的解答一下
解决方案 »
- 请教:这是一种什么用法?
- 抽奖器 图片随机滚动
- JEditorPane
- 大家帮我看个小代码,为什么左键也响应PopMenu
- 请问如何使用swing做一个 弹出窗口不能通过拖拉窗体边框改变大小 ??
- java中的异常问题
- 请问将货币类型数据从access数据库取出来变成双精度类型的该怎么办?将双精度类型又如何变成货币类型放进数据库呢?
- 今天真不走运,在win2000server下,我打开的IE窗口不知道为什么就被关闭了,有十几次了,我打开的不过十来个窗口,今天是第一次发现这个问题,请高人指点。
- 菜鸟送分来了.......
- java内存不够用如何扩展
- 初学Java时,do-while应该怎样写
- java程序中如何为一个while(true)循环记录次数,并跳出循环后显示循环次数
public String toString() {
Iterator<Entry<K,V>> i = entrySet().iterator();
if (! i.hasNext())
return "{}"; StringBuilder sb = new StringBuilder();
sb.append('{');
for (;;) {
Entry<K,V> e = i.next();
K key = e.getKey();
V value = e.getValue();
sb.append(key == this ? "(this Map)" : key);
sb.append('=');
sb.append(value == this ? "(this Map)" : value);
if (! i.hasNext())
return sb.append('}').toString();
sb.append(',').append(' ');
}
}
这里有个非常有趣的现象:
如果你自己新建的类没有覆盖toString方法,也就是自己重写,那么默认的就是调用Object类的toString方法,所以显示的结果会是一个类名(没记错的话)加上@然后再是一串哈希码所以你自建类重写的话就会调用你自己的。建议这样写,貌似换平台方便点:
@Override
public String toString() {
String str = "";
str += number + "\t";
str += name + "\t";
str += price;
return str;
下面是我自己的看法。
首先我问的是 为什么输出s 即一个simplehash类型的对象会像4楼老哥说的那样调用父类tostring;但是却输出了2次hashcode;这就说明
在迭代的时候对于entrySet()返回的set中的俩个Entry对象都进行了int hashcode()调用。我是不明白这里 各位说的我略懂一点