diff --git a/docs/cs-basics/algorithms/the-sword-refers-to-offer.md b/docs/cs-basics/algorithms/the-sword-refers-to-offer.md index 37d24cfd..73d296d0 100644 --- a/docs/cs-basics/algorithms/the-sword-refers-to-offer.md +++ b/docs/cs-basics/algorithms/the-sword-refers-to-offer.md @@ -622,10 +622,7 @@ public class Solution { **题目分析:** -这道题想了半天没有思路,参考了 Alias 的答案,他的思路写的也很详细应该很容易看懂。 -作者:Alias - -来源:牛客网 +这道题想了半天没有思路,参考了 [Alias 的答案](https://www.nowcoder.com/questionTerminal/d77d11405cc7470d82554cb392585106),他的思路写的也很详细应该很容易看懂。 【思路】借用一个辅助的栈,遍历压栈顺序,先讲第一个放入栈中,这里是 1,然后判断栈顶元素是不是出栈顺序的第一个元素,这里是 4,很显然 1≠4,所以我们继续压栈,直到相等以后开始出栈,出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。 diff --git a/docs/java/basis/java-basic-questions-01.md b/docs/java/basis/java-basic-questions-01.md index 4dc9ee6e..201a80ab 100644 --- a/docs/java/basis/java-basic-questions-01.md +++ b/docs/java/basis/java-basic-questions-01.md @@ -452,11 +452,21 @@ Java 中有 8 种基本数据类型,分别为: **为什么说是几乎所有对象实例都存在于堆中呢?** 这是因为 HotSpot 虚拟机引入了 JIT 优化之后,会对对象进行逃逸分析,如果发现某一个对象并没有逃逸到方法外部,那么就可能通过标量替换来实现栈上分配,而避免堆上分配内存 -⚠️ 注意:**基本数据类型存放在栈中是一个常见的误区!** 基本数据类型的成员变量如果没有被 `static` 修饰的话(不建议这么使用,应该要使用基本数据类型对应的包装类型),就存放在堆中。 +⚠️ 注意:**基本数据类型存放在栈中是一个常见的误区!** 基本数据类型的存储位置取决于它们的作用域和声明方式。如果它们是局部变量,那么它们会存放在栈中;如果它们是成员变量,那么它们会存放在堆中。 ```java -class BasicTypeVar{ - private int x; +public class Test { + // 成员变量,存放在堆中 + int a = 10; + // 被 static 修饰,也存放在堆中,但属于类,不属于对象 + // JDK1.7 静态变量从永久代移动了 Java 堆中 + static int b = 20; + + public void method() { + // 局部变量,存放在栈中 + int c = 30; + static int d = 40; // 编译错误,不能在方法中使用 static 修饰局部变量 + } } ``` diff --git a/docs/java/basis/java-basic-questions-02.md b/docs/java/basis/java-basic-questions-02.md index b3a95e4c..c6085b5d 100644 --- a/docs/java/basis/java-basic-questions-02.md +++ b/docs/java/basis/java-basic-questions-02.md @@ -431,8 +431,8 @@ public boolean equals(Object anObject) { > ⚠️ 注意:该方法在 **Oracle OpenJDK8** 中默认是 "使用线程局部状态来实现 Marsaglia's xor-shift 随机数生成", 并不是 "地址" 或者 "地址转换而来", 不同 JDK/VM 可能不同在 **Oracle OpenJDK8** 中有六种生成方式 (其中第五种是返回地址), 通过添加 VM 参数: -XX:hashCode=4 启用第五种。参考源码: > -> - 行) -> - 行开始) +> - (1127 行) +> - (537 行开始) ```java public native int hashCode(); diff --git a/docs/java/collection/arrayblockingqueue-source-code.md b/docs/java/collection/arrayblockingqueue-source-code.md index 2c76c138..a1c68973 100644 --- a/docs/java/collection/arrayblockingqueue-source-code.md +++ b/docs/java/collection/arrayblockingqueue-source-code.md @@ -546,7 +546,7 @@ public E poll() { //上锁 lock.lock(); try { - //如果队列为空直接返回null,反之出队返回元素值 + //如果队列为空直接返回null,反之出队返回元素值 return (count == 0) ? null : dequeue(); } finally { lock.unlock(); @@ -558,13 +558,12 @@ public E poll() { ```java public boolean add(E e) { - //调用下方的add return super.add(e); } public boolean add(E e) { - //调用offer如果失败直接抛出异常 + //调用offer方法如果失败直接抛出异常 if (offer(e)) return true; else diff --git a/docs/java/concurrent/java-thread-pool-best-practices.md b/docs/java/concurrent/java-thread-pool-best-practices.md index c62020d7..62b2475e 100644 --- a/docs/java/concurrent/java-thread-pool-best-practices.md +++ b/docs/java/concurrent/java-thread-pool-best-practices.md @@ -91,33 +91,30 @@ ExecutorService threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSiz **2、自己实现 `ThreadFactory`。** ```java -import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; + /** * 线程工厂,它设置线程名称,有利于我们定位问题。 */ public final class NamingThreadFactory implements ThreadFactory { private final AtomicInteger threadNum = new AtomicInteger(); - private final ThreadFactory delegate; private final String name; /** * 创建一个带名字的线程池生产工厂 */ - public NamingThreadFactory(ThreadFactory delegate, String name) { - this.delegate = delegate; - this.name = name; // TODO consider uniquifying this + public NamingThreadFactory(String name) { + this.name = name; } @Override public Thread newThread(Runnable r) { - Thread t = delegate.newThread(r); + Thread t = new Thread(r); t.setName(name + " [#" + threadNum.incrementAndGet() + "]"); return t; } - } ```