2018阿里实习面经总结(一)

(1)谈谈Object类
(2)Java中hashCode()是如何实现的
(3)HashMap中解决hash冲突
(4)JAVA中常见的数据结构,特点,如何实现的
(5)给你一个list如何遍历其中的每一个元素(我答使用的是Iterator迭代器,因为速度快)。为什么使用迭代器?
(6)如果让你设计一个线程池,你会如何实现?java中是如何实现的?
(7)在主线程中有线程A,如何让主线程等待A完成。
(8)给你一个场景:需求是有一堆任务,如果线程池中线程不够则创建线程,如果线程空闲30S则销毁线程,
需要一个线程池,如何去设计这个线程池。
(9)给你一个场景:有一个类,类中含有成员变量a,有多个线程多它进行访问,但只有一个线程能够对它进行更改。这个是线程安全的吗?
(10)针对上面的问题,应该如何操作?(我答的是volatile关键字),为什么volatile可以,底层实现?
(11)volatile和synchronized的区别?synchronized的实现原理
(12)JVM内存模型
(13)垃圾回收算法,垃圾回收流程。
(14)哪些对象是作为GC roots的
(15)了解阻塞队列吗,如何实现的
(16)数据库的范式
(17)数据库如何优化查询的?
1,谈谈object类

可以看我之前的博客:http://blog.csdn.net/u012156116/article/details/79550497

2,Java中hashCode()是如何实现的

下面这段话摘自Effective Java一书:

  • 在程序执行期间,只要equals方法的比较操作用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法必须始终如一地返回同一个整数
  • 如果两个对象根据equals方法比较是相等的,那么调用两个对象的hashCode方法必须返回相同的整数结果。
  • 如果两个对象根据equals方法比较是不等的,则hashCode方法不一定得返回不同的整数。

对于第二条和第三条很好理解,但是第一条,很多时候就会忽略。在《Java编程思想》一书中的P495页也有同第一条类似的一段话:

  “设计hashCode()时最重要的因素就是:无论何时,对同一个对象调用hashCode()都应该产生同样的值。如果在讲一个对象用put()添加进HashMap时产生一个hashCdoe值,而用get()取出时却产生了另一个hashCode值,那么就无法获取该对象了。所以如果你的hashCode方法依赖于对象中易变的数据,用户就要当心了,因为此数据发生变化时,hashCode()方法就会生成一个不同的散列码”。

3,HashMap中解决hash冲突
  • 开放定址法:$H_i = (H(key)+d_i)MODm$ ,即在原来地址的基础上加上或减去一个数,再进行定地址的操作。理论上可以使用所有的存储空间,但是容易造成对地址的争夺,产生二次聚集,即在处理同义词的冲突的过程中又增加了非同义词的争夺 。
  • 再哈希:使用不同的hash函数再次进行hash操作。不易产生聚集,但是增加了计算时间。
  • 链地址法:将冲突的元素进行用一个链表进行存储
  • 公共溢出区
6,如果让你设计一个线程池,你会如何实现?java中是如何实现的?
这个问题首先需要分析下java中现有的四种常见线程池是怎么实现的。


你可能感兴趣的:(面经整理)