1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-08-01 16:28:03 +08:00

[docs fix]修正链接错误&基本类型和包装类型的区别

This commit is contained in:
Guide 2024-01-11 23:37:21 +08:00
parent a6cf71b9b5
commit b5f8894c70
5 changed files with 22 additions and 19 deletions

View File

@ -622,10 +622,7 @@ public class Solution {
**题目分析:** **题目分析:**
这道题想了半天没有思路,参考了 Alias 的答案,他的思路写的也很详细应该很容易看懂。 这道题想了半天没有思路,参考了 [Alias 的答案](https://www.nowcoder.com/questionTerminal/d77d11405cc7470d82554cb392585106),他的思路写的也很详细应该很容易看懂。
作者Alias
<https://www.nowcoder.com/questionTerminal/d77d11405cc7470d82554cb392585106>
来源:牛客网
【思路】借用一个辅助的栈,遍历压栈顺序,先讲第一个放入栈中,这里是 1然后判断栈顶元素是不是出栈顺序的第一个元素这里是 4很显然 1≠4所以我们继续压栈直到相等以后开始出栈出栈一个元素则将出栈顺序向后移动一位直到不相等这样循环等压栈顺序遍历完成如果辅助栈还不为空说明弹出序列不是该栈的弹出顺序。 【思路】借用一个辅助的栈,遍历压栈顺序,先讲第一个放入栈中,这里是 1然后判断栈顶元素是不是出栈顺序的第一个元素这里是 4很显然 1≠4所以我们继续压栈直到相等以后开始出栈出栈一个元素则将出栈顺序向后移动一位直到不相等这样循环等压栈顺序遍历完成如果辅助栈还不为空说明弹出序列不是该栈的弹出顺序。

View File

@ -452,11 +452,21 @@ Java 中有 8 种基本数据类型,分别为:
**为什么说是几乎所有对象实例都存在于堆中呢?** 这是因为 HotSpot 虚拟机引入了 JIT 优化之后,会对对象进行逃逸分析,如果发现某一个对象并没有逃逸到方法外部,那么就可能通过标量替换来实现栈上分配,而避免堆上分配内存 **为什么说是几乎所有对象实例都存在于堆中呢?** 这是因为 HotSpot 虚拟机引入了 JIT 优化之后,会对对象进行逃逸分析,如果发现某一个对象并没有逃逸到方法外部,那么就可能通过标量替换来实现栈上分配,而避免堆上分配内存
⚠️ 注意:**基本数据类型存放在栈中是一个常见的误区!** 基本数据类型的成员变量如果没有被 `static` 修饰的话(不建议这么使用,应该要使用基本数据类型对应的包装类型),就存放在堆中。 ⚠️ 注意:**基本数据类型存放在栈中是一个常见的误区!** 基本数据类型的存储位置取决于它们的作用域和声明方式。如果它们是局部变量,那么它们会存放在栈中;如果它们是成员变量,那么它们会存放在堆中。
```java ```java
class BasicTypeVar{ public class Test {
private int x; // 成员变量,存放在堆中
int a = 10;
// 被 static 修饰,也存放在堆中,但属于类,不属于对象
// JDK1.7 静态变量从永久代移动了 Java 堆中
static int b = 20;
public void method() {
// 局部变量,存放在栈中
int c = 30;
static int d = 40; // 编译错误,不能在方法中使用 static 修饰局部变量
}
} }
``` ```

View File

@ -431,8 +431,8 @@ public boolean equals(Object anObject) {
> ⚠️ 注意:该方法在 **Oracle OpenJDK8** 中默认是 "使用线程局部状态来实现 Marsaglia's xor-shift 随机数生成", 并不是 "地址" 或者 "地址转换而来", 不同 JDK/VM 可能不同在 **Oracle OpenJDK8** 中有六种生成方式 (其中第五种是返回地址), 通过添加 VM 参数: -XX:hashCode=4 启用第五种。参考源码: > ⚠️ 注意:该方法在 **Oracle OpenJDK8** 中默认是 "使用线程局部状态来实现 Marsaglia's xor-shift 随机数生成", 并不是 "地址" 或者 "地址转换而来", 不同 JDK/VM 可能不同在 **Oracle OpenJDK8** 中有六种生成方式 (其中第五种是返回地址), 通过添加 VM 参数: -XX:hashCode=4 启用第五种。参考源码:
> >
> - <https://hg.openjdk.org/jdk8u/jdk8u/hotspot/file/87ee5ee27509/src/share/vm/runtime/globals.hpp1127> 行) > - <https://hg.openjdk.org/jdk8u/jdk8u/hotspot/file/87ee5ee27509/src/share/vm/runtime/globals.hpp>1127 行)
> - <https://hg.openjdk.org/jdk8u/jdk8u/hotspot/file/87ee5ee27509/src/share/vm/runtime/synchronizer.cpp537> 行开始) > - <https://hg.openjdk.org/jdk8u/jdk8u/hotspot/file/87ee5ee27509/src/share/vm/runtime/synchronizer.cpp>537 行开始)
```java ```java
public native int hashCode(); public native int hashCode();

View File

@ -546,7 +546,7 @@ public E poll() {
//上锁 //上锁
lock.lock(); lock.lock();
try { try {
//如果队列为空直接返回null反之出队返回元素值 //如果队列为空直接返回null反之出队返回元素值
return (count == 0) ? null : dequeue(); return (count == 0) ? null : dequeue();
} finally { } finally {
lock.unlock(); lock.unlock();
@ -558,13 +558,12 @@ public E poll() {
```java ```java
public boolean add(E e) { public boolean add(E e) {
//调用下方的add
return super.add(e); return super.add(e);
} }
public boolean add(E e) { public boolean add(E e) {
//调用offer如果失败直接抛出异常 //调用offer方法如果失败直接抛出异常
if (offer(e)) if (offer(e))
return true; return true;
else else

View File

@ -91,33 +91,30 @@ ExecutorService threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSiz
**2、自己实现 `ThreadFactory`。** **2、自己实现 `ThreadFactory`。**
```java ```java
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
/** /**
* 线程工厂,它设置线程名称,有利于我们定位问题。 * 线程工厂,它设置线程名称,有利于我们定位问题。
*/ */
public final class NamingThreadFactory implements ThreadFactory { public final class NamingThreadFactory implements ThreadFactory {
private final AtomicInteger threadNum = new AtomicInteger(); private final AtomicInteger threadNum = new AtomicInteger();
private final ThreadFactory delegate;
private final String name; private final String name;
/** /**
* 创建一个带名字的线程池生产工厂 * 创建一个带名字的线程池生产工厂
*/ */
public NamingThreadFactory(ThreadFactory delegate, String name) { public NamingThreadFactory(String name) {
this.delegate = delegate; this.name = name;
this.name = name; // TODO consider uniquifying this
} }
@Override @Override
public Thread newThread(Runnable r) { public Thread newThread(Runnable r) {
Thread t = delegate.newThread(r); Thread t = new Thread(r);
t.setName(name + " [#" + threadNum.incrementAndGet() + "]"); t.setName(name + " [#" + threadNum.incrementAndGet() + "]");
return t; return t;
} }
} }
``` ```