美文网首页面试题
java面试之一

java面试之一

作者: lijiaccy | 来源:发表于2017-06-09 06:02 被阅读20次

今天去面试了,问的问题也中规中矩,我由于3年多没换工作了,所以,兴奋和紧张,面试好多问题都写过,但是紧张忘了。没发挥好,我就把问题罗列一下。
1、HashMap和HashTable区别。
<pre>
a、HashMap不是线程安全的,HashTable是线程安全
b、HashMap允许null的键和值,HashTable不行
c、HashMap由于不是线程安全的,性能上优于HashTable
</pre>
2、HashMap的原理
<pre>
HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。
当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。
</pre>
3、当两个对象的hashcode相同会发生什么
<pre>
因为hashcode相同,所以它们的bucket位置相同,‘碰撞’会发生。因为HashMap使用链表存储对象,这个Entry(包含有键值对的Map.Entry对象)会存储在链表中。
</pre>
4、如果两个键的hashcode相同,你如何获取值对象
<pre>
当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,然后获取值对象。如果两个hashcode相同,会通过key.eques()去找到链表中正确的节点,最终找到要找的值对象</pre>
5、如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办?
<pre>因为HashMap有个负载因子,默认为0.75,当一个map填满了75%的bucket时候,会自动增长到原来两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中。这种方法叫<strong>rehashing</strong></pre>
6、你了解重新调整HashMap大小存在什么问题吗?
<pre>如果两个线程都发现HashMap需要重新调整大小了,它们会同时试着调整大小。在调整大小的过程中,存储在链表中的元素的次序会反过来,因为移动到新的bucket位置的时候,HashMap并不会将元素放在链表的尾部,而是放在头部,这是为了避免尾部遍历(tail traversing)。如果条件竞争发生了,那么就死循环了。</pre>
7、那用什么方式让HashMap线程安全
<code>//Hashtable
Map<String, String> hashtable = new Hashtable<>();
//synchronizedMap
Map<String, String> synchronizedHashMap = Collections.synchronizedMap(new HashMap<String, String>());
//ConcurrentHashMap
Map<String, String> concurrentHashMap = new ConcurrentHashMap<>();</code>
8、那就说说concurrentHashMap的原理,它为什么线程安全吧。
具体的请看小狼的一篇文章http://www.jianshu.com/p/c0642afe03e0http://www.jianshu.com/p/f6730d5784ad两篇文章,应该可以理解所有的东西。
<strong>其实hashmap没有问这么深,大多数还是基本的,当时有点紧张,好多都忘了。但是不能代表下次面试遇不到</strong>
9、基本类型有哪些是原子性的(我不知道这样问是为了表达什么)
我回答是long和double,具体的我也没答上来,有点尴尬,回来查询了一下
<pre>
在“java虚拟机”中说到,int及其他不大于32位的基本类型是原子的(但是我不知道这是不是原来虚拟机是32位的,如果是64位虚拟机的话会不会long和double都是原子性的),而long和double不是,因为它两长度为64位,拆分成了一个高32和一个低32位操作。这样就不能保证原子性。如果要保证原子性,我说的是加上volatile关键字,如有更好的看法,请留言。现在电脑几乎都是64位的,所以说全部是原子的就行了。
</pre>
不知道是不是看我工作经验差不多4年了,没有问我框架之类的问题,最后让我实现一个质数的方法。
<pre>随便输入一个整数,返回它下一个质数</pre>
<code>public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
int sum;
for (int i = num+1;;i++) {
if (isPrime(i)){
sum=i;
break;
}
}
System.out.println(sum);
}
private static boolean isPrime(int n) {
if (n <= 1) {
return false;
}
int k = (int) Math.sqrt(n);
for (int i = 2; i <= k; i++) {
if(n % i == 0) {
return false;
}
}
return true;
}
}</code>

相关文章

网友评论

    本文标题:java面试之一

    本文链接:https://www.haomeiwen.com/subject/ovgtqxtx.html