专栏名称: java那些事
分享java开发中常用的技术,分享软件开发中各种新技术的应用方法。每天推送java技术相关或者互联网相关文章。关注“java那些事”,让自己做一个潮流的java技术人!《java程序员由笨鸟到菜鸟》系列文章火热更新中。
目录
相关文章推荐
芋道源码  ·  一款高颜值的在线项目任务管理神器 ·  昨天  
芋道源码  ·  SpringBoot 实现 License ... ·  昨天  
芋道源码  ·  Mybatis ... ·  3 天前  
JavaGuide  ·  好家伙,GitHub Copilot ... ·  4 天前  
芋道源码  ·  再见,Navicat 太炸了! ·  3 天前  
51好读  ›  专栏  ›  java那些事

Java面试知识点总结

java那些事  · 公众号  · Java  · 2016-12-30 16:22

正文

本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺(阅读本文需要有一定的Java基础;若您初涉Java,可以通过这些问题建立起对Java初步的印象,待有了一定基础后再后过头来看收获会更大)。

 

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

(1)boolean

   boolean数据类型非truefalse。这个数据类型表示1 bit的信息,但是它的大小并没有精确定义。

   《Java虚拟机规范》中如是说:虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8。这样我们可以得出boolean类型单独使用是4个字节,在数组中又是1个字节。那虚拟机为什么要用int来代替boolean呢?为什么不用byteshort,这样不是更节省内存空间吗?实际上,使用int的原因是,对于当下32位的CPU来说,一次进行32位的数据交换更加高效。

    综上,我们可以知道:官方文档对boolean类型没有给出精确的定义,《Java虚拟机规范》给出了“单独时使用4个字节,boolean数组时1个字节”的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。这其实是一种时空权衡。

    boolean类型的封装类是Boolean。

2byte——1 byte——Byte

3short——2 bytes——Short

4int——4 bytes——Integer

5long——8 bytes——Long

6float——4 bytes——Float

7double——8 bytes——Double

8char——2 bytes——Character

 

2. 谈一谈”==“与”equals()"的区别。

    《Think in Java》中说:“关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系

    "=="判断的是两个对象的内存地址是否一样,适用于原始数据类型和枚举类型(它们的变量存储的是值本身,而引用类型变量存储的是引用);equalsObject类的方法,Object对它的实现是比较内存地址,我们可以重写这个方法来自定义“相等”这个概念。比如类库中的StringDate等类就对这个方法进行了重写

    综上,对于枚举类型和原始数据类型的相等性比较,应该使用"==";对于引用类型的相等性比较,应该使用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的区别

    更加详细的分析请参考深入解析HashMap、HashTable

 

10. HashMap的实现原理

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

 

11. ConcurrentHashMap的实现原理

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

 

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

更加详细的说明请参考HashMap,LinkedMap,TreeMap的区别

 

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

    Collection是Java集合框架中的基本接口;Collections是Java集合框架提供的一个工具类,其中包含了大量用于操作或返回集合的静态方法。

    对Java集合框架还不太熟悉的小伙伴请参考Java核心技术点之集合框架

 

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. 静态内部类与非静态内部类的区别

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

    欲进一步了解内部类,请戳Java核心技术点之内部类

  

20. Java中多态的实现原理

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

 

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

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

  • volatile: Java Memory Model保证了对同一个volatile变量的写happens before对它的读;

  • synchronized: 可以来对一个代码块或是对一个方法上锁,被“锁住”的地方称为临界区,进入临界区的线程会获取对象的monitor,这样其他尝试进入临界区的线程会因无法获取monitor而被阻塞。由于等待另一个线程释放monitor而被阻塞的线程无法被中断。

  • ReentrantLock:  尝试获取锁的线程可以被中断并可以设置超时参数。

    更加详细的介绍请戳Java核心技术点之多线程

 

23. 简述Java中具有哪几种粒度的锁

    Java中可以对类、对象、方法或是代码块上锁。更加详细的介绍请戳Java核心技术点之多线程

 

24. 给出“生产者-消费者”问题的一种解决方案

    使用阻塞队列:

public class BlockingQueueTest {    private int size = 20;    private ArrayBlockingQueue 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来使得每个线程都持有一个该对象的副本。

    关于ThreadLocal的实现原理分析请戳深入剖析ThreadLocal

26. concurrent包的整体架构

 

 

27. ArrayBlockingQueue, CountDownLatch类的作用

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

 

29. 线程池的用法与优势

   关于线程池的详细介绍以及实现原理分析请戳深入理解Java之线程池

 

30. for-each与常规for循环的效率对比

   关于这个问题我们直接看《Effective Java》给我们做的解答:

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

 

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

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

 

31. 简述Java IO与NIO的区别

    更进一步的说明请戳Java NIO与IO

 

32. 反射的作用与原理

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

    详细介绍请参见Java核心技术点之反射

 

33. Java中的泛型机制

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

 

34. Java 7与Java 8的新特性

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

 

35. 常见设计模式

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

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

    关于每个模式具体的介绍请参考图说设计模式

 

36. JNI的基本用法

    关于JNI,这里有篇好文:Android中的JNI

 

37. 动态代理的定义、应用场景及原理

    关于动态代理,请直接参见Java核心技术点之动态代理

 

38. 注解的基本概念与使用

 

    这些就够了吗?当然不够。上面列出了面试中关于Java的常见问题,同时大多也是Java技术体系的核心技术点,通过这些问题而引发出的一系列问题正是为我们指出了完善自身知识体系的一条道路,我们要做的是顺着这条道路坚持走下去:)


推荐程序员必备微信号 


程序员内参
微信号:

programmer0001



推荐理由:
在这里,我们分享程序员相关技术,职场生活,行业热点资讯。不定期还会分享IT趣文和趣图。这里属于我们程序员自己的生活,工作和娱乐空间。


 ▼长按下方↓↓↓二维码识别关注