互联网公司校招Java面试题总结及答案——搜狐

hashmap是数组和链表的组合实现方式,结合了两者的有点,及数组的快速查询,链表的快速插入和删除;
  1. 开放定址法(线性探测再散列,二次探测再散列,伪随机探测再散列)
  2. 再哈希法
  3. 链地址法
  4. 建立一个公共溢出区
resize是2倍;
是快速失败的,通过volatile的modcount表示修改次数;
hashcode定位数组中的位置,equals定位链表中的位置;
如果length是2的n次方,不同的key算得得index相同的几率较小,且下面的等式成立, h & (length-1)   =   h % length ;
允许插入,因为是线程不安全的;
设置为16的原因是使得2^n-1的低位每一位都是1,这使得在低位上&时,得到的和原hash的低位相同,加之hash(int h)方法对key的hashCode的进一步优化,加入了高位计算,就使得只有相同的hash值的两个值才会被放到数组中的同一个位置上形成链表。
遍历方法:
Map map = new HashMap();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
}
效率高,以后一定要使用此种方式!
2.hashTable 与 concurrentHashMap 区别。怎么实现线程安全
concurrentHashMap特点:
(1)ConcurrentHashMap将hash表分为16个桶(默认值)
(2) 只有在求size等操作时才需要锁定整个表。
(3)弱一致迭代器
(4)ConcurrentHashMap的Segment是由HashEntry数组组成的;
(5)Segment的本质上就是一个加锁的HashMap,Segment<K,V> extends ReentrantLock
(6)每次删除一个元素就要将那之前的元素克隆一遍?这点其实是由entry的 不变性来决定的,仔细观察entry定义,发现除了value,其他 所有属性都是用final来修饰的,这意味着在第一次设置了next域之后便不能再改变它,取而代之的是将它之前的节点全都克隆一次。
hashTable特点:
(1)Hashtable是synchronized;
(2)两者的迭代器的一致性不同的,hash table的迭代器是强一致性的,而concurrenthashmap是弱一致的。
HashMap可以通过下面的语句进行同步:
Map m = Collections.synchronizeMap(hashMap);
3.collection 接口中应用中遇到过什么问题?怎么解决的

4.map 接口中的 TreeMap/linkedHashMap 区别
LinkedHashMap继承自HashMap 保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。
TreeMap 能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
5. 线程池怎么实现的?线程池中线程的数量怎么设定? jdk 怎么监控线程状态与线程数量?(不知道) jstack 打印线程状态,分析线程负载状况? linkedBlockingQuene 与 ArrayBlockingQuene 区别
通过Executor子接口实现:

一个线程池包括以下四个基本组成部分:
1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;
2、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;
3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;
4、任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。
线程池中线程的数量怎么设定:通过ThreadPoolExecutor的构造函数设定;
jstack 打印线程状态,分析线程负载状况:先通过top命令找到CPU占用资源较高的进程pid,然后同top -Hp 23344查看该进程中各个线程的CPU使用情况,可以看出pid为25077的线程占了较多的cpu资源,利用jstack命令可以继续查看该线程当前的堆栈状态。在top命令中,已经获取到了占用cpu资源较高的线程pid,将该pid转成16进制的值,在thread dump中每个线程都有一个nid,找到对应的nid即可;
  LinkedBlockingQuene:基于链表结构的阻塞队列,按FIFO排序元素,吞吐量通常要高于 ArrayBlockingQuene
6.GC 算法? CMS 垃圾收集器, CMS 垃圾收集中断几次?
标记-清除、复制、标记-整理;
CMS:初始标记、并发标记、重新标记、并发清除;
两次中断;
7.mysql 索引原理。为什么索引一部分放到内存,一部分放到硬盘上?
为了加快搜索速度,需要将搜索字段进行排序,索引就是对记录集的一个或多个字段进行排序的方法。

9. 介绍下封装类源码
就是int对应的封装类Integer;Integer extends Number implements Comparable<Integer>;然后又toString(),toHexString()等方法。
  • 4
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值