commit
28c43f481d
|
@ -269,7 +269,7 @@ set.add(e2);
|
|||
System.out.println(set.size()); // 2
|
||||
```
|
||||
|
||||
理想的散列函数应当具有均匀性,即不相等的实例应当均匀分不到所有可能的散列值上。这就要求了散列函数要把所有域的值都考虑进来,可以将每个域都当成 R 进制的某一位,然后组成一个 R 进制的整数。R 一般取 31,因为它是一个奇素数,如果是偶数的话,当出现乘法溢出,信息就会丢失,因为与 2 相乘相当于向左移一位。
|
||||
理想的散列函数应当具有均匀性,即不相等的实例应当均匀分布到所有可能的散列值上。这就要求了散列函数要把所有域的值都考虑进来,可以将每个域都当成 R 进制的某一位,然后组成一个 R 进制的整数。R 一般取 31,因为它是一个奇素数,如果是偶数的话,当出现乘法溢出,信息就会丢失,因为与 2 相乘相当于向左移一位。
|
||||
|
||||
一个数与 31 相乘可以转换成移位和减法:31\*x == (x<<5)-x。
|
||||
|
||||
|
@ -506,7 +506,7 @@ protected 用于修饰成员,表示在继承体系中成员对于子类可见
|
|||
|
||||
设计良好的模块会隐藏所有的实现细节,把它的 API 与它的实现清晰地隔离开来。模块之间只通过它们的 API 进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念被称为信息隐藏或封装。因此访问权限应当尽可能地使每个类或者成员不被外界访问。
|
||||
|
||||
如果子类的方法覆盖了父类的方法,那么子类中该方法的访问级别不允许低于父类的访问级别。这是为了确保可以使用父类实例的地方都可以使用子类实例,也就是确保满足里式替换原则。
|
||||
如果子类的方法覆盖了父类的方法,那么子类中该方法的访问级别不允许低于父类的访问级别。这是为了确保可以使用父类实例的地方都可以使用子类实例,也就是确保满足里氏替换原则。
|
||||
|
||||
字段决不能是公有的,因为这么做的话就失去了对这个字段修改行为的控制,客户端可以对其随意修改。可以使用公有的 getter 和 setter 方法来替换公有字段。
|
||||
|
||||
|
|
|
@ -715,10 +715,10 @@ java.util.concurrent(J.U.C)大大提高了并发性能,AQS 被认为是 J.
|
|||
public class CountdownLatchExample {
|
||||
|
||||
public static void main(String[] args) throws InterruptedException {
|
||||
final int totalTread = 10;
|
||||
CountDownLatch countDownLatch = new CountDownLatch(totalTread);
|
||||
final int totalThread = 10;
|
||||
CountDownLatch countDownLatch = new CountDownLatch(totalThread);
|
||||
ExecutorService executorService = Executors.newCachedThreadPool();
|
||||
for (int i = 0; i < totalTread; i++) {
|
||||
for (int i = 0; i < totalThread; i++) {
|
||||
executorService.execute(() -> {
|
||||
System.out.print("run..");
|
||||
countDownLatch.countDown();
|
||||
|
@ -749,10 +749,10 @@ run..run..run..run..run..run..run..run..run..run..end
|
|||
public class CyclicBarrierExample {
|
||||
|
||||
public static void main(String[] args) throws InterruptedException {
|
||||
final int totalTread = 10;
|
||||
CyclicBarrier cyclicBarrier = new CyclicBarrier(totalTread);
|
||||
final int totalThread = 10;
|
||||
CyclicBarrier cyclicBarrier = new CyclicBarrier(totalThread);
|
||||
ExecutorService executorService = Executors.newCachedThreadPool();
|
||||
for (int i = 0; i < totalTread; i++) {
|
||||
for (int i = 0; i < totalThread; i++) {
|
||||
executorService.execute(() -> {
|
||||
System.out.print("before..");
|
||||
try {
|
||||
|
@ -1507,7 +1507,7 @@ public class ThreadLocalExample1 {
|
|||
|
||||
<div align="center"> <img src="../pics//3646544a-cb57-451d-9e03-d3c4f5e4434a.png" width=""/> </div><br>
|
||||
|
||||
每个 Thread 都有一个 TreadLocal.ThreadLocalMap 对象,Thread 类中就定义了 ThreadLocal.ThreadLocalMap 成员。
|
||||
每个 Thread 都有一个 ThreadLocal.ThreadLocalMap 对象,Thread 类中就定义了 ThreadLocal.ThreadLocalMap 成员。
|
||||
|
||||
```java
|
||||
/* ThreadLocal values pertaining to this thread. This map is maintained
|
||||
|
|
|
@ -123,7 +123,7 @@ objB.instance = objA;
|
|||
|
||||
### 2. 可达性
|
||||
|
||||
通过 GC Roots 作为起始点进行搜索,能够到达到的对象都是都是可用的,不可达的对象可被回收。
|
||||
通过 GC Roots 作为起始点进行搜索,能够到达到的对象都是可用的,不可达的对象可被回收。
|
||||
|
||||
<div align="center"> <img src="../pics//0635cbe8.png" width=""/> </div><br>
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user