Skip to content

Commit

Permalink
剩下菜单栏和左侧菜单,优质文章
Browse files Browse the repository at this point in the history
  • Loading branch information
itwanger committed Mar 17, 2022
1 parent 4436da9 commit 01a6790
Show file tree
Hide file tree
Showing 220 changed files with 6,027 additions and 1,025 deletions.
373 changes: 73 additions & 300 deletions README.md

Large diffs are not rendered by default.

1 change: 0 additions & 1 deletion _navbar.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,4 @@
* [Go语言学习路线](docs/xuexiluxian/go.md)
* [操作系统学习路线](docs/xuexiluxian/os.md)
* [前端学习路线](docs/xuexiluxian/qianduan.md)
* [回到主页](README.md)

53 changes: 19 additions & 34 deletions _sidebar.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,63 +5,48 @@
* [Java面渣逆袭](README.md?id=Java面渣逆袭)
* [Java概述](README.md?id=java概述)
* [Java基础语法](README.md?id=java基础语法)
* [面向对象](README.md?id=面向对象)
* [字符串String](README.md?id=字符串String)
* [数组](README.md?id=数组)
* [Java面向对象编程](README.md?id=Java面向对象编程)
* [字符串&数组](README.md?id=字符串&数组)
* [集合框架(容器)](README.md?id=集合框架(容器))
* [Java输入输出](README.md?id=Java输入输出)
* [异常处理](README.md?id=异常处理)
* [常用工具类](README.md?id=常用工具类)
* [Java8新特性](README.md?id=Java8新特性)
* [Java新特性](README.md?id=Java新特性)
* [Java重要知识点](README.md?id=java重要知识点)
* [Java并发编程](README.md?id=Java并发编程)
* [Java虚拟机](README.md?id=Java虚拟机)
* [Java企业级开发](README.md?id=Java企业级开发)
* [基建篇](README.md?id=基建篇)
* [Maven](README.md?id=Maven)
* [Git](README.md?id=Git)
* [Nginx](README.md?id=Nginx)
* [日志服务](README.md?id=日志服务)
* [工具篇](README.md?id=工具篇)
* [Intellij-IDEA](README.md?id=Intellij-IDEA)
* [辅助工具](README.md?id=辅助工具)
* [框架篇](README.md?id=框架篇)
* [SpringBoot](README.md?id=SpringBoot)
* [Spring](README.md?id=Spring)
* [开发工具](README.md?id=开发工具)
* [IDE/编辑器](README.md?id=IDE/编辑器)
* [Spring](README.md?id=Spring)
* [SpringBoot](README.md?id=SpringBoot)
* [辅助工具/轮子](README.md?id=辅助工具)
* [安全篇](README.md?id=安全篇)
* [分布式](README.md?id=分布式)
* [Elasticsearch](README.md?id=Elasticsearch)
* [ZooKeeper](README.md?id=ZooKeeper)
* [高性能](README.md?id=高性能)
* [消息队列](README.md?id=消息队列)
* [高可用](README.md?id=高可用)
* [实战篇](README.md?id=实战篇)
* [开源项目](README.md?id=开源项目)
* [问题解析](README.md?id=问题解析)
* [代码优化](README.md?id=代码优化)
* [性能调优](README.md?id=性能调优)
* [数据库](README.md?id=数据库)
* [Redis](README.md?id=Redis)
* [MySQL](README.md?id=MySQL)
* [Redis](README.md?id=Redis)
* [MongoDB](README.md?id=MongoDB)
* [计算机基础](README.md?id=计算机基础)
* [数据结构](README.md?id=数据结构)
* [前端](README.md?id=前端)
* [求职面试](README.md?id=求职面试)
* [八股文](README.md?id=八股文)
* [面试经验](README.md?id=面试经验)
* [简历](README.md?id=简历)
* [面试题集合](README.md?id=面试题集合)
* [背诵版八股文](README.md?id=背诵版八股文)
* [优质面经](README.md?id=优质面经)
* [面试准备](README.md?id=面试准备)
* [城市选择](README.md?id=城市选择)
* [学习资源](README.md?id=学习资源)
* [资料下载](README.md?id=资料下载)
* [资源推荐](README.md?id=八资源推荐)
* [在线图文教程](README.md?id=在线图文教程)
* [在线视频教程](README.md?id=在线视频教程)
* [优质书单](README.md?id=优质书单)
* [学习建议](README.md?id=学习建议)
* [程序人生](README.md?id=程序人生)
* [码农生活](README.md?id=码农生活)
* [闲聊唠嗑](README.md?id=闲聊唠嗑)
* [人生建议](README.md?id=人生建议)
* [PDF下载](README.md?id=PDF下载)
* [图文教程](README.md?id=图文教程)
* [视频教程](README.md?id=视频教程)
* [优质书单](README.md?id=优质书单)
* [学习建议](README.md?id=学习建议)
* [知识库建设](README.md?id=知识库建设)
* [联系作者](README.md?id=联系作者)
* [心路历程](README.md?id=心路历程)
Expand Down
14 changes: 8 additions & 6 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,18 @@ actions:
## 推荐阅读

