使用hash算法就是为了减少查找数据时,比较的次数;
查找时最理想的情况下,仅需一次比较就能找到,当然这种理想是以牺牲存储空间实现的。实际应用中不可取,但是由此我们可以看出hash在查找方面的高效性;
具体hash的讲解我就不说了,网上挺多的
查找时最理想的情况下,仅需一次比较就能找到,当然这种理想是以牺牲存储空间实现的。实际应用中不可取,但是由此我们可以看出hash在查找方面的高效性;
具体hash的讲解我就不说了,网上挺多的
解决方案 »
- 数据库连接不报错,却没得到数据???
- 正则表达式
- 《帮顶有分》jtable如何实现数据验证
- 一个连接池的问题:
- system.exit(0)时候出现Shutdown in progress问题如何解决?
- 如何用Java通过POST方法向HTTP接口传递数据?
- 不好意思,问大家点很傻的学习java问题
- 急,急,急!!!如何实现远程数据通讯(点对点)
- 在java官网上下载的代码,运行不正常。Couldn't find file:
- Spring Boot Actuator, endpoints.health.sensitive=false设置无效
- 启动外部程序,启动后就不管了
- 如何取到List里面对象属性相同的对象放到另外的List里面
hash用的是hash查找。 还是去补补基础吧
查找时最理想的情况下,仅需一次比较就能找到,当然这种理想是以牺牲存储空间实现的。
1楼解释的挺好的,其实具体看看hashmap的源码,就明白了。
之所以用hash,是考虑两个方面
1、就是撸主提到的访问效率。通过hash得到一个地址值、或者数组下标,然后直接访问得到数据
2、存储空间的问题。如果仅仅是为了存储数十个数据,却用了较大的空间,明显有较大的空间浪费
至于发生碰撞的问题,有很多方法解决,比如hashset,就是用链表法解决冲突
说实话实在不想回这个贴,不管别人说的对不对你这个态度就有问题
根据实际情况找到合适的散列函数分配足够的空间,一次比较找到是有可能实现的
看数据结构散列这一章好吧, 我态度有问题, 表示歉意.
我明白 hashmap.get(hashcode) 就是直接从数组里端出来,没有循环(不冲突的情况)
我在C#区也发了个贴:
http://bbs.csdn.net/topics/390620540我其实就是不明白为什么要用hash算法算出个那么大的值来. 那样的话[key的hash最小值]-->[key的hash最大值]是很恐怖的. 这样的话要耗费多少内存来生成这么个数组呢?
说实话实在不想回这个贴,不管别人说的对不对你这个态度就有问题
根据实际情况找到合适的散列函数分配足够的空间,一次比较找到是有可能实现的
看数据结构散列这一章好吧, 我态度有问题, 表示歉意.
我明白 hashmap.get(hashcode) 就是直接从数组里端出来,没有循环(不冲突的情况)
我在C#区也发了个贴:
http://bbs.csdn.net/topics/390620540我其实就是不明白为什么要用hash算法算出个那么大的值来. 那样的话[key的hash最小值]-->[key的hash最大值]是很恐怖的. 这样的话要耗费多少内存来生成这么个数组呢?
key的hash值也不是直接拿来当数组下标用的
下面hashMap的一段代码 public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
看table这个数组下标,是indexFor(hash, table.length)
下面是indexFor方法static int indexFor(int h, int length) {
return h & (length-1);
}
说实话实在不想回这个贴,不管别人说的对不对你这个态度就有问题
根据实际情况找到合适的散列函数分配足够的空间,一次比较找到是有可能实现的
看数据结构散列这一章好吧, 我态度有问题, 表示歉意.
我明白 hashmap.get(hashcode) 就是直接从数组里端出来,没有循环(不冲突的情况)
我在C#区也发了个贴:
http://bbs.csdn.net/topics/390620540我其实就是不明白为什么要用hash算法算出个那么大的值来. 那样的话[key的hash最小值]-->[key的hash最大值]是很恐怖的. 这样的话要耗费多少内存来生成这么个数组呢?
key的hash值也不是直接拿来当数组下标用的
下面hashMap的一段代码 public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
看table这个数组下标,是indexFor(hash, table.length)
下面是indexFor方法static int indexFor(int h, int length) {
return h & (length-1);
}
感谢,我已经基本明白了.
还有个问题: 如果确认一个动态的hashtable 或者map 元素数量肯定少于10万个,我提前把他的size设置为10万的话这个集合的查找,插入效率将大大提升呢?
说实话实在不想回这个贴,不管别人说的对不对你这个态度就有问题
根据实际情况找到合适的散列函数分配足够的空间,一次比较找到是有可能实现的
看数据结构散列这一章好吧, 我态度有问题, 表示歉意.
我明白 hashmap.get(hashcode) 就是直接从数组里端出来,没有循环(不冲突的情况)
我在C#区也发了个贴:
http://bbs.csdn.net/topics/390620540我其实就是不明白为什么要用hash算法算出个那么大的值来. 那样的话[key的hash最小值]-->[key的hash最大值]是很恐怖的. 这样的话要耗费多少内存来生成这么个数组呢?
key的hash值也不是直接拿来当数组下标用的
下面hashMap的一段代码 public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
看table这个数组下标,是indexFor(hash, table.length)
下面是indexFor方法static int indexFor(int h, int length) {
return h & (length-1);
}
感谢,我已经基本明白了.
还有个问题: 如果确认一个动态的hashtable 或者map 元素数量肯定少于10万个,我提前把他的size设置为10万的话这个集合的查找,插入效率将大大提升呢?
是这样的
说实话实在不想回这个贴,不管别人说的对不对你这个态度就有问题
根据实际情况找到合适的散列函数分配足够的空间,一次比较找到是有可能实现的
看数据结构散列这一章好吧, 我态度有问题, 表示歉意.
我明白 hashmap.get(hashcode) 就是直接从数组里端出来,没有循环(不冲突的情况)
我在C#区也发了个贴:
http://bbs.csdn.net/topics/390620540我其实就是不明白为什么要用hash算法算出个那么大的值来. 那样的话[key的hash最小值]-->[key的hash最大值]是很恐怖的. 这样的话要耗费多少内存来生成这么个数组呢?的方式的所得税