今天面试官问我,如果有大量的数据(>1000w),要保存到 HashMap,但是要避免 Key 的碰撞,有什么好的方法?
当时我不太了解具体的需求,我就只是回答了重写 hashCode 方法
面试完了以后我问面试官,他的答案是什么?
他说是用 HashTable 替换 HashMap,虽然性能差点,但是可以避免 Key 大量碰撞的问题
是这样的吗?
还有就是,他问我 InputStream 和 Reader 的区别?
我不太清楚他问的含义,我回答一个是字节流,一个是读取字节流的,不知道这样回答准确吗?
java.io.Reader 和 java.io.InputStream 组成了Java 输入类。Reader 用于读入16位字符,也就是Unicode 编码的字符;而 InputStream 用于读入 ASCII 字符和二进制数据。
Reader支持16位的Unicode字符输出,InputStream支持8位的字符输出。
Reader和InputStream分别是I/O库提供的两套平行独立的等级机构,
1. 有 1000w 的数据,我的话用缓存了,例如 Redis,Memcached,是不是用 HashMap 或者 HashTable 都是找抽型?
2. InputStream 是针对二进制读取,即针对字节,Reader 是针对字符读取(例如有的一个字符实际站占用的是 3 个字节,但是对 Reader 的接口来说,只是一个字符)
######最他妈反感提了问题不给答案的面试官,装高深,其实这些玩意起先不懂都没关系,上网一查就懂了,面试的人怕的不是他了解得不够,而是不肯学######直接问你 HashTable 和Hashmap 又啥区别就是了嘛 绕一大圈。。真够装的~~######那HashTable真的可以避免大量的Key碰撞吗?######大量数据保存这个有没说是单线程环境下还是多线程环境下的呢?多线程环境下, HashTable确实是好的选择,因为其同步。单线程环境下的话,明显要选HashMap吧,并且单线程环境下会存在碰撞吗?这个我就没仔细研究过。######1 、HashMap对于大数据量的rehash等操作可能导致CPU过高,性能降低。HashTable散列算法比hashmap简单,但是线程安全。但是两个对大数据都没有什么优势。
2、字节和字符
######面试官估计也是个半吊子。hashmap采用的是线性表加链表进行数据存储,虽然 hashcode可能会碰撞,但只要保证key的equals方法不误判就没有问题了。第二个问题reader是字符读取,它在底层持有一个Inputstream,通过缓存InputStream读取的字节数据并将字节进行编码以字符流的形式返回给你。######要求保存到 HashMap(不是Map?),面试官的答案却又是Hashtable。
######嗯,是的 给我的感觉是,他挖了一个坑,想知道我是否知道能把它处理掉######一语道破天机######我也是这个感觉,就像面试官问,你上厕所是有左手还是用右用擦屁股,结果他的答案是用纸。。。######hashtable可以避免 Key 大量碰撞的问题不是######
数据里有相同的key,那么碰撞就是客观存在的。
避免碰撞就使用key可以重复的容器,
大数据量可以使用MongoDB等
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。