From 29028809cb4d172fa86d0c7dd2353ed47e63174c Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Tue, 16 Apr 2019 18:23:22 +0800 Subject: [PATCH 1/3] =?UTF-8?q?Update=20Java=E5=9F=BA=E7=A1=80=E7=9F=A5?= =?UTF-8?q?=E8=AF=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/java/Java基础知识.md | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/docs/java/Java基础知识.md b/docs/java/Java基础知识.md index c7d57e34..835f9c71 100644 --- a/docs/java/Java基础知识.md +++ b/docs/java/Java基础知识.md @@ -50,7 +50,7 @@ - [33 Java序列化中如果有些字段不想进行序列化 怎么办](#33-java序列化中如果有些字段不想进行序列化-怎么办) - [34 获取用键盘输入常用的的两种方法](#34-获取用键盘输入常用的的两种方法) - [参考](#参考) - +- [公众号](#公众号) @@ -233,7 +233,7 @@ String 中的对象是不可变的,也就可以理解为常量,线程安全 由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。 ## 15. 在 Java 中定义一个不做事且没有参数的构造方法的作用 - Java 程序在执行子类的构造方法之前,如果没有用 super() 来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 super() 来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。 +Java 程序在执行子类的构造方法之前,如果没有用 super() 来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 super() 来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。   ## 16. import java和javax有什么区别? @@ -338,12 +338,9 @@ hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返 ### 为什么要有 hashCode +**我们先以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:** 当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 `equals()`方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的Java启蒙书《Head first java》第二版)。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。 -**我们以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:** - -当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的Java启蒙书《Head first java》第二版)。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。 - - +通过我们可以看出:`hashCode()` 的作用就是**获取哈希码**,也称为散列码;它实际上是返回一个int整数。这个**哈希码的作用**是确定该对象在哈希表中的索引位置。**`hashCode() `在散列表中才有用,在其它情况下没用。**在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。 ### hashCode()与equals()的相关规定 @@ -353,6 +350,8 @@ hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返 4. **因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖** 5. hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据) +推荐阅读:[Java hashCode() 和 equals()的若干问题解答](https://www.cnblogs.com/skywang12345/p/3324958.html) + ## 28. 为什么Java中只有值传递? @@ -473,3 +472,13 @@ String s = input.readLine(); - https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre - https://www.educba.com/oracle-vs-openjdk/ - https://stackoverflow.com/questions/22358071/differences-between-oracle-jdk-and-openjdk?answertab=active#tab-top + +## 公众号 + +如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。 + +**《Java面试突击》:** 由本文档衍生的专为面试而生的《Java面试突击》V2.0 PDF 版本[公众号](#公众号)后台回复 **"Java面试突击"** 即可免费领取! + +**Java工程师必备学习资源:** 一些Java工程师常用学习资源公众号后台回复关键字 **“1”** 即可免费无套路获取。 + +![我的公众号](https://user-gold-cdn.xitu.io/2018/11/28/167598cd2e17b8ec?w=258&h=258&f=jpeg&s=27334) \ No newline at end of file From 32456ca43e057686499cd439fd97c72b3204edf8 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Tue, 16 Apr 2019 18:33:37 +0800 Subject: [PATCH 2/3] Fix link error --- docs/system-design/framework/ZooKeeper.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/system-design/framework/ZooKeeper.md b/docs/system-design/framework/ZooKeeper.md index fa6d2b65..aa97a456 100644 --- a/docs/system-design/framework/ZooKeeper.md +++ b/docs/system-design/framework/ZooKeeper.md @@ -165,8 +165,8 @@ ZAB协议包括两种基本的模式,分别是 **崩溃恢复和消息广播** 关于 **ZAB 协议&Paxos算法** 需要讲和理解的东西太多了,说实话,笔主到现在不太清楚这俩兄弟的具体原理和实现过程。推荐阅读下面两篇文章: -- [图解 Paxos 一致性协议](http://blog.xiaohansong.com/2016/09/30/Paxos/) -- [Zookeeper ZAB 协议分析](http://blog.xiaohansong.com/2016/08/25/zab/) +- [图解 Paxos 一致性协议](http://codemacro.com/2014/10/15/explain-poxos/) +- [Zookeeper ZAB 协议分析](https://dbaplus.cn/news-141-1875-1.html) 关于如何使用 zookeeper 实现分布式锁,可以查看下面这篇文章: From ce9c4417cbfa8168c341a6f15dba2e7e11c816d2 Mon Sep 17 00:00:00 2001 From: lancelot Date: Tue, 16 Apr 2019 21:29:50 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=B9=B6=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Basis/Arrays,CollectionsCommonMethods.md | 44 ++++++++++--------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/docs/java/Basis/Arrays,CollectionsCommonMethods.md b/docs/java/Basis/Arrays,CollectionsCommonMethods.md index f3b97c5e..d49f3ce9 100644 --- a/docs/java/Basis/Arrays,CollectionsCommonMethods.md +++ b/docs/java/Basis/Arrays,CollectionsCommonMethods.md @@ -54,12 +54,12 @@ void rotate(List list, int distance)//旋转。当distance为正数时,将list Collections.reverse(arrayList); System.out.println("Collections.reverse(arrayList):"); System.out.println(arrayList); - - + + Collections.rotate(arrayList, 4); System.out.println("Collections.rotate(arrayList, 4):"); System.out.println(arrayList); - + // void sort(List list),按自然排序的升序排序 Collections.sort(arrayList); System.out.println("Collections.sort(arrayList):"); @@ -69,7 +69,7 @@ void rotate(List list, int distance)//旋转。当distance为正数时,将list Collections.shuffle(arrayList); System.out.println("Collections.shuffle(arrayList):"); System.out.println(arrayList); - + // void swap(List list, int i , int j),交换两个索引位置的元素 Collections.swap(arrayList, 2, 5); System.out.println("Collections.swap(arrayList, 2, 5):"); @@ -93,7 +93,7 @@ void rotate(List list, int distance)//旋转。当distance为正数时,将list int binarySearch(List list, Object key)//对List进行二分查找,返回索引,注意List必须是有序的 int max(Collection coll)//根据元素的自然顺序,返回最大的元素。 类比int min(Collection coll) int max(Collection coll, Comparator c)//根据定制排序,返回最大元素,排序规则由Comparatator类控制。类比int min(Collection coll, Comparator c) -void fill(List list, Object obj)//用指定的元素代替指定list中的所有元素。 +void fill(List list, Object obj)//用指定的元素代替指定list中的所有元素。 int frequency(Collection c, Object o)//统计元素出现次数 int indexOfSubList(List list, List target)//统计target在list中第一次出现的索引,找不到则返回-1,类比int lastIndexOfSubList(List source, list target). boolean replaceAll(List list, Object oldVal, Object newVal), 用新元素替换旧元素 @@ -152,9 +152,9 @@ Collectons提供了多个`synchronizedXxx()`方法·,该方法可以将指定 ```java synchronizedCollection(Collection c) //返回指定 collection 支持的同步(线程安全的)collection。 -synchronizedList(List list)//返回指定列表支持的同步(线程安全的)List。 +synchronizedList(List list)//返回指定列表支持的同步(线程安全的)List。 synchronizedMap(Map m) //返回由指定映射支持的同步(线程安全的)Map。 -synchronizedSet(Set s) //返回指定 set 支持的同步(线程安全的)set。 +synchronizedSet(Set s) //返回指定 set 支持的同步(线程安全的)set。 ``` ### Collections还可以设置不可变集合,提供了如下三类方法: @@ -224,7 +224,7 @@ unmodifiableXxx(): 返回指定集合对象的不可变视图,此处的集合 4. 填充 : `fill()` 5. 转列表: `asList()` 6. 转字符串 : `toString()` -7. +7. ### 排序 : `sort()` @@ -251,7 +251,7 @@ unmodifiableXxx(): 返回指定集合对象的不可变视图,此处的集合 System.out.println(); int c[] = { 1, 3, 2, 7, 6, 5, 4, 9 }; - // parallelSort(int[] a) 按照数字顺序排列指定的数组。同sort方法一样也有按范围的排序 + // parallelSort(int[] a) 按照数字顺序排列指定的数组(并行的)。同sort方法一样也有按范围的排序 Arrays.parallelSort(c); System.out.println("Arrays.parallelSort(c):"); for (int i : c) { @@ -285,6 +285,9 @@ System.out.println(Arrays.toString(strs));//[abcdeag, abcdefg, abcdehg] ```java // *************查找 binarySearch()**************** char[] e = { 'a', 'f', 'b', 'c', 'e', 'A', 'C', 'B' }; + // 排序后再进行二分查找,否则找不到 + Arrays.sort(e); + System.out.println("Arrays.sort(e)" + Arrays.toString(e)); System.out.println("Arrays.binarySearch(e, 'c'):"); int s = Arrays.binarySearch(e, 'c'); System.out.println("字符c在数组的位置:" + s); @@ -293,12 +296,12 @@ System.out.println(Arrays.toString(strs));//[abcdeag, abcdefg, abcdehg] ### 比较: `equals()` ```java - // *************比较 equals**************** - char[] e = { 'a', 'f', 'b', 'c', 'e', 'A', 'C', 'B' }; + // *************比较 equals**************** + char[] e = { 'a', 'f', 'b', 'c', 'e', 'A', 'C', 'B' }; char[] f = { 'a', 'f', 'b', 'c', 'e', 'A', 'C', 'B' }; /* - * 元素数量相同,并且相同位置的元素相同。 另外,如果两个数组引用都是null,则它们被认为是相等的 。 - */ + * 元素数量相同,并且相同位置的元素相同。 另外,如果两个数组引用都是null,则它们被认为是相等的 。 + */ // 输出true System.out.println("Arrays.equals(e, f):" + Arrays.equals(e, f)); ``` @@ -345,12 +348,12 @@ System.out.println(Arrays.toString(strs));//[abcdeag, abcdefg, abcdehg] ### 转字符串 `toString()` ```java - // *************转字符串 toString()**************** - /* - * 返回指定数组的内容的字符串表示形式。 - */ - char[] k = { 'a', 'f', 'b', 'c', 'e', 'A', 'C', 'B' }; - System.out.println(Arrays.toString(k));// [a, f, b, c, e, A, C, B] + // *************转字符串 toString()**************** + /* + * 返回指定数组的内容的字符串表示形式。 + */ + char[] k = { 'a', 'f', 'b', 'c', 'e', 'A', 'C', 'B' }; + System.out.println(Arrays.toString(k));// [a, f, b, c, e, A, C, B] ``` ### 复制 `copyOf()` @@ -358,7 +361,7 @@ System.out.println(Arrays.toString(strs));//[abcdeag, abcdefg, abcdehg] ```java // *************复制 copy**************** // copyOf 方法实现数组复制,h为数组,6为复制的长度 - int[] h = { 1, 2, 3, 3, 3, 3, 6, 6, 6, }; + int[] h = { 1, 2, 3, 3, 3, 3, 6, 6, 6, }; int i[] = Arrays.copyOf(h, 6); System.out.println("Arrays.copyOf(h, 6);:"); // 输出结果:123333 @@ -377,4 +380,3 @@ System.out.println(Arrays.toString(strs));//[abcdeag, abcdefg, abcdehg] // 换行 System.out.println(); ``` -