//泛型:针对利用继承来实现通用程序设计所产生的问题,泛型提供了更好的解决方案:类型参数。 // 例如,ArrayList类用一个类型参数来指出元素的类型。 //ArrayList stringValues=new ArrayList(); // public class GenericType { // public static void main(String[] args) { // ArrayList stringValues=new ArrayList(); // stringValues.add(“str”); // stringValues.add(1); //编译错误 // }
Hash表存储的原理: 我们知道,hash表存储利用到了数组以及链表, 当键值对数据传入时,系统先将key值取出, 利用hash函数转换成hash值, 再运用散列法(此处用除法散列法取余),得到需要存入数组的下标index; 得到数组下标后,我们可以将key-value一起存入到数组中。 当使用index进行存储键值对的时候, 如果此下标已经有了数据,那么将通过equals方法比较两个hash值是否相同, 如果相等,再比较两个键值对key是否相等, 如果不等,则在此下标位置,以链表的方式,将新存储的数据放到表头; 如果相等,将覆盖原先的value; Hash表的查询原理: 先将key值通过hash函数转换成指向内存地址的hash值; 通过equals方法,比较hash值查找对应的内存地址, 然后再通过内存地址找到对应的链表,此时再通过equals方法, 比较key值是否相等,若相等,取出键值对返回数据, 如果不等,沿着链表继续向下寻找比较。
ap.getOrDefault(num,0):当Map集合中有这个key时,就使用这个key值,如果没有就使用默认值defaultValue:0.
Map.put(key,value) 当调用put(),首先会根据key生成一个 hash值
有一个Map对象,这时候使用keySet()方法获取所有的key值,比如: Map map = new HashMap(); map.put(1, “a”); map.put(2, “b”); map.put(3, “c”); map.put(4, “d”); Set keys1 = map.keySet(); Set keys2 = map.keySet(); Set keys3 = map.keySet(); 上面三个set对象key1,key2,key3引用的是一个对象。这是map的keySet()方法只返回一个set实例,所以当从key1中删除一个对象时候,key2和key3将会受到影响。 keys1.remove(1); System.out.println(keys1); System.out.println(keys2); System.out.println(keys3); 打印结果为: [2, 4, 3] [2, 4, 3] [2, 4, 3]