1,map.containsValue怎么知道value对应的key值
可以将key与value值对换(在元素重复可以覆盖的情况下)
本题为找出数组中相加为目标值的元素下标,可能有[3,3]6的情况,所以不能被覆盖。
但本题只要两个数据,所以数据间两个以上的重复覆盖无影响,所以将map赋值与containsKey放在同一循环即可,为了避免本次循环的数据相加,map赋值需要在containsKey后面,代码如下:
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; ++i) {
if (hashtable.containsKey(target - nums[i])) {
return new int[]{hashtable.get(target - nums[i]), i};
}
hashtable.put(nums[i], i);
}
return new int[0];
}
}
2,一些没注意到的细节
1> 如果不希望map内的参数是Object,最好在创建的时候声明key与value的类型
2>map中不能使用基本数据类型,需要使用包装类:
1⃣️基本数据类型的初始值不一定为null,而封装类的初始值都是null
2⃣️因为基本数据类型不能调用其hashcode()方法和equals()方法:
HashMap存储元素采用的是hash表存储数据,每存储一个对象的时候,都会调用其hashCode()方法,算出其hash值,如果相同,则认为是相同的数据,直接不存储,如果hash值不同,则再调用其equals方法进行比较,如果返回true,则认为是相同的对象,不存储,如果返回false,则认为是不同的对象,可以存储到HashMap集合中。
在HashMap存储自定义对象(自己定义的实体类,如Map<Student,Integer>)的时候,需要自己再自定义的对象中重写其hashCode()方法和equals方法,才能保证其存储不重复的元素,否则将存储多个重复的对象,因为每new一次,其就创建一个对象,内存地址是不同的。
3>给已有数组赋值,直接给对应下标赋值,比如a[0]=1;
3,MAP集合如何选出最大值
使用map.values()取出map中所有的value值,然后转换成数组形式排序
public class MapMinMaxvalue {
public static void main(String[] args) {
Map<Object, Object> map=new HashMap<Object, Object>();
map.put("张三", 38);
map.put("李四", 21);
map.put("王五", 28);
int length =map.size();
Collection<Object> c =map.values();
Object[] obj=c.toArray();
Arrays.sort(obj);
System.out.println("Map中的最大值====="+obj[length-1]);
}
}
4,Map.getOrDefault()
如果 在Map中存在key,则返回key所对应的的value。
如果 在Map中不存在key,则返回默认值。
public class Demo {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("赵四", 24);
String age= map.getOrDefault("赵四", 30);
System.out.println(age);// 24,map中存在"赵四",使用其对应值24
String age = map.getOrDefault("刘能", 30);
System.out.println(age);// 30,map中不存在"刘能",使用默认值30
}
}