1.map中的key可以重复嘛?
HashMap是的key是不能重复的,如果有相同的key,最后一个key对应的value会把前一个相同的value覆盖掉。
如果键是一个对象的话,不同的对象就是不同的key
但是如果一个对象内相同的值看做是同一个对象的话就在model里面重写HashCode()和equals()方法,map是先从key的hashcode()来决定在存入map哪个地方的哪个链,equals()来判断这条链上是否有重复的key。
俩个model对象结果只有一个,后面的把前面的覆盖了。
前面是键是对象的话,相同的key重复和不重复的俩个情况,但是如果key是String型的呢?key是不能有相同的string的,重复put相同的string,后面的会替换前面相同的key。
这里要介绍一个identityHashMap(),HashMap判断一个key是否相同是看key1.equals(key2)来判断,而IdentityHashMap判断一个key是否相同那个按key1==key2。所以只要是新的对象就会有新的地址就当做不同的key,不管key 的值是否相同。
作者:Airport_Le
来源:CSDN
原文:https://blog.csdn.net/yxm234786/article/details/82556094
版权声明:本文为博主原创文章,转载请附上博文链接!
2.map中的key都是什么类型的?
Map的Key需要一个对象,而基本类型不是对象;
Map没有指定泛型的时候,这里它会自动包装成Integer类型;
==================转自:https://www.cnblogs.com/-zpy/p/9224915.html
在上班写工具类时,遇到了一个问题,将xml文件的节点都放入map容器中时,map的value也是一个map,导致取map的value时,需要判断这个value的数据类型,用到了一下说的这些知识:
对于某些从泛型(比如:Map<K, V>)中继承过来的数据,K可能是String、Integer、等等。如果需要map.get(key),得先确保key的类型跟map的K匹配。
对于key类型的判断,大概的思路:通过map.keySet()获取key的集合,存在Set类型变量中;然后用一个Object接收第一个key;然后有两种方法判断它的类型:
1、instanceof
2、class 的 equals()方法
第二种方法的实现:
//获取cache中的key的class,用于判断key的类型
Class<? extends Object> keyClass = null;
Map<Object, Object> m = cache.getCache().asMap();
Set<Object> s = m.keySet();
for(Object k : s){
keyClass = k.getClass();
break;//只需要判断第一个元素
}
//根据cache中key的类型做类型转换:
if(keyClass.equals(Integer.class)){ //Integer类型
List<Integer> iKeys = new LinkedList<>();
for(Object key : keys){
iKeys.add(Integer.valueOf((String) key));
}
cache.getCache().invalidateAll(iKeys);
}else { //缺省为String类型,不用转换
cache.getCache().invalidateAll(keys);
}
转自:https://www.cnblogs.com/-zpy/p/9224915.html
3.String方法的源代码为什么用final修饰
1.字符串存储的位置和其他类型的常量不一样,字符串专门有个字符串池,也只有用final修饰才能实现字符串池。
字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。但如果字符串是可变的,那么String interning将不能实现(String interning是指对不同的字符串仅仅只保存一个,即不会保存多个相同的字符串。),因为这样的话,如果变量改变了它的值,那么其它指向这个值的变量的值也会一起改变。
2.如果字符串是可变的,那么会引起很严重的安全问题。
譬如,数据库的用户名、密码都是以字符串的形式传入来获得数据库的连接,或者在socket编程中,主机名和端口都是以字符串的形式传入。因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子,改变字符串指向的对象的值,造成安全漏洞。
3.因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。
这样便不用因为线程安全问题而使用同步。字符串自己便是线程安全的。
4.类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载。
譬如你想加载java.sql.Connection类,而这个值被改成了myhacked.Connection,那么会对你的数据库造成不可知的破坏。
5.因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。
这就是HashMap中的键往往都使用字符串。
作者:yueloveme
来源:CSDN
原文:https://blog.csdn.net/yueloveme/article/details/85335861
版权声明:本文为博主原创文章,转载请附上博文链接!
4.设计模式都有哪些
https://blog.csdn.net/doymm2008/article/details/13288067
5.谈谈你对Java的理解
https://blog.csdn.net/u013870094/article/details/80216241
6.讲讲Java语言的三大特性有什么,是什么
https://www.cnblogs.com/chenssy/p/3372798.html
7.传送门:java中几种Map在什么情况下使用,并简单介绍原因及原理
https://www.cnblogs.com/kersen0815/p/5325434.html