面试Java面试题

Java面试知识点总结

2016-10-14  本文已影响8156人  absfree

本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺(阅读本文需要有一定的Java基础)。本文的问题列表来自于http://www.nowcoder.com/discuss/3043 在此感谢原作者的无私分享:)

1. Java中的原始数据类型都有哪些,它们的大小及对应的封装类是什么?

2. 谈一谈”==“与”equals()"的区别。
《Think in Java》中说:“关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”。
"=="判断的是两个对象的内存地址是否一样,适用于原始数据类型和枚举类型(它们的变量存储的是值本身,而引用类型变量存储的是引用);equals是Object类的方法,Object对它的实现是比较内存地址,我们可以重写这个方法来自定义“相等”这个概念。比如类库中的String、Date等类就对这个方法进行了重写。
综上,对于枚举类型和原始数据类型的相等性比较,应该使用"==";对于引用类型的相等性比较,应该使用equals方法。

3. Java中的四种引用及其应用场景是什么?

4. object中定义了哪些方法?
clone(), equals(), hashCode(), toString(), notify(), notifyAll(), wait(), finalize(), getClass()

5. hashCode的作用是什么?
请参见散列表的基本原理与实现

6. ArrayList, LinkedList, Vector的区别是什么?

7. String, StringBuilder, StringBuffer的区别是什么?

8. Map, Set, List, Queue、Stack的特点及用法。

更详细的说明请参考官方文档,对相关数据结构不太熟悉的同学可以参考《算法导论》或其他相关书籍。

9. HashMap和HashTable的区别

10. HashMap的实现原理
简单的说,HashMap的底层实现是“基于拉链法的散列表”。详细分析请参考深入解析HashMap、HashTable

11. ConcurrentHashMap的实现原理
ConcurrentHashMap是支持并发读写的HashMap,它的特点是读取数据时无需加锁,写数据时可以保证加锁粒度尽可能的小。由于其内部采用“分段存储”,只需对要进行写操作的数据所在的“段”进行加锁。关于ConcurrentHashMap底层实现的详细分析请参考Java并发编程:并发容器之ConcurrentHashMap

12. TreeMap, LinkedHashMap, HashMap的区别是什么?

13. Collection与Collections的区别是什么?

14. 对于“try-catch-finally”,若try语句块中包含“return”语句,finally语句块会执行吗?
会执行。只有两种情况finally块中的语句不会被执行:****

15. Java中的异常层次结构
Java中的异常层次结构如下图所示:

我们可以看到Throwable类是异常层级中的基类。Error类表示内部错误,这类错误使我们无法控制的;Exception表示异常,RuntimeException及其子类属于未检查异常,这类异常包括ArrayIndexOutOfBoundsException、NullPointerException等,我们应该通过条件判断等方式语句避免未检查异常的发生。IOException及其子类属于已检查异常,编译器会检查我们是否为所有可能抛出的已检查异常提供了异常处理器,若没有则会报错。对于未检查异常,我们无需捕获(当然Java也允许我们捕获,但我们应该做的事避免未检查异常的发生)。 

16. Java面向对象的三个特征与含义
** ** 三大特征:封装、继承、多态。详细介绍请戳Java面向对象三大特性

17. Override, Overload的含义与区别

18. 接口与抽象类的区别

19. 静态内部类与非静态内部类的区别
静态内部类不会持有外围类的引用,而非静态内部类会隐式持有外围类的一个引用。

20. Java中多态的实现原理
所谓多态,指的就是父类引用指向子类对象,调用方法时会调用子类的实现而不是父类的实现。多态的实现的关键在于“动态绑定”。详细介绍请戳Java动态绑定的内部实现机制

21. 简述Java中创建新线程的两种方法

22. 简述Java中进行线程同步的方法

23. 简述Java中具有哪几种粒度的锁
Java中可以对类、对象、方法或是代码块上锁。

24. 给出“生产者-消费者”问题的一种解决方案
使用阻塞队列:

