JAVA实习级别面试坑总结19-4-25【转载集锦】

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

8.MySQL的四种事务隔离级别

https://www.cnblogs.com/huanongying/p/7021555.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值