Java高级工程师常见面试题(答案)

2017年02月17日 12:46:00阅读数:17280一、Java基础1. String类为什么是final的。2. HashMap的源码,实现原理,底层结构。总的来说,HashMap就是数组+链表(哈希表或者散列函数)的组合实现,每个数组元素存储一个链表的头结点,本质上来说是哈希表“拉链法”的实现。HashMap的链表元素对应的是一个静态内部类Entry,Entry主要包含key,value,next三个元素主要有put和get方法,put的原理是,通过hash&length-1计算index,此时记
摘要由CSDN通过智能技术生成
Java高级工程师常见面试题

2017年02月17日 12:46:00

阅读数:17280

一、Java基础

1. String类为什么是final的。

1.线程安全2.支持字符串常量池数据共享,节省资源,提高效率(因为如果已经存在这个常量便不会再创建,直接拿来用)

2. HashMap的源码,实现原理,底层结构。

总的来说,HashMap就是数组+链表(哈希表或者散列函数)的组合实现,每个数组元素存储一个链表的头结点,本质上来说是哈希表“拉链法”的实现。

HashMap的链表元素对应的是一个静态内部类Entry,Entry主要包含key,value,next三个元素

主要有put和get方法,put的原理是,通过hash&length-1计算index,此时记作Entry[index]=该元素。如果index相同

就是新入的元素放置到Entry[index],原先的元素记作Entry[index].next

get就比较简单了,先遍历数组,再遍历链表元素。

null key总是放在Entry数组的第一个元素(允许存放一个空键值对的原因)

解决hash冲突的方法:链地址法

再散列rehash的过程:确定容量超过目前哈希表的容量,重新调整table 的容量大小,当超过容量的最大值时

HashMap的容量size乘以负载因子[默认0.75] = threshold 将会触发扩容

3. 说说你知道的几个Java集合类:list、set、queue、map实现类咯。。。

queue的实现类: AbstractQueue, ArrayBlockingQueue, ConcurrentLinkedQueue, LinkedBlockingQueue, DelayQueue, LinkedList,PriorityBlockingQueue, PriorityQueue和ArrayDqueue

4. 描述一下ArrayList和LinkedList各自实现和区别

5. Java中的队列都有哪些,有什么区别。

Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构

Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Deque接 口。

Queue的实现
1、没有实现的阻塞接口的LinkedList: 实现了java.util.Queue接口和java.util.AbstractQueue接口
  内置的不阻塞队列:PriorityQueue和ConcurrentLinkedQueue
  PriorityQueue 和 ConcurrentLinkedQueue 类在 Collection Framework 中加入两个具体集合实现。
  PriorityQueue 类实质上维护了一个有序列表。加入到 Queue 中的元素根据它们的天然排序(通过其 java.util.Comparable 实现)或者根据传递给构造函数的 java.util.Comparator 实现来定位。
  ConcurrentLinkedQueue 是基于链接节点的、线程安全的队列。并发访问不需要同步。因为它在队列的尾部添加元素并从头部删除它们,所以只要不需要知道队列的大 小,       ConcurrentLinkedQueue 对公共集合的共享访问就可以工作得很好。收集关于队列大小的信息会很慢,需要遍历队列。

2)实现阻塞接口的:
  java.util.concurrent 中加入了 BlockingQueue 接口和五个阻塞队列类。它实质上就是一种带有一点扭曲的 FIFO 数据结构。不是立即从队列中添加或者删除元素,线程执行操作阻塞,直到有空间或者元素可用。
五个队列所提供的各有不同:
  * ArrayBlockingQueue:一个由数组支持的有界队列。
  * LinkedBlockingQueue:一个由链接节点支持的可选有界队列。
  * PriorityBlockingQueue:一个由优先级堆支持的无界优先级队列。
  * DelayQueue:一个由优先级堆支持的、基于时间的调度队列。
  * SynchronousQueue:一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。

6. 反射中,Class.forName和classloader的区别

class.forName()除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。
而classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。

Class.forName(name, initialize, loader)带参函数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象

7. Java7、Java8的新特性(baidu问的,好BT)


java7有一些比较重要的更新,如异常处理增加了被抑制的异常、捕获多异常、try-with-resource自动释放资源等,还有应用了G1垃圾回收器、switch可以使用String类型、泛型自动判断类型、fork/join框架把任务细分并使用多处理器处理、支持二进制字面量等

毫无疑问,Java 8是自Java 5(2004年)发布以来Java语言最大的一次版本升级,Java 8带来了很多的新特性,比如编译器、类库、开发工具和JVM(Java虚拟机)。在这篇教程中我们将会学习这些新特性,并通过真实例子演示说明它们适用的场景。

最最重要的是Java8开始支持了Lambda表达式

8. Java数组和链表两种结构的操作效率,在哪些情况下(从开头开始,从结尾开始,从中间开始),哪些操作(插入,查找,删除)的效率高

9. Java内存泄露的问题调查定位:jmap,jstack的使用等等

10. string、stringbuilder、stringbuffer区别

11. hashtable和hashmap的区别

  1. HashMap是非线程同步的,HashTable是线程同步的。
  2. HashMap允许null作为键或者值,HashTable不允许
  3. HashTable中有个一个contains方法,HashMap去掉了此方法
  4. 效率上来讲,HashMap因为是非线程安全的,因此效率比HashTable高
  5. hashTable继承Dictionary,而HashMap继承Abstract

13 .异常的结构,运行时异常和非运行时异常,各举个例子

14. String a= “abc” String b = “abc” String c = new String(“abc”) String d = “ab” + “c” .他们之间用 == 比较的结果

编译时优化

15. String 类的常用方法

16. Java的引用类型有哪几种

对象的强、软、弱和虚引用(四种引用)

在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。

⑴强引用(StrongReference)

强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。ps:强引用其实也就是我们平时A a = new A()这个意思。
⑵软引用(SoftReference)
如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存(下文给出示例)。
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
⑶弱引用(WeakReference)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值