public class BlockingQueueTest {
  private int size = 20;
  private ArrayBlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<>(size);
  public static void main(String[] args) {
    BlockingQueueTest test = new BlockingQueueTest(); 
    Producer producer = test.new Producer(); 
    Consumer consumer = test.new Consumer(); 
    producer.start(); consumer.start(); 
  } 
 
  class Consumer extends Thread{ 
    @Override 
    public void run() { 
      while(true){ 
        try { 
          //从阻塞队列中取出一个元素 
          queue.take(); 
          System.out.println("队列剩余" + queue.size() + "个元素"); 
        } catch (InterruptedException e) { 
        } 
      } 
    } 
  } 

  class Producer extends Thread{ 
    @Override 
    public void run() { 
      while (true) { 
        try { 
          //向阻塞队列中插入一个元素 
          queue.put(1); 
          System.out.println("队列剩余空间:" + (size - queue.size())); 
        } catch (InterruptedException e) { 
        } 
      } 
    } 
  }
}

25. ThreadLocal的设计理念与作用
ThreadLocal的作用是提供线程内的局部变量,在多线程环境下访问时能保证各个线程内的ThreadLocal变量各自独立。也就是说,每个线程的ThreadLocal变量是自己专用的,其他线程是访问不到的。ThreadLocal最常用于以下这个场景:多线程环境下存在对非线程安全对象的并发访问,而且该对象不需要在线程间共享,但是我们不想加锁,这时候可以使用ThreadLocal来使得每个线程都持有一个该对象的副本。

26. concurrent包的整体架构

27. ArrayBlockingQueue, CountDownLatch类的作用

28. wait(),sleep() 的区别

29. 线程池的用法与优势

30. for-each与常规for循环的效率对比
关于这个问题我们直接看《Effective Java》给我们做的解答:

for-each能够让代码更加清晰,并且减少了出错的机会。
下面的惯用代码适用于集合与数组类型:

for (Element e : elements) {
    doSomething(e);
}

使用for-each循环与常规的for循环相比,并不存在性能损失,即使对数组进行迭代也是如此。实际上,在有些场合下它还能带来微小的性能提升,因为它只计算一次数组索引的上限。

31. 简述Java IO与NIO的区别

32. 反射的作用与原理
反射的作用概括地说是运行时获取类的各种定义信息,比如定义了哪些属性与方法。原理是通过类的class对象来获取它的各种信息。

33. Java中的泛型机制
关于泛型机制的详细介绍请直接戳Java核心技术点之泛型

34. Java 7与Java 8的新特性
这里有两篇总结的非常好的:
Java 7的新特性
Java 8的新特性

35. 常见设计模式
所谓“设计模式”,不过是面向对象编程中一些常用的软件设计手法,并且经过实践的检验,这些设计手法在各自的场景下能解决一些需求,因此它们就成为了如今广为流传的”设计模式“。也就是说,正式因为在某些场景下产生了一些棘手的问题,才催生了相应的设计模式。明确了这一点,我们在学习某种设计模式时要充分理解它产生的背景以及它所解决的主要矛盾是什么。

常用的设计模式可以分为以下三大类:

36. JNI的基本用法
关于JNI,这里有篇好文:Android中的JNI

37. 动态代理的定义、应用场景及原理
请参见十分钟理解Java之动态代理

38. 注解的基本概念与使用
注解可以看作是“增强版的注释”,它可以向编译器、虚拟机说明一些事情。
注解是描述Java代码的代码,它能够被编译器解析,注解处理工具在运行时也能够解析注解。注解本身是“被动”的信息,只有主动解析它才有意义。
除了向编译器/虚拟机传递信息,我们也可以使用注解来生成一些“模板化”的代码。

关于注解更进一步的分析请参考Java核心技术点之注解


** 长按或扫描二维码关注我们,让您利用每天等地铁的时间就能学会怎样写出优质app。**


上一篇下一篇

猜你喜欢

热点阅读