史上最全Java初中级面试题,发现网上很多Java初级面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~
本人发现网上虽然有不少Java相关的面试题,但第一未必全,第二未必有答案,第三虽然有答案,但未必能在面试中说,所以在本文里,会不断收集各种面试题,并站在面试官的立场上,给出我自己的答案。
如果不背 Java面试题的答案,肯定面试会挂!
这套Java面试题大全,希望对大家有帮助哈~
博主已将以下这些面试题整理成了一个Java面试手册,是PDF版的
1、为什么使用Executor框架?
**1、**每次执行任务创建线程 new Thread()比较消耗性能,创建一个线程是比较耗时、耗资源的。
**2、**调用 new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制的创建,线程之间的相互竞争会导致过多占用系统资源而导致系统瘫痪,还有线程之间的频繁交替也会消耗很多系统资源。
**3、**接使用new Thread() 启动的线程不利于扩展,比如定时执行、定期执行、定时定期执行、线程中断等都不便实现。
2、你能保证 GC 执行吗?
不能,虽然你可以调用 System.gc() 或者 Runtime.gc(),但是没有办法保证 GC的执行。
3、UML中有哪些常用的图?
UML定义了多种图形化的符号来描述软件系统部分或全部的静态结构和动态结构,包括:用例图(use case diagram)、类图(class diagram)、时序图(sequence diagram)、协作图(collaboration diagram)、状态图(statechart diagram)、活动图(activity diagram)、构件图(component diagram)、部署图(deployment diagram)等。在这些图形化符号中,有三种图最为重要,分别是:用例图(用来捕获需求,描述系统的功能,通过该图可以迅速的了解系统的功能模块及其关系)、类图(描述类以及类与类之间的关系,通过该图可以快速了解系统)、时序图(描述执行特定任务时对象之间的交互关系以及执行顺序,通过该图可以了解对象能接收的消息也就是说对象能够向外界提供的服务)。
用例图:
类图:
时序图:
4、volatile关键字的原理是什么?干什么用的?
使用了volatile关键字的变量,每当变量的值有变动的时候,都会将更改立即同步到主内存中;而如果某个线程想要使用这个变量,就先要从主存中刷新到工作内存,这样就确保了变量的可见性。
一般使用一个volatile修饰的bool变量,来控制线程的运行状态。
volatile boolean stop = false; void stop(){ this.stop = true; } void start(){ new Thread(()->{ while (!stop){ //sth } }).start(); }
5、synchronized 和 Lock 有什么区别?
**1、**首先synchronized是Java内置关键字,在JVM层面,Lock是个Java类;
**2、**synchronized 可以给类、方法、代码块加锁;而 lock 只能给代码块加锁。
**3、**synchronized 不需要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁;而 lock 需要自己加锁和释放锁,如果使用不当没有 unLock()去释放锁就会造成死锁。
**4、**通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。
6、抽象类必须要有抽象方法吗
不是必须。抽象类可以没有抽象方法。
7、强引用、软引用、弱引用、虚引用是什么,有什么区别?
**1、**强引用,就是普通的对象引用关系,如 String s = new String(“ConstXiong”)
**2、**软引用,用于维护一些可有可无的对象。只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。SoftReference 实现
**3、**弱引用,相比软引用来说,要更加无用一些,它拥有更短的生命周期,当 JVM 进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。WeakReference 实现
**4、**虚引用是一种形同虚设的引用,在现实场景中用的不是很多,它主要用来跟踪对象被垃圾回收的活动。PhantomReference 实现
8、Servlet的生命周期?
**1、**加载:判断servlet实例是否存在,如果不存在,就加载serlvet
**2、**实例化:
**3、**初始化
4、服务
5、销毁
9、Hibernate的对象有几种状态
**1、**瞬时态(transient)
**2、**持久态(persistent)
**3、**游离态(detached)
10、说一下HashMap的实现原理?
**1、**HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
**2、**HashMap的数据结构: 在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
HashMap 基于 Hash 算法实现的
**1、**当我们往HashMap中put元素时,利用key的hashCode重新hash计算出当前对象的元素在数组中的下标
**2、**存储时,如果出现hash值相同的key,此时有两种情况。
(1)如果key相同,则覆盖原始值;
(2)如果key不同(出现冲突),则将当前的key-value放入链表中
**3、**获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。
**4、**理解了以上过程就不难明白HashMap是如何解决hash冲突的问题,核心就是使用了数组的存储方式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中做进一步的对比。
需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)
1、java中有几种方法可以实现一个线程?
继承 Thread 类
实现 Runnable 接口
实现 Callable 接口,需要实现的是 call() 方法
2、Java 中的 HashSet,内部是如何工作的?
HashSet 的内部采用 HashMap来实现。由于 Map 需要 key 和 value,所以所有 key 的都有一个默认 value。类似于 HashMap,HashSet 不允许重复的 key,只允许有一个null key,意思就是 HashSet 中只允许存储一个 null 对象。
3、redux的工作流程?
首先,我们看下几个核心概念:
**1、**Store:保存数据的地方,你可以把它看成一个容器,整个应用只能有一个Store。
**2、**State:Store对象包含所有数据,如果想得到某个时点的数据,就要对Store生成快照,这种时点的数据集合,就叫做State。
**3、**Action:State的变化,会导致View的变化。但是,用户接触不到State,只能接触到View。所以,State的变化必须是View导致的。Action就是View发出的通知,表示State应该要发生变化了。
**4、**Action Creator:View要发送多少种消息,就会有多少种Action。如果都手写,会很麻烦,所以我们定义一个函数来生成Action,这个函数就叫Action Creator。
**5、**Reducer:Store收到Action以后,必须给出一个新的State,这样View才会发生变化。这种State的计算过程就叫做Reducer。Reducer是一个函数,它接受Action和当前State作为参数,返回一个新的State。
**6、**dispatch:是View发出Action的唯一方法。
然后我们过下整个工作流程:
**1、**首先,用户(通过View)发出Action,发出方式就用到了dispatch方法。
**2、**然后,Store自动调用Reducer,并且传入两个参数:当前State和收到的Action,Reducer会返回新的State
**3、**State一旦有变化,Store就会调用监听函数,来更新View。
到这儿为止,一次用户交互流程结束。可以看到,在整个流程中数据都是单向流动的,这种方式保证了流程的清晰。
4、String类的常用方法有那些?
**1、**charAt:返回指定索引处的字符
**2、**indexOf():返回指定字符的索引
**3、**replace():字符串替换
**4、**trim():去除字符串两端空白
**5、**split():分割字符串,返回一个分割后的字符串数组
**6、**getBytes():返回字符串的byte类型数组
**7、**length():返回字符串长度
**8、**toLowerCase():将字符串转成小写字母
**9、**toUpperCase():将字符串转成大写字符
**10、**substring():截取字符串
**11、**format():格式化字符串
**12、**equals():字符串比较