- [CS 学习指南👉](/xuexiluxian/) : 一份涵盖 Java、C 语言、C++、Python、Go、前端、操作系统的全方位 CS 学习路线!清晰且有效!
- [编程喵喵🐱实战项目学习教程](https://github.com/itwanger/codingmore-learning) :codingmore(Spring Boot+Vue 的前后端分离项目,一款值得一试的开源知识库学习网站)的学习教程,需要项目经验的 Java 开发者必备!
- [Java程序员常读书单📚,附下载地址](https://gitee.com/itwanger/JavaBooks) : 助力Java 程序员构建最强知识体系,涵盖Java、设计模式、数据库、数据结构与算法、大数据、架构等等,再也不用辛苦去找下载地址了。
- [编程喵喵🐱实战项目学习教程](https://github.com/itwanger/codingmore-learning) :codingmore(Spring Boot+Vue 的前后端分离项目,一款值得一试的开源知识库学习网站)的学习教程,需要项目经验的 Java 开发者必备!
- [优质文章精选集📗](/sidebar/) :精选一些 Java 程序员应该读一读的优质文章,帮你少走一些弯路!


## PDF

- [最全最硬核的Java面试 “备战” 资料](https://mp.weixin.qq.com/s/US5nTxbC2nYc1hWpn5Bozw)
- [深入浅出 Java 多线程](https://mp.weixin.qq.com/s/pxKrjw_5NTdZfHOKCkwn8w)
- [GitHub 星标 115k+的 Java 教程](https://mp.weixin.qq.com/s/d7Z0QoChNuP9bTwAGh2QCw)
- [重学 Java 设计模式](https://mp.weixin.qq.com/s/PH5AizUAnTz0CuvJclpAKw)
- [LeetCode 题解 Java 版](https://mp.weixin.qq.com/s/wvzB1p9_Yu7n7Ak83DrrdA)
- [👏下载→最全最硬核的Java面试 “备战” 资料](https://mp.weixin.qq.com/s/US5nTxbC2nYc1hWpn5Bozw)
- [👏下载→深入浅出 Java 多线程](https://mp.weixin.qq.com/s/pxKrjw_5NTdZfHOKCkwn8w)
- [👏下载→GitHub 星标 115k+的 Java 教程](https://mp.weixin.qq.com/s/d7Z0QoChNuP9bTwAGh2QCw)
- [👏下载→重学 Java 设计模式](https://mp.weixin.qq.com/s/PH5AizUAnTz0CuvJclpAKw)
- [👏下载→LeetCode 题解 Java 版](https://mp.weixin.qq.com/s/wvzB1p9_Yu7n7Ak83DrrdA)

## 公众号

Expand Down
45 changes: 23 additions & 22 deletions docs/baguwen/java-basic-34.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@


----
先来看一下大纲吧,是不是有一种很满足的感觉?
[TOC]

---
category:
- 求职面试
tag:
- 面试题集合
---

# Java:34道精选高频面试题

## 1.介绍一下 java 吧

java 是一门**开源的跨平台的面向对象的**计算机语言.

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java-basic-34-01.png)
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-01.png)

跨平台是因为 java 的 class 文件是运行在虚拟机上的,其实跨平台的,而**虚拟机是不同平台有不同版本**,所以说 java 是跨平台的.

面向对象有几个特点:

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java-basic-34-02.png)
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-02.png)

- 1.**封装**
- 两层含义:一层含义是把对象的属性和行为看成一个密不可分的整体,将这两者'封装'在一个不可分割的**独立单元**(即对象)中
Expand Down Expand Up @@ -54,7 +55,7 @@ java 是一门**开源的跨平台的面向对象的**计算机语言.
## 2.java 有哪些数据类型?

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java-basic-34-03.png)
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-03.png)

java 主要有两种数据类型

Expand Down Expand Up @@ -130,7 +131,7 @@ try{
## 7.arrayList 和 linkedList 的区别?


![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java-basic-34-04.png)
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-04.png)

- 1.ArrayList 是实现了基于**数组**的,存储空间是连续的。LinkedList 基于**链表**的,存储空间是不连续的。(LinkedList 是双向链表)

Expand Down Expand Up @@ -159,7 +160,7 @@ try{

## 10.那么 hashMap 线程不安全怎么解决?

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java-basic-34-05.png)
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-05.png)

- 一.给 hashMap **直接加锁**,来保证线程安全
- 二.使用 **hashTable**,比方法一效率高,其实就是在其方法上加了 synchronized 锁
Expand All @@ -177,7 +178,7 @@ try{

## 12.介绍一下 hashset 吧

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java-basic-34-06.png)
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-06.png)

上图是 set 家族整体的结构,

Expand All @@ -203,7 +204,7 @@ HashSet 是**基于 HashMap 实现**的,底层**采用 HashMap 来保存元素

## 16.volatile 有什么作用?

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java-basic-34-07.png)
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-07.png)

- **1.保证内存可见性**
- 可见性是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果,另一个线程马上就能看到。
Expand Down Expand Up @@ -239,7 +240,7 @@ Integer a = 1,Integer b = 1,a==b 结果为**true**

## 19.JMM 是什么?

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java-basic-34-08.png)
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-08.png)

JMM 就是 **Java内存模型**(java memory model)。因为在不同的硬件生产商和不同的操作系统下,内存的访问有一定的差异,所以会造成相同的代码运行在不同的系统上会出现各种问题。所以java内存模型(JMM)**屏蔽掉各种硬件和操作系统的内存访问差异,以实现让java程序在各种平台下都能达到一致的并发效果**

Expand Down Expand Up @@ -316,7 +317,7 @@ public class Singleton {

## 22.volatile 有什么作用

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java-basic-34-09.png)
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-09.png)

