Skip to content

Commit c754072

Browse files
committed
Update Java Notes
1 parent 9e01fb3 commit c754072

3 files changed

Lines changed: 1490 additions & 272 deletions

File tree

Java.md

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3990,7 +3990,7 @@ public class ArrayList<E> extends AbstractList<E>
39903990
}
39913991
```
39923992

3993-
指定索引插入,在旧数组上操作:
3993+
指定索引插入,**在旧数组上操作**
39943994

39953995
```java
39963996
public void add(int index, E element) {
@@ -4663,11 +4663,11 @@ HashMap继承关系如下图所示:
46634663
HashMap(int initialCapacity)//构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap
46644664
```
46654665

4666-
* 为什么必须是2的n次幂
4666+
* 为什么必须是 2 的 n 次幂
46674667

4668-
向HashMap中添加元素时,需要根据key的hash值,确定在数组中的具体位置。HashMap为了存取高效,要尽量较少碰撞,把数据尽可能分配均匀,每个链表长度大致相同,实现该方法的算法就是取模,hash%length,计算机中直接求余效率不如位移运算,所以源码中使用 hash&(length-1),实际上**hash % length == hash & (length-1)的前提是length是2的n次幂**
4668+
HashMap 中添加元素时,需要根据 key 的 hash 值,确定在数组中的具体位置。HashMap 为了存取高效,要尽量较少碰撞,把数据尽可能分配均匀,每个链表长度大致相同,实现该方法的算法就是取模,hash%length,计算机中直接求余效率不如位移运算,所以源码中使用 hash&(length-1),实际上**hash % length == hash & (length-1)的前提是 length 是 2 的n次幂**
46694669

4670-
散列平均分布:2的n次方是1后面n个0,2的n次方-1 是n个1,可以**保证散列的均匀性**,减少碰撞
4670+
散列平均分布:2 的 n 次方是 1 后面 n 个 0,2 的 n 次方 -1 是 n 个 1,可以**保证散列的均匀性**,减少碰撞
46714671

46724672
```java
46734673
例如长度为8时候,3&(8-1)=3 2&(8-1)=2 ,不同位置上,不碰撞;
@@ -4678,7 +4678,7 @@ HashMap继承关系如下图所示:
46784678

46794679
创建HashMap对象时,HashMap通过位移运算和或运算得到的肯定是2的幂次数,并且是大于那个数的最近的数字,底层采用tableSizeFor()方法
46804680

4681-
3. 默认的负载因子,默认值是0.75
4681+
3. 默认的负载因子,默认值是 0.75
46824682

46834683
```java
46844684
static final float DEFAULT_LOAD_FACTOR = 0.75f;
@@ -4691,10 +4691,10 @@ HashMap继承关系如下图所示:
46914691
static final int MAXIMUM_CAPACITY = 1 << 30;
46924692
```
46934693

4694-
最大容量为什么是2的30次方原因
4694+
最大容量为什么是 2 的 30 次方原因
46954695

4696-
* int类型是32位整型,占4个字节
4697-
* Java的原始类型里没有无符号类型,所以首位是符号位正数为0,负数为1
4696+
* int 类型是 32 位整型,占 4 个字节
4697+
* Java 的原始类型里没有无符号类型,所以首位是符号位正数为 0,负数为 1
46984698

46994699
5. 当链表的值超过8则会转红黑树(1.8新增**)
47004700

@@ -4703,9 +4703,9 @@ HashMap继承关系如下图所示:
47034703
static final int TREEIFY_THRESHOLD = 8;
47044704
```
47054705

4706-
为什么Map桶中节点个数大于8才转为红黑树
4706+
为什么 Map 桶中节点个数大于8才转为红黑树
47074707

4708-
* 在HashMap中有一段注释说明:**空间和时间的权衡**
4708+
* 在 HashMap 中有一段注释说明:**空间和时间的权衡**
47094709

47104710
```java
47114711
TreeNodes占用空间大约是普通节点的两倍,所以我们只在箱子包含足够的节点时才使用树节点。当节点变少(由于删除或调整大小)时,就会被转换回普通的桶。在使用分布良好的用户hashcode时,很少使用树箱。理想情况下,在随机哈希码下,箱子中节点的频率服从"泊松分布",默认调整阈值为0.75,平均参数约为0.5,尽管由于调整粒度的差异很大。忽略方差,列表大小k的预期出现次数是(exp(-0.5)*pow(0.5, k)/factorial(k))
@@ -4723,18 +4723,16 @@ HashMap继承关系如下图所示:
47234723
```
47244724

47254725
* 其他说法
4726-
红黑树的平均查找长度是log(n),如果长度为8,平均查找长度为log(8)=3,链表的平均查找长度为n/2,当长度为8时,平均查找长度为8/2=4,这才有转换成树的必要;链表长度如果是小于等于6,6/2=3,而log(6)=2.6,虽然速度也很快的,但转化为树结构和生成树的时间并不短
4726+
红黑树的平均查找长度是 log(n),如果长度为 8,平均查找长度为 log(8)=3,链表的平均查找长度为 n/2,当长度为 8 时,平均查找长度为 8/2=4,这才有转换成树的必要;链表长度如果是小于等于 6,6/2=3,而 log(6)=2.6,虽然速度也很快的,但转化为树结构和生成树的时间并不短
47274727

4728-
4729-
4730-
6. 当链表的值小于6则会从红黑树转回链表
4728+
6. 当链表的值小 于6 则会从红黑树转回链表
47314729

47324730
```java
47334731
//当桶(bucket)上的结点数小于这个值时树转链表
47344732
static final int UNTREEIFY_THRESHOLD = 6;
47354733
```
47364734

4737-
7. 当Map里面的数量**大于等于**这个阈值时,表中的桶才能进行树形化 ,否则桶内元素太多时会扩容,而不是树形化。为了避免进行扩容、树形化选择的冲突,这个值不能小于 4 * TREEIFY_THRESHOLD (8)
4735+
7. 当 Map 里面的数量**大于等于**这个阈值时,表中的桶才能进行树形化 ,否则桶内元素太多时会扩容,而不是树形化。为了避免进行扩容、树形化选择的冲突,这个值不能小于 4 * TREEIFY_THRESHOLD (8)
47384736

47394737
```java
47404738
//桶中结构转化为红黑树对应的数组长度最小的值
@@ -12373,7 +12371,7 @@ Java 语言:跨平台的语言(write once ,run anywhere)
1237312371

1237412372
#### 语言发展
1237512373

12376-
机器码:各种用二进制编码方式表示的指令,与CPU紧密相关,所以不同种类的CPU对应的机器指令不同
12374+
机器码:各种用二进制编码方式表示的指令,与 CPU 紧密相关,所以不同种类的 CPU 对应的机器指令不同
1237712375

1237812376
指令:指令就是把机器码中特定的0和1序列,简化成对应的指令,例如mov,inc等,可读性稍好,但是不同的硬件平台的同一种指令(比如mov),对应的机器码也可能不同
1237912377

0 commit comments

Comments
 (0)