mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-08-01 16:28:03 +08:00
[docs fix]修正链接错误&基本类型和包装类型的区别
This commit is contained in:
parent
a6cf71b9b5
commit
b5f8894c70
@ -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,所以我们继续压栈,直到相等以后开始出栈,出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。
|
||||||
|
|
||||||
|
@ -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 修饰局部变量
|
||||||
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -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.hpp(1127> 行)
|
> - <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.cpp(537> 行开始)
|
> - <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();
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user