- 1.**保证内存可见性**
- 当一个被volatile关键字修饰的变量被一个线程修改的时候,其他线程可以立刻得到修改之后的结果。当一个线程向被volatile关键字修饰的变量**写入数据**的时候,虚拟机会**强制它被值刷新到主内存中**。当一个线程**读取**被volatile关键字修饰的值的时候,虚拟机会**强制要求它从主内存中读取**
Expand Down Expand Up @@ -347,7 +348,7 @@ try {
在 Java1.6 之前的版本中,synchronized 属于重量级锁,效率低下,**锁是** cpu 一个**总量级的资源**,每次获取锁都要和 cpu 申请,非常消耗性能。

**jdk1.6 之后** Java 官方对从 JVM 层面对 synchronized 较大优化,所以现在的 synchronized 锁效率也优化得很不错了,Jdk1.6 之后,为了减少获得锁和释放锁所带来的性能消耗,引入了偏向锁和轻量级锁,**增加了锁升级的过程**,由无锁->偏向锁->自旋锁->重量级锁
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java-basic-34-10.png)
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-10.png)

增加锁升级的过程主要是**减少用户态到核心态的切换,提高锁的效率,从 jvm 层面优化锁**

Expand All @@ -361,7 +362,7 @@ cas 叫做 CompareAndSwap,**比较并交换**,很多地方使用到了它,

当一个线程需要修改一个共享变量的值,完成这个操作需要先取出共享变量的值,赋给 A,基于 A 进行计算,得到新值 B,在用预期原值 A 和内存中的共享变量值进行比较,**如果相同就认为其他线程没有进行修改**,而将新值写入内存

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java-basic-34-11.png)
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-11.png)

**CAS的缺点**

Expand All @@ -382,7 +383,7 @@ ReentrantLock有两种模式,一种是公平锁,一种是非公平锁。

**公平锁**

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java-basic-34-12.png)
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-12.png)

- 第一步:**获取状态的 state 的值**
- 如果 state=0 即代表锁没有被其它线程占用,执行第二步。
Expand All @@ -396,7 +397,7 @@ ReentrantLock有两种模式,一种是公平锁,一种是非公平锁。

**非公平锁**

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java-basic-34-13.png)
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-13.png)

- 获取状态的 state 的值
- 如果 state=0 即代表锁没有被其它线程占用,则设置当前锁的持有者为当前线程,该操作用 CAS 完成。
Expand Down Expand Up @@ -499,7 +500,7 @@ public class Demo {

## 29.线程池的执行流程?

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java-basic-34-14.png)
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-14.png)

- 判断线程池中的线程数**是否大于设置的核心线程数**
- 如果**小于**,就**创建**一个核心线程来执行任务
Expand Down Expand Up @@ -547,13 +548,13 @@ Object obj = new Object();
## 33.聊聊 ThreadLocal 吧

- ThreadLocal其实就是**线程本地变量**,他会在每个线程都创建一个副本,那么在线程之间访问内部副本变量就行了,做到了线程之间互相隔离。
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java-basic-34-15.png)
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-15.png)
- ThreadLocal 有一个**静态内部类 ThreadLocalMap**,ThreadLocalMap 又包含了一个 Entry 数组,**Entry 本身是一个弱引用**,他的 key 是指向 ThreadLocal 的弱引用,**弱引用的目的是为了防止内存泄露**,如果是强引用那么除非线程结束,否则无法终止,可能会有内存泄漏的风险。
- 但是这样还是会存在内存泄露的问题,假如 key 和 ThreadLocal 对象被回收之后,entry 中就存在 key 为 null ,但是 value 有值的 entry 对象,但是永远没办法被访问到,同样除非线程结束运行。**解决方法就是调用 remove 方法删除 entry 对象**

## 34.一个对象的内存布局是怎么样的?

![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/java-basic-34-16.png)
![](https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/baguwen/basic-34-16.png)

- **1.对象头**:
对象头又分为 **MarkWord****Class Pointer** 两部分。
Expand Down
2 changes: 1 addition & 1 deletion docs/collection/hashmap-interview.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
category:
- 求职面试
tag:
- Java
- 面试题集合
---

# Java HashMap精选面试题
Expand Down
Loading

0 comments on commit 01a6790

Please sign in to comment.