常见Java面试题(3-6年)

目录

一、Java基础

二、Java高级

三、Java web

四、Java 框架

五、数据库

六、JVM相关


1. JDK 和 JRE 有什么区别?

  •       JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。
  •       JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。

2、Java基本数据类型? 占用几个字节?

3、final 在 java 中有什么作用?

  • final 修饰的类叫最终类,该类不能被继承。
  • final 修饰的方法不能被重写。
  • final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

4、java 中操作字符串都有哪些类?它们之间有什么区别?

  • 操作字符串的类有:String、StringBuffer、StringBuilder。

5、如何将字符串反转?

  • 使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。

6、String 类的常用方法都有那些?

  • indexOf():返回指定字符的索引。
  • charAt():返回指定索引处的字符。
  • replace():字符串替换。
  • trim():去除字符串两端空白。
  • split():分割字符串,返回一个分割后的字符串数组。
  • getBytes():返回字符串的 byte 类型数组。
  • length():返回字符串长度。
  • toLowerCase():将字符串转成小写字母。
  • toUpperCase():将字符串转成大写字符。
  • substring():截取字符串。
  • equals():字符串比较。

7、普通类和抽象类有哪些区别?

  • 普通类不能包含抽象方法,抽象类可以包含抽象方法。
  • 抽象类不能直接实例化,普通类可以直接实例化。

8、 接口和抽象类有什么区别?

  • 实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
  • 构造函数:抽象类可以有构造函数;接口不能有。
  • main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
  • 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
  • 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

9、java 中 IO 流分为几种?

  • 按功能来分:输入流(input)、输出流(output)。
  • 按类型来分:字节流和字符流。
  • 字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。

二、Java高级

1、java 容器都有哪些?

常见Java面试题(3-6年)_第1张图片

2、Collection 和 Collections 有什么区别?

  • java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。
  • Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

3、List、Set、Map 之间的区别是什么?

常见Java面试题(3-6年)_第2张图片

4、HashMap 和 Hashtable 有什么区别?

  • hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。
  • hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高。
  • hashMap允许空键值,而hashTable不允许。

5、 如何决定使用 HashMap 还是 TreeMap?

  • 对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。

6、ArrayList 和 LinkedList 的区别是什么?

  • 最明显的区别是 ArrrayList底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。

7、多线程_并行和并发有什么区别?

  • 并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
  • 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群。
  • 并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。

8、线程和进程的区别?

  • 简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行。

9、 守护线程是什么?

  • 守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程。

10. 创建线程有哪几种方式?

  • ①. 继承Thread类创建线程类
  • ②. 通过Runnable接口创建线程类
  • ③. 通过Callable和Future创建线程

11. 说一下 runnable 和 callable 有什么区别?

  • 有点深的问题了,也看出一个Java程序员学习知识的广度。

    Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行run()方法中的代码而已;
    Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。
12. 线程有哪些状态?

  • 线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。

13. sleep() 和 wait() 有什么区别?

  • sleep():方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争cpu的执行时间。因为sleep() 是static静态的方法,他不能改变对象的机锁,当一个synchronized块中调用了sleep() 方法,线程虽然进入休眠,但是对象的机锁没有被释放,其他线程依然无法访问这个对象。
  • wait():wait()是Object类的方法,当一个线程执行到wait方法时,它就进入到一个和该对象相关的等待池,同时释放对象的机锁,使得其他线程能够访问,可以通过notify,notifyAll方法来唤醒等待的线程。

14. notify()和 notifyAll()有什么区别?

  • 如果线程调用了对象的 wait()方法,那么线程便会处于该对象的等待池中,等待池中的线程不会去竞争该对象的锁。
  • 当有线程调用了对象的 notifyAll()方法(唤醒所有 wait 线程)或 notify()方法(只随机唤醒一个 wait 线程),被唤醒的的线程便会进入该对象的锁池中,锁池中的线程会去竞争该对象锁。也就是说,调用了notify后只要一个线程会由等待池进入锁池,而notifyAll会将该对象等待池内的所有线程移动到锁池中,等待锁竞争。
  • 优先级高的线程竞争到对象锁的概率大,假若某线程没有竞争到该对象锁,它还会留在锁池中,唯有线程再次调用 wait()方法,它才会重新回到等待池中。而竞争到对象锁的线程则继续往下执行,直到执行完了 synchronized 代码块,它会释放掉该对象锁,这时锁池中的线程会继续竞争该对象锁。

15 线程的 run()和 start()有什么区别?

  • 每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。
  • start()方法来启动一个线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码; 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行状态, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。
  • run()方法是在本线程里的,只是线程里的一个函数,而不是多线程的。 如果直接调用run(),其实就相当于是调用了一个普通函数而已,直接待用run()方法必须等待run()方法执行完毕才能执行下面的代码,所以执行路径还是只有一条,根本就没有线程的特征,所以在多线程执行时要使用start()方法而不是run()方法。

16. 创建线程池有哪几种方式?

  • ①. newFixedThreadPool(int nThreads)  创建一个固定长度的线程池,每当提交一个任务就创建一个线程,直到达到线程池的最大数量,这时线程规模将不再变化,当线程发生未预期的错误而结束时,线程池会补充一个新的线程。
  • ②. newCachedThreadPool()  创建一个可缓存的线程池,如果线程池的规模超过了处理需求,将自动回收空闲线程,而当需求增加时,则可以自动添加新线程,线程池的规模不存在任何限制。
  • ③. newSingleThreadExecutor()   这是一个单线程的Executor,它创建单个工作线程来执行任务,如果这个线程异常结束,会创建一个新的来替代它;它的特点是能确保依照任务在队列中的顺序来串行执行。
  • ④. newScheduledThreadPool(int corePoolSize)  创建了一个固定长度的线程池,而且以延迟或定时的方式来执行任务,类似于Timer。

17.在 java 程序中怎么保证多线程的运行安全?

  • 线程安全在三个方面体现:
  • 原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,synchronized);
  • 可见性:一个线程对主内存的修改可以及时地被其他线程看到,(synchronized,volatile);
  • 有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序,(happens-before原则)

18、什么是反射?

  • 反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力

19、什么是 java 序列化?什么情况下需要序列化?

  • 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
  • 什么情况下需要序列化:

         a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
         b)当你想用套接字在网络上传送对象的时候;
         c)当你想通过RMI传输对象的时候;

 

三、Java web

  1. jsp 和 servlet 有什么区别?
  2. jsp 有哪些内置对象?作用分别是什么?
  3. 说一下 jsp 的 4 种作用域?

四、Java 框架

  1. 什么是Spring?
  2. 什么是AOP?
  3. 什么是IOC?
  4. spring 事务实现方式有哪些?
  5. spring 自动装配 bean 有哪些方式?
  6.  @RequestMapping 的作用是什么?
  7.  @Autowired 的作用是什么?
  8. 区分 BeanFactory 和 ApplicationContext。
  9. spring DAO 有什么用?
  10. Bean 工厂和 Application contexts 有什么区别?
  11. ApplicationContext 通常的实现是什么?

五、数据库

  1. 触发器的作用?
  2. 什么是存储过程?用什么来调用?
  3. 什么是事务?什么是锁?
  4. 数据库会死锁吗,举一个死锁的例子,mysql怎么解决死锁
  5. 索引树是如何维护的?
  6. 数据库Left join case whenuniondelcare多少条数据
  7. Sql可以声明变量吗
  8. 数据库索引聚集索引

六、JVM相关

  1.  JVM垃圾回收机制
  2. JVM的编译优化

  3. 对Java内存模型的理解,以及其在并发中的应用

  4. JVM常用参数

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(面试)