1
-
2
-
3
- ----
4
- 先来看一下大纲吧,是不是有一种很满足的感觉?
5
- [ TOC]
6
-
7
1
---
2
+ category :
3
+ - 求职面试
4
+ tag :
5
+ - 面试题集合
6
+ ---
7
+
8
+ # Java:34道精选高频面试题
8
9
9
10
## 1.介绍一下 java 吧
10
11
11
12
java 是一门** 开源的跨平台的面向对象的** 计算机语言.
12
13
13
- ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java- basic-34-01.png )
14
+ ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-01.png )
14
15
15
16
跨平台是因为 java 的 class 文件是运行在虚拟机上的,其实跨平台的,而** 虚拟机是不同平台有不同版本** ,所以说 java 是跨平台的.
16
17
17
18
面向对象有几个特点:
18
19
19
- ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java- basic-34-02.png )
20
+ ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-02.png )
20
21
21
22
- 1.** 封装**
22
23
- 两层含义:一层含义是把对象的属性和行为看成一个密不可分的整体,将这两者'封装'在一个不可分割的** 独立单元** (即对象)中
@@ -54,7 +55,7 @@ java 是一门**开源的跨平台的面向对象的**计算机语言.
54
55
55
56
## 2.java 有哪些数据类型?
56
57
57
- ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java- basic-34-03.png )
58
+ ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-03.png )
58
59
59
60
java 主要有两种数据类型
60
61
130
131
## 7.arrayList 和 linkedList 的区别?
131
132
132
133
133
- ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java- basic-34-04.png )
134
+ ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-04.png )
134
135
135
136
- 1.ArrayList 是实现了基于** 数组** 的,存储空间是连续的。LinkedList 基于** 链表** 的,存储空间是不连续的。(LinkedList 是双向链表)
136
137
159
160
160
161
## 10.那么 hashMap 线程不安全怎么解决?
161
162
162
- ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java- basic-34-05.png )
163
+ ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-05.png )
163
164
164
165
- 一.给 hashMap ** 直接加锁** ,来保证线程安全
165
166
- 二.使用 ** hashTable** ,比方法一效率高,其实就是在其方法上加了 synchronized 锁
177
178
178
179
## 12.介绍一下 hashset 吧
179
180
180
- ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java- basic-34-06.png )
181
+ ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-06.png )
181
182
182
183
上图是 set 家族整体的结构,
183
184
@@ -203,7 +204,7 @@ HashSet 是**基于 HashMap 实现**的,底层**采用 HashMap 来保存元素
203
204
204
205
## 16.volatile 有什么作用?
205
206
206
- ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java- basic-34-07.png )
207
+ ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-07.png )
207
208
208
209
- ** 1.保证内存可见性**
209
210
- 可见性是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果,另一个线程马上就能看到。
@@ -239,7 +240,7 @@ Integer a = 1,Integer b = 1,a==b 结果为**true**
239
240
240
241
## 19.JMM 是什么?
241
242
242
- ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java- basic-34-08.png )
243
+ ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-08.png )
243
244
244
245
JMM 就是 ** Java内存模型** (java memory model)。因为在不同的硬件生产商和不同的操作系统下,内存的访问有一定的差异,所以会造成相同的代码运行在不同的系统上会出现各种问题。所以java内存模型(JMM)** 屏蔽掉各种硬件和操作系统的内存访问差异,以实现让java程序在各种平台下都能达到一致的并发效果** 。
245
246
@@ -316,7 +317,7 @@ public class Singleton {
316
317
317
318
## 22.volatile 有什么作用
318
319
319
- ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java- basic-34-09.png )
320
+ ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-09.png )
320
321
321
322
- 1.** 保证内存可见性**
322
323
- 当一个被volatile关键字修饰的变量被一个线程修改的时候,其他线程可以立刻得到修改之后的结果。当一个线程向被volatile关键字修饰的变量** 写入数据** 的时候,虚拟机会** 强制它被值刷新到主内存中** 。当一个线程** 读取** 被volatile关键字修饰的值的时候,虚拟机会** 强制要求它从主内存中读取** 。
@@ -347,7 +348,7 @@ try {
347
348
在 Java1.6 之前的版本中,synchronized 属于重量级锁,效率低下,** 锁是** cpu 一个** 总量级的资源** ,每次获取锁都要和 cpu 申请,非常消耗性能。
348
349
349
350
在 ** jdk1.6 之后** Java 官方对从 JVM 层面对 synchronized 较大优化,所以现在的 synchronized 锁效率也优化得很不错了,Jdk1.6 之后,为了减少获得锁和释放锁所带来的性能消耗,引入了偏向锁和轻量级锁,** 增加了锁升级的过程** ,由无锁->偏向锁->自旋锁->重量级锁
350
- ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java- basic-34-10.png )
351
+ ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-10.png )
351
352
352
353
增加锁升级的过程主要是** 减少用户态到核心态的切换,提高锁的效率,从 jvm 层面优化锁**
353
354
@@ -361,7 +362,7 @@ cas 叫做 CompareAndSwap,**比较并交换**,很多地方使用到了它,
361
362
362
363
当一个线程需要修改一个共享变量的值,完成这个操作需要先取出共享变量的值,赋给 A,基于 A 进行计算,得到新值 B,在用预期原值 A 和内存中的共享变量值进行比较,** 如果相同就认为其他线程没有进行修改** ,而将新值写入内存
363
364
364
- ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java- basic-34-11.png )
365
+ ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-11.png )
365
366
366
367
** CAS的缺点**
367
368
@@ -382,7 +383,7 @@ ReentrantLock有两种模式,一种是公平锁,一种是非公平锁。
382
383
383
384
** 公平锁**
384
385
385
- ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java- basic-34-12.png )
386
+ ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-12.png )
386
387
387
388
- 第一步:** 获取状态的 state 的值**
388
389
- 如果 state=0 即代表锁没有被其它线程占用,执行第二步。
@@ -396,7 +397,7 @@ ReentrantLock有两种模式,一种是公平锁,一种是非公平锁。
396
397
397
398
** 非公平锁**
398
399
399
- ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java- basic-34-13.png )
400
+ ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-13.png )
400
401
401
402
- 获取状态的 state 的值
402
403
- 如果 state=0 即代表锁没有被其它线程占用,则设置当前锁的持有者为当前线程,该操作用 CAS 完成。
@@ -499,7 +500,7 @@ public class Demo {
499
500
500
501
## 29.线程池的执行流程?
501
502
502
- ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java- basic-34-14.png )
503
+ ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-14.png )
503
504
504
505
- 判断线程池中的线程数** 是否大于设置的核心线程数**
505
506
- 如果** 小于** ,就** 创建** 一个核心线程来执行任务
@@ -547,13 +548,13 @@ Object obj = new Object();
547
548
## 33.聊聊 ThreadLocal 吧
548
549
549
550
- ThreadLocal其实就是** 线程本地变量** ,他会在每个线程都创建一个副本,那么在线程之间访问内部副本变量就行了,做到了线程之间互相隔离。
550
- ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java- basic-34-15.png )
551
+ ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-15.png )
551
552
- ThreadLocal 有一个** 静态内部类 ThreadLocalMap** ,ThreadLocalMap 又包含了一个 Entry 数组,** Entry 本身是一个弱引用** ,他的 key 是指向 ThreadLocal 的弱引用,** 弱引用的目的是为了防止内存泄露** ,如果是强引用那么除非线程结束,否则无法终止,可能会有内存泄漏的风险。
552
553
- 但是这样还是会存在内存泄露的问题,假如 key 和 ThreadLocal 对象被回收之后,entry 中就存在 key 为 null ,但是 value 有值的 entry 对象,但是永远没办法被访问到,同样除非线程结束运行。** 解决方法就是调用 remove 方法删除 entry 对象** 。
553
554
554
555
## 34.一个对象的内存布局是怎么样的?
555
556
556
- ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java- basic-34-16.png )
557
+ ![ ] ( https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-16.png )
557
558
558
559
- ** 1.对象头** :
559
560
对象头又分为 ** MarkWord** 和 ** Class Pointer** 两部分。
0 commit comments