HashMap和Hash table 是开发中最经常使用到的数据结构,所以我们必须对其有深入的了解。我的水平比较低,写的都是皮毛,大佬勿喷,谢谢!
相同点:HashMap和Hash table都可以用来存储key—value数据;
不同点:1.HashMap的key和value都可以是Null,然而Hash table是不可以 的;2.HashMap是线程不安全的,所以它不需要考虑线程的问题,导致它的 存储效率较高,然而Hash table是线程不安全的,所以Hash table的存储效率较低。
为了在线程安全和存储效率之间取得平衡,于是在JDK1.5版本之后推出的线程并发库中包含了一个类ConcurrentHashMap 解决了这个问题,ConcurrentHashMap的工作原理是通过把大的Map分成N个小的Segment(类似于Hash table),可以提供相同的线程安全,实现了线程并发,效率提高了N倍,默认提高了16倍。
Leetcode中的水题:Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
我们先对数组进行排序,然后使用双指针方法或者二分查找方法,这样时间复杂度为 O(nlgn),空间复杂度为 O(1)。用 HashMap 存储数组元素和索引的映射,在访问到 nums[i] 时,判断 HashMap 中是否存在 target - nums[i] ,如果存在说明 target - nums[i] 所在的索引和 i 就是要找的两个数。该方法的时间复杂度为 O(n),空间复杂度为 O(n),和缓冲类似,使用空间来换取时间。
代码如下:
public int[] twoSum(int[] nums, int target) {
HashMap