java 基础知识,各位大侠看看有无问题

difficult 2014-12-17 12:30:23
public class Key{
public int x;
public int y;
public Key(){}
public Key(int x,int y){
this.x=x;
this.y=u'
}
public int hasCode(){
....
}
public boolean equals(Object o){
....
}
}

public class MyObject{
public MyObject(int i,int j){...}
}

public class C{
Map map=new HashMap();
Key key=new Key();
public C(){
for(int i=0;i<1000;i++){
for(int j=0;j<1000;j++){
map.put(new Key(i,j),new MyObject(i,j));
}
}
}
public MyObject get(int i,int j){
key.x=i;
key.y=j;
return (MyObject)map.get(key);

//return (MyObject)map.get(new Key(i,j));
}
}

关键是类C中get方法,想通过
key.x=i;
key.y=j;
return (MyObject)map.get(key);
改变key而不用new新的实例(相对效率高)得到对应的值。

这种方式有无问题?不用考虑多线程并发问题
...全文
291 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Runner6587 2014-12-17
  • 打赏
  • 举报
回复
只要重写了Key的hashCode和equals方法完全可以啊!
疯狂熊猫人 2014-12-17
  • 打赏
  • 举报
回复
减少new创建对象的开销,保证对于相同的i和相同的j能够得到相同的hashcode,那么就没有问题。 其实你查看一下hashmap的源代码就知道了,hashmap其实是根据key的hashcode计算对象存放位置的
AceShot 2014-12-17
  • 打赏
  • 举报
回复
首先要明白怎样就能根据key找到value。因为hashMap内部的数据结构是数组链表,所以两步 1.找到第几个链表,即数组的第几个位置 2.找到该链表,然后遍历链表查看是否存在该value 对于第一步,hashMap内部是根据key的hashcode来找的,所以要重写hashcode方法; 对于第二步,遍历时是比较key,查找是否有相同的key,而比较又会用到equals方法,所以要重写equals方法。
soton_dolphin 2014-12-17
  • 打赏
  • 举报
回复
必须重写equals 和 hashcode方法
soton_dolphin 2014-12-17
  • 打赏
  • 举报
回复
引用 3 楼 difficult 的回复:
[quote=引用 1 楼 crazypandariy 的回复:] 减少new创建对象的开销,保证对于相同的i和相同的j能够得到相同的hashcode,那么就没有问题。 其实你查看一下hashmap的源代码就知道了,hashmap其实是根据key的hashcode计算对象存放位置的
需要保证对应不同的i和j,hashcode必须唯一码?[/quote] 如果hashcode不一样,这两个实例必须不同。但是两个不同的实例可以用相同的hashcode
多木多多木 2014-12-17
  • 打赏
  • 举报
回复
楼主,我觉得你的思路是挺好的,但是你的对象初始化的过程中,需要不断地做类型转换。这个和单例设计模式还不一样,单例是直接返回本类的对象,你这边相当于做了一点包装处理。
淡定的峰哥 2014-12-17
  • 打赏
  • 举报
回复
有点意思,存和取是同一对象是可行的 看了一下HashMap的源码,存和取都是比较hashCode并且判断是否同一对象,若不是再调用equals方法 按照lz的想法,HashMap的每个Entery的key的内存地址是一样的,所以调key的equals方法永远是跟最新放进去的key是相等的,但是Entry的hash不一样,所以放还是没问题的;那么取的时候,如果跟存的是同一个对象,找到对应的hash,然后就找到对应的Entry,value也就获得了。所以强调是同一对象,如果存和取不是同一对象,那么虽然能找到hash相等的,除了最后put进去的,其他恐怕就get不到了 ps:如果是同一对象,equals方法也没要重写了
difficult 2014-12-17
  • 打赏
  • 举报
回复
引用 1 楼 crazypandariy 的回复:
减少new创建对象的开销,保证对于相同的i和相同的j能够得到相同的hashcode,那么就没有问题。 其实你查看一下hashmap的源代码就知道了,hashmap其实是根据key的hashcode计算对象存放位置的
需要保证对应不同的i和j,hashcode必须唯一码?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