mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-20 22:17:09 +08:00
Merge branch 'master' of https://github.com/Snailclimb/Java_Guide
This commit is contained in:
commit
15e7c2f4fd
@ -85,7 +85,7 @@ public class ArrayList<E> extends AbstractList<E>
|
||||
}
|
||||
|
||||
/**
|
||||
*默认构造函数,其默认初始容量为10
|
||||
*默认构造函数,DEFAULTCAPACITY_EMPTY_ELEMENTDATA 为0.初始化为10,也就是说初始其实是空数组 当添加第一个元素的时候数组容量才变成10
|
||||
*/
|
||||
public ArrayList() {
|
||||
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
|
||||
|
@ -79,7 +79,7 @@
|
||||
|
||||
这几个是Java中很基本很基本的东西,但是我相信一定还有很多人搞不清楚!为什么呢?因为我们大多数时候在使用现成的编译工具以及环境的时候,并没有去考虑这些东西。
|
||||
|
||||
**JDK:** 顾名思义它是给开发者提供的开发工具箱,是给程序开发者用的。它除了包括完整的JRE(Java Runtime Environment),Java运行环境,还包含了其他供开发者使用的工具包。
|
||||
**JDK:** JDK(Java Development Kit)顾名思义它是给开发者提供的开发工具箱,是给程序开发者用的。它除了包括完整的JRE(Java Runtime Environment),Java运行环境,还包含了其他供开发者使用的工具包。
|
||||
|
||||
**JRE:** 普通用户而只需要安装 JRE(Java Runtime Environment)来运行 Java 程序。而程序开发者必须安装JDK来编译、调试程序。
|
||||
|
||||
@ -107,7 +107,7 @@ Java 中引入了虚拟机的概念,即在机器和编译程序之间加入了
|
||||
|
||||
**Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。**
|
||||
|
||||
> 解释性语言:解释型语言,是在运行的时候将程序翻译成机器语言。解释型语言的程序不需要在运行前编译,在运行程序的时候才翻译,专门的解释器负责在每个语句执行的时候解释程序代码。这样解释型语言每执行一次就要翻译一次,效率比较低。——百度百科
|
||||
> 解释型语言:解释型语言,是在运行的时候将程序翻译成机器语言。解释型语言的程序不需要在运行前编译,在运行程序的时候才翻译,专门的解释器负责在每个语句执行的时候解释程序代码。这样解释型语言每执行一次就要翻译一次,效率比较低。——百度百科
|
||||
|
||||
## 5. Java和C++的区别
|
||||
|
||||
|
@ -217,7 +217,7 @@ static int hash(int h) {
|
||||
ConcurrentHashMap 和 Hashtable 的区别主要体现在实现线程安全的方式上不同。
|
||||
|
||||
- **底层数据结构:** JDK1.7的 ConcurrentHashMap 底层采用 **分段的数组+链表** 实现,JDK1.8 采用的数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树。Hashtable 和 JDK1.8 之前的 HashMap 的底层数据结构类似都是采用 **数组+链表** 的形式,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的;
|
||||
- **实现线程安全的方式(重要):** ① **在JDK1.7的时候,ConcurrentHashMap(分段锁)** 对整个桶数组进行了分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。(默认分配16个Segment,比Hashtable效率提高16倍。) **到了 JDK1.8 的时候已经摒弃了Segment的概念,而是直接用 Node 数组+链表+红黑树的数据结构来实现,并发控制使用 synchronized 和 CAS 来操作。(JDK1.6以后 对 synchronized锁做了很多优化)** 整个看起来就像是优化过且线程安全的 HashMap,虽然在JDK1.8中还能看到 Segment 的数据结构,但是已经简化了属性,只是为了兼容旧版本;② **Hashtable(同一把锁)** :使用 synchronized 来保证线程安全,效率非常低下。当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用 put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低。
|
||||
- **实现线程安全的方式(重要):** ① **在JDK1.7的时候,ConcurrentHashMap(分段锁)** 对整个桶数组进行了分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。 **到了 JDK1.8 的时候已经摒弃了Segment的概念,而是直接用 Node 数组+链表+红黑树的数据结构来实现,并发控制使用 synchronized 和 CAS 来操作。(JDK1.6以后 对 synchronized锁做了很多优化)** 整个看起来就像是优化过且线程安全的 HashMap,虽然在JDK1.8中还能看到 Segment 的数据结构,但是已经简化了属性,只是为了兼容旧版本;② **Hashtable(同一把锁)** :使用 synchronized 来保证线程安全,效率非常低下。当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用 put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低。
|
||||
|
||||
**两者的对比图:**
|
||||
|
||||
|
@ -1,6 +1,4 @@
|
||||
> 工作一年以上的小伙伴可以加这个交流群,群内有免费公开课,现在加入就送Java架构师进阶系列电子书籍:[](https://jq.qq.com/?_wv=1027&k=5tjF8vk).
|
||||
>
|
||||
> **【强烈推荐,最后3天】** 阿里云双12正在做活动啦,两折,需要的不要错过!新人专属(老用户如果不想错过阿里云年底这波福利的话,可以用别人身份证再注册一个阿里云账号),活动地址:[https://m.aliyun.com/act/team1212?spm=5176.8142029.1139928.2.90ee6d3e7cFdsl#/](https://m.aliyun.com/act/team1212?params=N.TD4MOG6m2w) 。1核1G云服务器1年CPU100%不限性能仅需277,3年仅需708,强烈推荐!
|
||||
|
||||
为了优化大家的阅读体验,我重新进行了排版,并且增加了较为详细的目录供大家参考!如果有老哥对操作系统比较重要的知识总结过的话,欢迎找我哦!如果想学 SpringBoot 的话,推荐笔主的另外一个仓库[springboot-integration-examples](https://github.com/Snailclimb/springboot-integration-examples)。
|
||||
|
||||
|
@ -75,7 +75,10 @@
|
||||
- :thumbsup: [《重构_改善既有代码的设计》](https://book.douban.com/subject/4262627/)
|
||||
|
||||
豆瓣 9.1 分,重构书籍的开山鼻祖。
|
||||
> ### linux操作系统相关
|
||||
- :thumbsup:[<<unix环境编程>>](https://book.douban.com/subject/25900403/) :thumbsup: [<<unix网络编程>>](https://book.douban.com/subject/1500149/)
|
||||
|
||||
对于理解linux操作系统原理非常有用,同时可以打好个人的基本功力,面试中很多公司也会问到linux知识。
|
||||
> ### 课外书籍
|
||||
|
||||
《技术奇点》 :thumbsup:《追风筝的人》 :thumbsup:《穆斯林的葬礼》 :thumbsup:《三体》 《人工智能——李开复》
|
||||
|
@ -1,3 +1,26 @@
|
||||
<!-- MarkdownTOC -->
|
||||
|
||||
- [一 从认识操作系统开始](#一-从认识操作系统开始)
|
||||
- [1.1 操作系统简介](#11-操作系统简介)
|
||||
- [1.2 操作系统简单分类](#12-操作系统简单分类)
|
||||
- [二 初探Linux](#二-初探linux)
|
||||
- [2.1 Linux简介](#21-linux简介)
|
||||
- [2.2 Linux诞生简介](#22-linux诞生简介)
|
||||
- [2.3 Linux的分类](#23-linux的分类)
|
||||
- [三 Linux文件系统概览](#三-linux文件系统概览)
|
||||
- [3.1 Linux文件系统简介](#31-linux文件系统简介)
|
||||
- [3.2 文件类型与目录结构](#32-文件类型与目录结构)
|
||||
- [四 Linux基本命令](#四-linux基本命令)
|
||||
- [4.1 目录切换命令](#41-目录切换命令)
|
||||
- [4.2 目录的操作命令(增删改查)](#42-目录的操作命令增删改查)
|
||||
- [4.3 文件的操作命令(增删改查)](#43-文件的操作命令增删改查)
|
||||
- [4.4 压缩文件的操作命令](#44-压缩文件的操作命令)
|
||||
- [4.5 Linux的权限命令](#45-linux的权限命令)
|
||||
- [4.6 Linux 用户管理](#46-linux-用户管理)
|
||||
- [4.7 Linux系统用户组的管理](#47-linux系统用户组的管理)
|
||||
- [4.8 其他常用命令](#48-其他常用命令)
|
||||
|
||||
<!-- /MarkdownTOC -->
|
||||
|
||||
> 学习Linux之前,我们先来简单的认识一下操作系统。
|
||||
|
||||
@ -99,7 +122,7 @@ Linux命令大全:[http://man.linuxde.net/](http://man.linuxde.net/)
|
||||
- **`cd ~`:** 切换到用户主目录
|
||||
- **`cd -`:** 切换到上一个所在目录
|
||||
|
||||
### 4.2 目录的操作命令(增删改查)
|
||||
### 4.2 目录的操作命令(增删改查)
|
||||
|
||||
1. **`mkdir 目录名称`:** 增加目录
|
||||
2. **`ls或者ll`**(ll是ls -l的缩写,ll命令以看到该目录下的所有目录和文件的详细信息):查看目录信息
|
||||
@ -126,11 +149,11 @@ Linux命令大全:[http://man.linuxde.net/](http://man.linuxde.net/)
|
||||
注意:rm不仅可以删除目录,也可以删除其他文件或压缩包,为了增强大家的记忆, 无论删除任何目录或文件,都直接使用`rm -rf` 目录/文件/压缩包
|
||||
|
||||
|
||||
### 4.3 文件的操作命令(增删改查)
|
||||
### 4.3 文件的操作命令(增删改查)
|
||||
|
||||
1. **`touch 文件名称`:** 文件的创建(增)
|
||||
2. **`cat/more/less/tail 文件名称`** 文件的查看(查)
|
||||
- **`cat`:** 只能显示最后一屏内容
|
||||
- **`cat`:** 查看显示文件内容
|
||||
- **`more`:** 可以显示百分比,回车可以向下一行, 空格可以向下一页,q可以退出查看
|
||||
- **`less`:** 可以使用键盘上的PgUp和PgDn向上 和向下翻页,q结束查看
|
||||
- **`tail-10` :** 查看文件的后10行,Ctrl+C结束
|
||||
|
@ -87,20 +87,20 @@ Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去
|
||||

|
||||
|
||||
1. **原子性:** 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
|
||||
2. **一致性:** 执行事务前后,数据保持一致;
|
||||
3. **隔离性:** 并发访问数据库时,一个用户的事物不被其他事物所干扰,各并发事务之间数据库是独立的;
|
||||
4. **持久性:** 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库 发生故障也不应该对其有任何影响。
|
||||
2. **一致性:** 执行事务前后,数据库从一个一致性状态转换到另一个一致性状态。
|
||||
3. **隔离性:** 并发访问数据库时,一个用户的事物不被其他事务所干扰,各并发事务之间数据库是独立的;
|
||||
4. **持久性:** 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库 发生故障也不应该对其有任何影响。
|
||||
|
||||
**为了达到上述事务特性,数据库定义了几种不同的事务隔离级别:**
|
||||
|
||||
- **READ_UNCOMMITTED(未授权读取):** 最低的隔离级别,允许读取尚未提交的数据变更,**可能会导致脏读、幻读或不可重复读**
|
||||
- **READ_COMMITTED(授权读取):** 允许读取并发事务已经提交的数据,**可以阻止脏读,但是幻读或不可重复读仍有可能发生**
|
||||
- **READ_UNCOMMITTED(未提交读):** 最低的隔离级别,允许读取尚未提交的数据变更,**可能会导致脏读、幻读或不可重复读**
|
||||
- **READ_COMMITTED(提交读):** 允许读取并发事务已经提交的数据,**可以阻止脏读,但是幻读或不可重复读仍有可能发生**
|
||||
- **REPEATABLE_READ(可重复读):** 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,**可以阻止脏读和不可重复读,但幻读仍有可能发生。**
|
||||
- **SERIALIZABLE(串行):** 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,**该级别可以防止脏读、不可重复读以及幻读**。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
|
||||
|
||||
这里需要注意的是:**Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED隔离级别.**
|
||||
|
||||
事务隔离机制的实现基于锁机制和并发调度。其中并发调度使用的是MVVC(多版本并发控制),通过保存修改的旧版本信息来支持并发一致性读和回滚等特性。
|
||||
事务隔离机制的实现基于锁机制和并发调度。其中并发调度使用的是MVCC(多版本并发控制),通过行的创建时间和行的过期时间来支持并发一致性读和回滚等特性。
|
||||
|
||||
详细内容可以参考: [可能是最漂亮的Spring事务管理详解](https://blog.csdn.net/qq_34337272/article/details/80394121)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user