提交 41a4fdf0 编写于 作者: S Snailclimb

Merge branch 'master' of https://github.com/Snailclimb/Java_Guide

......@@ -54,7 +54,7 @@
```
细心的同学一定会发现 :**以无参数构造方法创建 ArrayList 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为10。** 下面在我们分析 ArrayList 扩容时会到这一点内容!
细心的同学一定会发现 :**以无参数构造方法创建 ArrayList 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为10。** 下面在我们分析 ArrayList 扩容时会到这一点内容!
## 二 一步一步分析 ArrayList 扩容机制
......@@ -308,7 +308,7 @@ ArrayList 源码中有一个 `ensureCapacity` 方法不知道大家注意到没
```
**最好在 add 大量元素之前用 `ensureCapacity` 方法,以减少增量新分配的次数**
**最好在 add 大量元素之前用 `ensureCapacity` 方法,以减少增量新分配的次数**
我们通过下面的代码实际测试以下这个方法的效果:
......@@ -344,4 +344,4 @@ public class EnsureCapacityTest {
```
通过运行结果,我们可以很明显的看出向 ArrayList 添加大量元素之前最好先使用`ensureCapacity` 方法,以减少增量新分配的次数
通过运行结果,我们可以很明显的看出向 ArrayList 添加大量元素之前最好先使用`ensureCapacity` 方法,以减少增量新分配的次数
......@@ -90,13 +90,13 @@ public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneabl
transient int modCount;
// 临界值 当实际大小(容量*填充因子)超过临界值时,会进行扩容
int threshold;
// 填充因子
// 加载因子
final float loadFactor;
}
```
- **loadFactor加载因子**
loadFactor加载因子是控制数组存放数据的疏密程度,loadFactor越趋近于1,那么 数组中存放的数据(entry)也就越多,也就越密,也就是会让链表的长度增加,load Factor越小,也就是趋近于0,
loadFactor加载因子是控制数组存放数据的疏密程度,loadFactor越趋近于1,那么 数组中存放的数据(entry)也就越多,也就越密,也就是会让链表的长度增加,loadFactor越小,也就是趋近于0,数组中存放的数据(entry)也就越少,也就越稀疏。
**loadFactor太大导致查找元素效率低,太小导致数组的利用率低,存放的数据会很分散。loadFactor的默认值为0.75f是官方给出的一个比较好的临界值**
......@@ -401,7 +401,7 @@ final Node<K,V>[] resize() {
else if (oldThr > 0) // initial capacity was placed in threshold
newCap = oldThr;
else {
signifies using defaults
// signifies using defaults
newCap = DEFAULT_INITIAL_CAPACITY;
newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);
}
......
......@@ -98,7 +98,7 @@ Form标签里的method的属性为get时调用doGet(),为post时调用doPost()
```java
request.getRequestDispatcher("login_success.jsp").forward(request, response);
```
**重定向(Redirect)** 是利用服务器返回的状态来实现的。客户端浏览器请求服务器的时候,服务器会返回一个状态码。服务器通过HttpServletRequestResponse的setStatus(int status)方法设置状态码。如果服务器返回301或者302,则浏览器会到新的网址重新请求该资源。
**重定向(Redirect)** 是利用服务器返回的状态来实现的。客户端浏览器请求服务器的时候,服务器会返回一个状态码。服务器通过HttpServletRequestResponse的setStatus(int status)方法设置状态码。如果服务器返回301或者302,则浏览器会到新的网址重新请求该资源。
1. **从地址栏显示来说**
......
......@@ -21,7 +21,7 @@
- [继承](#继承)
- [多态](#多态)
- [12. String StringBuffer 和 StringBuilder 的区别是什么 String 为什么是不可变的](#12-string-stringbuffer-和-stringbuilder-的区别是什么-string-为什么是不可变的)
- [13. 自动装箱与拆箱](#13-自动装箱与拆箱)
- [13. 自动装箱与拆箱](#13-自动装箱与拆箱)
- [14. 在一个静态方法内调用一个非静态成员为什么是非法的](#14-在一个静态方法内调用一个非静态成员为什么是非法的)
- [15. 在 Java 中定义一个不做事且没有参数的构造方法的作用](#15-在-java-中定义一个不做事且没有参数的构造方法的作用)
- [16. import java和javax有什么区别](#16-import-java和javax有什么区别)
......@@ -32,15 +32,15 @@
- [21. 一个类的构造方法的作用是什么 若一个类没有声明构造方法,该程序能正确执行吗 ?为什么?](#21-一个类的构造方法的作用是什么-若一个类没有声明构造方法该程序能正确执行吗-为什么)
- [22. 构造方法有哪些特性](#22-构造方法有哪些特性)
- [23. 静态方法和实例方法有何不同](#23-静态方法和实例方法有何不同)
- [24. 对象的相等与指向他们的引用相等,两者有什么不同?](#24-对象的相等与指向他们的引用相等,两者有什么不同?)
- [25. 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?](#25-在调用子类构造方法之前会先调用父类没有参数的构造方法其目的是)
- [24. 对象的相等与指向他们的引用相等,两者有什么不同?](#24-对象的相等与指向他们的引用相等两者有什么不同)
- [25. 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?](#25-在调用子类构造方法之前会先调用父类没有参数的构造方法其目的是)
- [26. == 与 equals\(重要\)](#26--与-equals重要)
- [27. hashCode 与 equals(重要)](#27-hashcode-与-equals(重要))
- [27. hashCode 与 equals \(重要\)](#27-hashcode-与-equals-重要)
- [hashCode()介绍](#hashcode()介绍)
- [为什么要有 hashCode](#为什么要有-hashcode)
- [hashCode()与equals()的相关规定](#hashcode()与equals()的相关规定)
- [28. 为什么Java中只有值传递](#28-为什么java中只有值传递)
- [29. 简述线程,程序、进程的基本概念。以及他们之间关系是什么](#29-简述线程,程序、进程的基本概念。以及他们之间关系是什么)
- [29. 简述线程,程序、进程的基本概念。以及他们之间关系是什么](#29-简述线程程序进程的基本概念以及他们之间关系是什么)
- [30. 线程有哪些基本状态?](#30-线程有哪些基本状态)
- [31 关于 final 关键字的一些总结](#31-关于-final-关键字的一些总结)
- [32 Java 中的异常处理](#32-java-中的异常处理)
......@@ -223,7 +223,7 @@ String 中的对象是不可变的,也就可以理解为常量,线程安全
2. 单线程操作字符串缓冲区下操作大量数据 = StringBuilder
3. 多线程操作字符串缓冲区下操作大量数据 = StringBuffer
## 13. 自动装箱与拆箱
## 13. 自动装箱与拆箱
**装箱**:将基本类型用它们对应的引用类型包装起来;
**拆箱**:将包装类型转换为基本数据类型;
......@@ -241,7 +241,7 @@ String 中的对象是不可变的,也就可以理解为常量,线程安全
所以,实际上java和javax没有区别。这都是一个名字。
## 17. 接口和抽象类的区别是什么
## 17. 接口和抽象类的区别是什么
1. 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),抽象类可以有非抽象的方法
2. 接口中的实例变量默认是 final 类型的,而抽象类中则不一定
......@@ -249,7 +249,9 @@ String 中的对象是不可变的,也就可以理解为常量,线程安全
4. 一个类实现接口的话要实现接口的所有方法,而抽象类不一定
5. 接口不能用 new 实例化,但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
## 18. 成员变量与局部变量的区别有那些
备注:在JDK8中,接口也可以定义静态方法,可以直接用接口名调用。实现类和实现是不可以调用的。如果同时实现两个接口,接口中定义了一样的默认方法,必须重写,不然会报错。(详见issue:[https://github.com/Snailclimb/JavaGuide/issues/146](https://github.com/Snailclimb/JavaGuide/issues/146))
## 18. 成员变量与局部变量的区别有那些
1. 从语法形式上,看成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰;
2. 从变量在内存中的存储方式来看,成员变量是对象的一部分,而对象存在于堆内存,局部变量存在于栈内存
......@@ -280,15 +282,15 @@ new运算符,new创建对象实例(对象实例在堆内存中),对象
2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制.
## 24. 对象的相等与指向他们的引用相等,两者有什么不同?
## 24. 对象的相等与指向他们的引用相等,两者有什么不同?
对象的相等,比的是内存中存放的内容是否相等。而引用相等,比较的是他们指向的内存地址是否相等。
## 25. 在调用子类构造方法之前会先调用父类没有参数的构造方法其目的是?
## 25. 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?
帮助子类做初始化工作。
## 26. == 与 equals(重要)
## 26. == 与 equals(重要)
**==** : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)
......@@ -325,7 +327,7 @@ public class test1 {
## 27. hashCode 与 equals(重要)
## 27. hashCode 与 equals (重要)
面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?”
......@@ -357,7 +359,7 @@ hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返
[为什么Java中只有值传递?](https://github.com/Snailclimb/Java-Guide/blob/master/%E9%9D%A2%E8%AF%95%E5%BF%85%E5%A4%87/%E6%9C%80%E6%9C%80%E6%9C%80%E5%B8%B8%E8%A7%81%E7%9A%84Java%E9%9D%A2%E8%AF%95%E9%A2%98%E6%80%BB%E7%BB%93/%E7%AC%AC%E4%B8%80%E5%91%A8%EF%BC%882018-8-7%EF%BC%89.md)
## 29. 简述线程,程序、进程的基本概念。以及他们之间关系是什么
## 29. 简述线程,程序,进程的基本概念.以及他们之间关系是什么?
**线程**与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
......
......@@ -20,7 +20,7 @@
- [Java/J2EE 基础](#javaj2ee-基础)
- [Java 集合框架](#java-集合框架)
- [Java 多线程](#java-多线程)
- [Java IO 与 NIO](#java-io-与-nio)
- [Java BIO,NIO,AIO](#java-bionioaio)
- [Java 虚拟机 jvm](#java-虚拟机-jvm)
- [:open_file_folder: 数据结构与算法](#open_file_folder-数据结构与算法)
- [数据结构](#数据结构)
......@@ -43,14 +43,13 @@
- [Java学习/面试开源仓库推荐](#java学习面试开源仓库推荐)
- [:art: 闲谈](#art-闲谈)
- [:envelope: 说明](#envelope-说明)
- [项目介绍](#项目介绍)
- [关于转载](#关于转载)
- [如何对该开源文档进行贡献](#如何对该开源文档进行贡献)
- [为什么要做这个开源文档?](#为什么要做这个开源文档)
- [最后](#最后)
- [我的微信](#我的微信)
- [福利](#福利)
- [公众号](#公众号)
## 待办
- [ ] Java 8 新特性总结
- [x] BIO,NIO,AIO 总结
- [ ] Netty 总结
## :coffee: Java
......@@ -86,8 +85,9 @@
* [《深入理解Java虚拟机》第2版学习笔记](https://github.com/Snailclimb/Java_Guide/blob/master/Java相关/Java虚拟机(jvm).md)
### Java IO 与 NIO
### Java BIO,NIO,AIO
* [BIO,NIO,AIO 总结 ](https://github.com/Snailclimb/JavaGuide/blob/master/Java%E7%9B%B8%E5%85%B3/BIO%2CNIO%2CAIO%20summary.md)
* [Java IO 与 NIO系列文章](https://github.com/Snailclimb/Java_Guide/blob/master/Java相关/Java%20IO与NIO.md)
### 设计模式
......
......@@ -47,7 +47,7 @@ Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去
  **MyISAM:** B+Tree叶节点的data域存放的是数据记录的地址。在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其 data 域的值,然后以 data 域的值为地址读取相应的数据记录。这被称为“非聚簇索引”。
  **InnoDB:** 其数据文件本身就是索引文件。相比MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这被称为“聚簇索引(或聚集索引)”。而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址,这也是和MyISAM不同的地方。**在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,走一遍主索引。** **因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。** PS:整理自《Java工程师修炼之道》
  **InnoDB:** 其数据文件本身就是索引文件。相比MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这被称为“聚簇索引(或聚集索引)”。而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址,这也是和MyISAM不同的地方。**在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,走一遍主索引。** **因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。** PS:整理自《Java工程师修炼之道》
详细内容可以参考:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册