提交 5fbb07fd 编写于 作者: W wizardforcel

2020-06-13 18:00:28

上级 fefb86ec
......@@ -223,6 +223,6 @@ MessageSubscriberThree :: Second Message
相关的 Java 类:
[`Observer` Java Doc](https://docs.oracle.com/javase/10/docs/api/java/util/Observer.html)
[`Observer` Java 文档](https://docs.oracle.com/javase/10/docs/api/java/util/Observer.html)
[`Observable` Java Doc](https://docs.oracle.com/javase/10/docs/api/java/util/Observable.html)
\ No newline at end of file
[`Observable` Java 文档](https://docs.oracle.com/javase/10/docs/api/java/util/Observable.html)
\ No newline at end of file
......@@ -56,7 +56,7 @@
## 使用装饰器设计模式的建议解决方案
上面的问题是装饰图案的理想选择。 请记住,当我们有一个需要扩展但设计不当的对象时,请进行装饰。
上面的问题是装饰模式的理想选择。 请记住,当我们有一个需要扩展但设计不当的对象时,请进行装饰。
通过下面的类图可以轻松解决以上问题。 在这里,我仅用于支持报告。 也可以为客户报告构建类似的类层次结构。
......@@ -186,7 +186,7 @@ Support data - support link - - support popup -
要下载完整的源代码和 UML 图,请遵循文章结尾处的下载链接。
## 关于装饰图案的面试问题
## 关于装饰模式的面试问题
**A)如何确定何时使用装饰器模式?**
......
......@@ -53,7 +53,7 @@
我是否应该建议您准备**集合框架**及其所有主要类别? 我想你已经足够聪明了。
如果没有任何与集合框架有关的问题,则任何面试(初中和中级)都将是不完整的。 它真正测试您的编程技能和对核心 Java API 的了解。 问题可能像集合层次结构一样简单,而困难的问题例如队列和栈。 这是此类常见收藏面试问题的列表:
如果没有任何与集合框架有关的问题,则任何面试(初中和中级)都将是不完整的。 它真正测试您的编程技能和对核心 Java API 的了解。 问题可能像集合层次结构一样简单,而困难的问题例如队列和栈。 这是此类常见集合面试问题的列表:
* 解释集合层次?
* `Set``List`之间的区别?
......@@ -293,8 +293,8 @@ Spring **AOP** (面向方面​​的编程)在某种意义上补充了 OOP
* 什么是 Java 中的抽象和封装?
* 方法重载规则?
* Java 的扩大和缩小?
*只能试一下代码块吗?
* 线程:生产者和消费者有问题吗
*在代码中可以只有`try`块吗?
* 线程:生产者和消费者的问题
* 为什么在`Object`类中定义了`wait()``notify()``notifyAll()`
* 我们可以覆盖`wait()``notify()`方法吗?
* `wait()``sleep()``yield()`之间的区别?
......
......@@ -2,18 +2,18 @@
> 原文: [https://howtodoinjava.com/interview-questions/java-interview-questions-for-mid-level-developers/](https://howtodoinjava.com/interview-questions/java-interview-questions-for-mid-level-developers/)
实际上,这个面试问题最初是由我们的读者之一尼基尔提出的。 他的问题是:“我的问题是,我有 6 年的 java / j2ee 开发人员经验,并且我打算更换公司。 您能否建议我准备面试所需的所有主题,以及参加面试和公司对我的经验的期望……对于基于产品/服务的公司..”
实际上,这个面试问题最初是由我们的读者之一尼基尔提出的。 他的问题是:“我的问题是,我有 6 年的 java/j2ee 开发人员经验,并且我打算更换公司。 您能否建议我准备面试所需的所有主题,以及参加面试和公司对我的经验的期望……对于基于产品/服务的公司..”
## 中级 Java 面试准备
为了回答这个问题,我回答了以下答案。
1. 您提出的问题的答案范围非常广。 我建议集中精力于简历中的内容……显然。
2. 接下来,关注[设计模式](//howtodoinjava.com/gang-of-four-java-design-patterns/)。 完美准备 3-4 种图案。 准备给**现实生活中的示例**,以及如何在以前的项目中使用它们。 他们一定会问这个问题。
2. 接下来,关注[设计模式](//howtodoinjava.com/gang-of-four-java-design-patterns/)。 完美准备 3-4 种模式。 准备给**现实生活中的示例**,以及如何在以前的项目中使用它们。 他们一定会问这个问题。
3. 接下来,了解有关当前项目的每个细节。 系统设计,模块设计,数据库结构..以及它们提供的总体好处。 一切都放在指尖上。
4. 学习和练习多线程(特别是[执行器](//howtodoinjava.com/java/multi-threading/java-thread-pool-executor-example/)**线程池**)。 在纸上创建一些程序。 练习一下。
5. 尝试编写一些棘手的 [**SQL 查询**](//howtodoinjava.com/misc/sql-query-to-find-find-the-nth-highest-salary-of-an-employee/) 等。了解联接,索引及其语法。
6. 您也应该期待 [**OOP 概念**](//howtodoinjava.com/category/object-oriented/) 。 准备自己的定义并记住。
5. 尝试编写一些棘手的 [**SQL 查询**](//howtodoinjava.com/misc/sql-query-to-find-find-the-nth-highest-salary-of-an-employee/)等。了解联接,索引及其语法。
6. 您也应该期待 [**OOP 概念**](//howtodoinjava.com/category/object-oriented/)。 准备自己的定义并记住。
7. 我认为,其余的都是您将在简历中提及的技术。
**祝您学习愉快!**
\ No newline at end of file
......@@ -4,7 +4,7 @@
[Oracle 企业管理器](https://www.oracle.com/technetwork/oem/enterprise-manager/overview/index.html "oracle enterprise manager")可帮助私有和公共云服务提供商在释放管理资源的同时,将云服务的速度提高十倍。 这是来自 Oracle 的非常受欢迎的产品。
**Sreenath Ravva**, one of reader on *HowToDoInJava*, has appeared on a interview for position in above product i.e. oracle enterprise manager. Below listed questions were shared with me by him so that I can share with all of you, in hope that it will benefit few of us on any fine day.
*HowToDoInJava* 的读者之一,**Sreenath Ravva**,出现在上述产品(即 oracle 企业管理器)职位的采访中。 他与我分享了以下列出的问题,以便我可以与大家分享,希望在任何美好的一天中对我们中的几个人都没有好处。
注意:我已尝试在网页上放置链接,以供您参考以下面试问题的答案。 它们可能不足以涵盖该主题,但是它们可以帮助您入门。
......@@ -12,16 +12,16 @@
**1)您可以开始讲述自己和您的项目吗?**
<iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="375" src="https://www.youtube.com/embed/CumOvDWnUDY?feature=oembed" title="Tell Me About Yourself - Best Answer to this Interview Question - YouTube Top Pick" width="500"></iframe>
<https://www.youtube.com/embed/CumOvDWnUDY?feature=oembed>
**2)什么是 Java 中的抽象和封装?**
[//howtodoinjava.com/object-oriented/understanding-abstraction-in-java/](//howtodoinjava.com/object-oriented/understanding-abstraction-in-java/)
[//howtodoinjava.com/object-oriented/encapsulation-in-java-and- 与抽象的关系/](//howtodoinjava.com/object-oriented/encapsulation-in-java-and-its-relation-with-abstraction/)
[https://howtodoinjava.com/object-oriented/understanding-abstraction-in-java/](//howtodoinjava.com/object-oriented/understanding-abstraction-in-java/)
[https://howtodoinjava.com/object-oriented/encapsulation-in-java-and-its-relation-with-abstraction/](//howtodoinjava.com/object-oriented/encapsulation-in-java-and-its-relation-with-abstraction/)
**3)方法重载规则? 我们可以在子类中重载超类方法吗? 该示例进行了讨论。**
1. [//howtodoinjava.com/2013/07/15/what-is-polymorphism-in-java](//howtodoinjava.com/object-oriented/what-is-polymorphism-in-java/)
1. [https://howtodoinjava.com/2013/07/15/what-is-polymorphism-in-java](//howtodoinjava.com/object-oriented/what-is-polymorphism-in-java/)
2. [http://stackoverflow.com/questions/10901259/java-overloading-rules](https://stackoverflow.com/questions/10901259/java-overloading-rules)
**4)方法覆盖规则?**
......@@ -31,11 +31,11 @@
[http://stackoverflow.com/questions/16781649/real-world-application-of-widening-narrowing-conversion](https://stackoverflow.com/questions/16781649/real-world-application-of-widening-narrowing-conversion)
**6)我只能在代码中尝试块吗?**
**6)我在代码中可以只有`try`块吗?**
不。您至少需要 catch 块或 finally 块以及 try 块。 [直到 Java 6]
不。您至少需要`catch`块或`finally`块以及`try`块。(直到 Java 6)
As “Ievgen” mentioned in comments, JDK 7 onwards you can use [try-with-resources](//howtodoinjava.com/java-7/automatic-resource-management-with-try-with-resources-in-java-7/ "try-with-resource") with “optional” catch or finally block.
如“Ievgen”在评论中提到的,从 JDK 7 开始,您可以使用[`try-with-resources`](//howtodoinjava.com/java-7/automatic-resource-management-with-try-with-resources-in-java-7/)带有“可选的”`catch``finally`块。
```java
try (FileInputStream f = new FileInputStream("ttt"))
......@@ -44,31 +44,31 @@ try (FileInputStream f = new FileInputStream("ttt"))
}
```
**7)线程:生产者和消费者有问题吗?**
**7)线程:生产者和消费者的问题?**
* [http://en.wikipedia.org/wiki/Producer-consumer_problem](https://en.wikipedia.org/wiki/Producer-consumer_problem)
* [//howtodoinjava.com/java-5/how-to-use-blockingqueue-and-threadpoolexecutor-in-java/](//howtodoinjava.com/java-5/how-to-use-blockingqueue-and-threadpoolexecutor-in-java/)
* [http://howtodoinjava.com/java-5/how-to-use-blockingqueue-and-threadpoolexecutor-in-java/](//howtodoinjava.com/java-5/how-to-use-blockingqueue-and-threadpoolexecutor-in-java/)
**8)为什么在 Object 类中定义了 wait(),notify()和 notifyAll()?**
**8)为什么在`Object`类中定义了`wait()`,`notify()`和`notifyAll()`?**
* [//howtodoinjava.com/2013/03/04/core-java-interview-questions-series-part-2/](//howtodoinjava.com/java/interviews-questions/core-java-interview-questions-series-part-2/)
* [http://howtodoinjava.com/2013/03/04/core-java-interview-questions-series-part-2/](//howtodoinjava.com/java/interviews-questions/core-java-interview-questions-series-part-2/)
* [http://stackoverflow.com/questions/17840397/concept-behind-putting-wait-notify-methods-in-object-class](https://stackoverflow.com/questions/17840397/concept-behind-putting-wait-notify-methods-in-object-class)
**9)我们可以重写 wait()或 notify()方法吗?**
**9)我们可以覆盖`wait()`或`notify()`方法吗?**
Object.java 中,方法 getClass(),notify(),notifyAll()和三个 wait()方法是最终的,因此您无法覆盖它们。
`Object.java`中,方法`getClass()``notify()``notifyAll()`和三个`wait()`方法是最终的,因此您无法覆盖它们。
**10)wait(),sleep()和 yield()之间的区别?**
**10)`wait()`,`sleep()`和`yield()`之间的区别?**
[http://stackoverflow.com/questions/9700871/what-is-difference-between-sleep-method-and-yield-method-of-multi-threading](https://stackoverflow.com/questions/9700871/what-is-difference-between-sleep-method-and-yield-method-of-multi-threading)
**11)解释线程类**中的 join()方法
**11)解释线程类中的`join()`方法**
[http://stackoverflow.com/questions/18479771/java-multithreading-concept-and-join-method](https://stackoverflow.com/questions/18479771/java-multithreading-concept-and-join-method)
## 第二轮(面对面)java 面试题
**1) Can you just start telling about your self and your project?**
**1) 您可以开始讲述自己和您的项目吗?**
*请参阅上面列表中的第一个问题。*
......@@ -80,7 +80,7 @@ try (FileInputStream f = new FileInputStream("ttt"))
[http://blogs.msdn.com/b/snehadeep/archive/2009/04/28/connection-leak-its-symptoms-and-troubleshooting.aspx](https://blogs.msdn.com/b/snehadeep/archive/2009/04/28/connection-leak-its-symptoms-and-troubleshooting.aspx)
**4)编写一个程序,使用第三个变量将两个数字互换?**
**4)编写一个程序,使用第三个变量将两个数字互换?**
```java
import java.io.*;
......@@ -110,9 +110,11 @@ public class SwappingNumberWithoutThirdVariable
**5)编写程序以对数组进行排序并删除重复项?**
[http://stackoverflow.com/questions/17967114/how-to-remove-dumoments-from-an-array-in-java](https://stackoverflow.com/questions/17967114/how-to-remove-duplicates-from-an-array-in-java)
**6)在 单例人士?**
[//howtodoinjava.com/design-patterns/singleton-design-pattern-in-java/](//howtodoinjava.com/design-patterns/singleton-design-pattern-in-java/)
**6)在单例上编写程序?**
[https://howtodoinjava.com/design-patterns/singleton-design-pattern-in-java/](//howtodoinjava.com/design-patterns/singleton-design-pattern-in-java/)
**7)我有两个包含整数的数组。 编写一个程序来合并这两个数组并删除重复的元素? 最后,我需要一个应该具有唯一元素的数组?**
......@@ -120,18 +122,19 @@ public class SwappingNumberWithoutThirdVariable
**8)编写程序以使用 JDBC 和结果集从表中获取数据?**
[//howtodoinjava.com/2013/11/24/jdbc-select-query-example/](//howtodoinjava.com/misc/jdbc-select-query-example/)
[https://howtodoinjava.com/2013/11/24/jdbc-select-query-example/](//howtodoinjava.com/misc/jdbc-select-query-example/)
**9)如何从 HashMap 获取数据?**
**9)如何从`HashMap`获取数据?**
[//howtodoinjava.com/java/interviews-questions/how-hashmap-works-in-java/](//howtodoinjava.com/java/collections/how-hashmap-works-in-java/)
[https://howtodoinjava.com/java/interviews-questions/how-hashmap-works-in-java/](//howtodoinjava.com/java/collections/how-hashmap-works-in-java/)
**10)Vector 和 ArrayList 之间的区别?**
**10)`Vector`和`ArrayList`之间的区别?**
//howtodoinjava.com/java/collections/useful-java-collection-interview-questions/
**11)睡眠和等待之间的区别?**
<https://howtodoinjava.com/java/collections/useful-java-collection-interview-questions/>
[//howtodoinjava.com/2013/03/08/difference-between-sleep-and-wait/](//howtodoinjava.com/java/multi-threading/difference-between-sleep-and-wait/)
**11)睡眠和等待之间的区别?**
[https://howtodoinjava.com/2013/03/08/difference-between-sleep-and-wait/](//howtodoinjava.com/java/multi-threading/difference-between-sleep-and-wait/)
**12)还问了一些 sql 查询。**
......@@ -173,7 +176,7 @@ public class FibonacciSampleCode
```
**14)我们可以像下面的代码一样编写 try catch 块吗?**
**14)我们可以像下面的代码一样编写`try catch`块吗?**
```java
try
......@@ -188,13 +191,13 @@ catch()
```
[//howtodoinjava.com/2012/12/why-try-catch-finally-blocks-require-braces/](//howtodoinjava.com/for-fun-only/why-try-catch-finally-blocks-require-braces/)
[https://howtodoinjava.com/2012/12/why-try-catch-finally-blocks-require-braces/](//howtodoinjava.com/for-fun-only/why-try-catch-finally-blocks-require-braces/)
**15)finally 块有什么用?**
**15)`finally`块有什么用?**
[http://stackoverflow.com/questions/15768645/what-is-the-benefit-to-use-finally-after-try-catch-block-in-java](https://stackoverflow.com/questions/15768645/what-is-the-benefit-to-use-finally-after-try-catch-block-in-java)
**16)final 关键字有什么用?**
**16)`final`关键字有什么用?**
[http://en.wikipedia.org/wiki/Final_%28Java%29](https://en.wikipedia.org/wiki/Final_%28Java%29)
......@@ -209,7 +212,8 @@ catch()
**19)我可以将一个类声明为私有类吗?**
[http://docs.oracle.com/javase/tutorial/java/javaOO/classdecl.html](https://docs.oracle.com/javase/tutorial/java/javaOO/classdecl.html)
**20)如果我在 try 块中写 return 会发生什么? 最终会执行吗? 如果写入 system.exit(),最终将执行块会怎样?**
**20)如果我在`try`块中写`return`会发生什么? `finally`会执行吗? 如果写入`system.exit()`,`finally`块会怎样?**
[http://stackoverflow.com/questions/65035/does-finally-always-execute-in-java](https://stackoverflow.com/questions/65035/does-finally-always-execute-in-java)
......@@ -217,7 +221,7 @@ catch()
[http://www.linkedin.com/groups/How-do-you-answer-Why-1792709.S.54631120](https://www.linkedin.com/groups/How-do-you-answer-Why-1792709.S.54631120 )
Nobody expect you tell the truth.. 🙂
没有人期望你说实话...🙂
这是他在写给我有关此问题的邮件时回想的所有**面试问题**。 我们希望这会对计划下一次与 oracle 进行面试的我们某些人有所帮助。
......
# HashMap 和 ConcurrentHashMap 面试问题
# `HashMap`和`ConcurrentHashMap`面试问题
> 原文: [https://howtodoinjava.com/interview-questions/hashmap-concurrenthashmap-interview-questions/](https://howtodoinjava.com/interview-questions/hashmap-concurrenthashmap-interview-questions/)
在“ [**中,HashMap 如何在 Java**](//howtodoinjava.com/java/collections/how-hashmap-works-in-java/ "How hashmap works in java") 中工作”,我解释了`HashMap``ConcurrentHashMap`类的内部结构以及它们如何适合整个概念。 但是,当面试官向您询问有关`HashMap`相关概念时,他不仅会停留在核心概念上。 讨论通常会朝多个方向进行,以了解您是否真正了解该概念。
关于“[**`HashMap`如何在 Java 中工作**](//howtodoinjava.com/java/collections/how-hashmap-works-in-java/ "How hashmap works in java")”,我解释了`HashMap``ConcurrentHashMap`类的内部结构以及它们如何适合整个概念。 但是,当面试官向您询问有关`HashMap`相关概念时,他不仅会停留在核心概念上。 讨论通常会朝多个方向进行,以了解您是否真正了解该概念。
在这篇文章中,我将尝试在 **HashMap****ConcurrentHashMap** 上涵盖一些相关的 [**面试问题**](//howtodoinjava.com/java-interview-questions/ "interview questions")
在这篇文章中,我将尝试在`HashMap``ConcurrentHashMap`上涵盖一些相关的[**面试问题**](//howtodoinjava.com/java-interview-questions/ "interview questions")
## HashMap 和 ConcurrentHashMap 面试问题
## `HashMap`和`ConcurrentHashMap`面试问题
1\. [您将如何为 HashMap 设计一个好的键?](#1)
2\. [HashMap 和 ConcurrentHashMap 之间的区别?](#2)
3\. [HashMap 和 Collections.synchronizedMap(HashMap)之间的区别吗?](#3)
4\. [ConcurrentHashMap 和 Collections.synchronizedMap(HashMap)之间的区别?](#4)
5\. [HashMap 和 HashTable 之间的区别?](#5)
6\. [HashTable 和 Collections.synchronized(HashMap)之间的区别?](#6)
7\. [键的随机/固定 hashCode()值的影响?](#7)
8\. [在多线程应用的非同步代码中使用 HashMap 吗?](#8)
1. [您将如何为`HashMap`设计一个好的键?](#1)
2. [`HashMap`和`ConcurrentHashMap`之间的区别?](#2)
3. [`HashMap`和`Collections.synchronizedMap(HashMap)`之间的区别吗?](#3)
4. [`ConcurrentHashMap`和`Collections.synchronizedMap(HashMap)`之间的区别?](#4)
5. [`HashMap`和`HashTable`之间的区别?](#5)
6. [`HashTable`和`Collections.synchronized(HashMap)`之间的区别?](#6)
7. [键的随机/固定`hashCode()`值的影响?](#7)
8. [在多线程应用的非同步代码中使用`HashMap`吗?](#8)
## 1.如何为 HashMap 设计一个好的键
## 1.如何为`HashMap`设计一个好的键
设计一个好的键的最基本的需求是“我们应该能够从映射中检索到值对象而不会失败”,对吗? 否则,无论您如何构建精美的数据结构,它都将毫无用处。 要确定我们已经创建了一个好的键,我们必须知道“ [**HashMap 如何工作?**](https://howtodoinjava.com/java/collections/how-hashmap-works-in-java/ "How hashmap works in java") 。 我将介绍哈希表的工作原理,让您从链接的文章中阅读内容,但总而言之,它是基于哈希原理的。
设计一个好的键的最基本的需求是“我们应该能够从映射中检索到值对象而不会失败”,对吗? 否则,无论您如何构建精美的数据结构,它都将毫无用处。 要确定我们已经创建了一个好的键,我们必须知道“[**`HashMap`如何工作?**](https://howtodoinjava.com/java/collections/how-hashmap-works-in-java/ "How hashmap works in java")。 我将介绍哈希表的工作原理,让您从链接的文章中阅读内容,但总而言之,它是基于哈希原理的。
键的哈希码主要与 equals()方法结合使用,用于将键放入映射,然后从映射中搜索回来。 因此,如果在将键值对放入映射后,键对象的哈希码发生变化,则几乎不可能从映射取回值对象。 这是内存泄漏的情况。 为了避免这种情况,映射**键应该是不可变的**。 这些是 [**创建类**](https://howtodoinjava.com/java/basics/how-to-make-a-java-class-immutable/ "How to make a java class immutable") 不变的东西。
键的哈希码主要与`equals()`方法结合使用,用于将键放入映射,然后从映射中搜索回来。 因此,如果在将键值对放入映射后,键对象的哈希码发生变化,则几乎不可能从映射取回值对象。 这是内存泄漏的情况。 为了避免这种情况,映射**键应该是不可变的**。 这些是[**创建类**](https://howtodoinjava.com/java/basics/how-to-make-a-java-class-immutable/ "How to make a java class immutable")不变的东西。
这就是为什么不可变类(例如 String,Integer 或其他包装器类)是好的关键对象候选对象的主要原因。
这就是为什么不可变类(例如`String``Integer`或其他包装器类)是好的关键对象候选对象的主要原因。
但是请记住,建议**不可变,而不是强制性**。 如果要将可变对象作为`HashMap`中的键,则必须确保键对象的**状态更改不会更改对象**的哈希码。 这可以通过重写 hashCode()方法来完成。 同样,键类必须遵守 [**hashCode()和 equals()方法协定**](https://howtodoinjava.com/java/basics/java-hashcode-equals-methods/ "Working with hashCode and equals methods in java") ,以避免在运行时出现不良行为。 在链接的文章中阅读有关此合同的更多信息。
但是请记住,建议**不可变,而不是强制性**。 如果要将可变对象作为`HashMap`中的键,则必须确保键对象的**状态更改不会更改对象**的哈希码。 这可以通过重写`hashCode()`方法来完成。 同样,键类必须遵守[**`hashCode()`和`equals()`方法协定**](https://howtodoinjava.com/java/basics/java-hashcode-equals-methods/ "Working with hashCode and equals methods in java"),以避免在运行时出现不良行为。 在链接的文章中阅读有关此约定的更多信息。
更详细的信息可在 [**在此处**](https://howtodoinjava.com/java/collections/design-good-key-for-hashmap/ "How to design a good key for HashMap")找到。
更详细的信息可在[**在此处**](https://howtodoinjava.com/java/collections/design-good-key-for-hashmap/ "How to design a good key for HashMap")找到。
## 2\. HashMap 和 ConcurrentHashMap 之间的区别
## 2\. `HashMap`和`ConcurrentHashMap`之间的区别
为了更好地可视化 ConcurrentHashMap,请将其视为一组 HashMap。 要从`HashMap`中获取和放置键值对,您必须计算哈希码并在 Collection.Entry 数组中查找正确的存储桶位置。 其余的,您已阅读了以前有关哈希表如何工作的相关文章。
为了更好地可视化`ConcurrentHashMap`,请将其视为一组`HashMap`。 要从`HashMap`中获取和放置键值对,您必须计算哈希码并在`Collection.Entry`数组中查找正确的存储桶位置。 其余的,您已阅读了以前有关哈希表如何工作的相关文章。
currentHashMap 中,**的不同之处在于内部结构来存储这些键值对**。 ConcurrentHashMap 具有段的附加概念。 当您想到一个段等于一个 HashMap 时,[概念上]会更容易理解。 初始化时,并发 HashMap 被划分为段数[默认为 16]。 ConcurrentHashMap 允许相似数量(16)的线程同时访问这些段,以便在高并发期间每个线程都在特定的段上工作。
`currentHashMap`中,**的不同之处在于内部结构来存储这些键值对**`ConcurrentHashMap`具有段的附加概念。 当您想到一个段等于一个`HashMap`时,概念上会更容易理解。 初始化时,并发`HashMap`的段数默认为 16。 `ConcurrentHashMap`允许相似数量(16)的线程同时访问这些段,以便在高并发期间每个线程都在特定的段上工作。
这样,如果您的键值对存储在第 10 段中; 代码不需要另外阻塞其他 15 个段。 这种结构提供了很高的并发性。
![ConcurrentHashMap Internal Structure](img/d10fabdd2b20d60555a8221a36905eeb.png)
ConcurrentHashMap Internal Structure
`ConcurrentHashMap`内部结构
换句话说, **ConcurrentHashMap 使用多个锁,每个锁控制映射**的一个段。 在特定段中设置数据时,将获得该段的锁。 因此,基本上**更新操作是同步的**
换句话说,`ConcurrentHashMap`使用多个锁,每个锁控制映射的一个段。 在特定段中设置数据时,将获得该段的锁。 因此,基本上**更新操作是同步的**
**获取数据时,将使用易失性读取**,而不会进行任何同步。 如果易失性读取导致未命中,则将获得该段的锁定,并在同步块中再次搜索项目。
## 3\. HashMap 和 Collections.synchronizedMap(HashMap)之间的区别
## 3\. `HashMap`和`Collections.synchronizedMap(HashMap)`之间的区别
这个问题很简单,对! HashMap 是不同步的,并且 Collections.synchronizedMap()返回 HashMap 的包装实例,该实例具有同步的所有 get,put 方法。
这个问题很简单,对! `HashMap`是不同步的,并且`Collections.synchronizedMap()`返回`HashMap`的包装实例,该实例具有同步的所有`get``put`方法。
本质上, **Collections.synchronizedMap()返回内部创建的内部类“ SynchronizedMap”** 的引用,该类包含作为参数传递的输入 HashMap 的键值对。
本质上,`Collections.synchronizedMap()`返回内部创建的内部类“`SynchronizedMap`”的引用,该类包含作为参数传递的输入`HashMap`的键值对。
内部类的此实例与原始参数 HashMap 实例无关,并且是完全独立的。
内部类的此实例与原始参数`HashMap`实例无关,并且是完全独立的。
## 4\. ConcurrentHashMap 和 Collections.synchronizedMap(HashMap)之间的区别
## 4\. `ConcurrentHashMap`和`Collections.synchronizedMap(HashMap)`之间的区别
这一点要难一些。 两者都是 HashMap 的同步版本,其核心功能和内部结构有所不同。
这一点要难一些。 两者都是`HashMap`的同步版本,其核心功能和内部结构有所不同。
如上所述,ConcurrentHashMap 由内部段组成,从概念上讲,这些内部段可以视为独立的 HashMap。 所有这样的段可以在高并发执行中被单独的线程锁定。 这样,**多个线程可以从 ConcurrentHashMap 获取/放置键值对,而不会互相阻塞/等待**
如上所述,`ConcurrentHashMap`由内部段组成,从概念上讲,这些内部段可以视为独立的`HashMap`。 所有这样的段可以在高并发执行中被单独的线程锁定。 这样,**多个线程可以从`ConcurrentHashMap`获取/放置键值对,而不会互相阻塞/等待**
Collections.synchronizedMap()中,我们获得了 HashMap 的同步版本,并且**以阻塞方式**进行访问。 这意味着如果多个线程尝试同时访问 syncedMap,将允许它们一次以同步方式获取/放置键值对。
`Collections.synchronizedMap()`中,我们获得了`HashMap`的同步版本,并且**以阻塞方式**进行访问。 这意味着如果多个线程尝试同时访问`synchronizedMap`,将允许它们一次以同步方式获取/放置键值对。
## 5\. HashMap 和 HashTable 之间的区别
## 5\. `HashMap`和`HashTable`之间的区别
这也是一个很简单的问题。 主要区别在于 **HashTable 是同步的,而 HashMap 不是**
这也是一个很简单的问题。 主要区别在于`HashTable`是同步的,而`HashMap`不是
如果由于其他原因而被告知,请告诉他们, **HashTable 是旧类**(JDK 1.0 的一部分),该类稍后通过实现 Map 接口而被提升为集合框架。 它仍然具有一些**附加功能,例如 HashMap 缺少的 Enumerator**
如果由于其他原因而被告知,请告诉他们,`HashTable`是旧类(JDK 1.0 的一部分),该类稍后通过实现`Map`接口而被提升为集合框架。 它仍然具有一些**附加功能,例如`HashMap`缺少的`Enumerator`**
另一个较小的原因可能是: **HashMap 支持空键**(映射到零桶),HashTable 不支持空键,并且在这种尝试时抛出 NullPointerException
另一个较小的原因可能是:`HashMap`支持空键(映射到零桶),`HashTable`不支持空键,并且在这种尝试时抛出`NullPointerException`
## 6\. HashTable 和 Collections.synchronized(HashMap)之间的区别
## 6\. `HashTable`和`Collections.synchronized(HashMap)`之间的区别
到目前为止,您必须已经了解了它们之间相似性的核心思想。 两者都是集合的同步版本。 两者都在类内部具有同步方法。 两者本质上都是阻塞的,即在将实例中的任何内容放进去之前,多个线程将需要等待获取实例上的锁。
那么区别是什么呢。 好吧,由于上述原因,**没有重大差异**。 两个集合的性能也相同。
唯一将它们分开的是事实 **HashTable 是提升为集合框架的旧版**类。 它具有自己的额外功能,例如枚举器。
唯一将它们分开的是事实`HashTable`是提升为集合框架的旧版类。 它具有自己的额外功能,例如枚举器。
## 7.键的随机/固定 hashcode()值的影响
## 7.键的随机/固定`hashcode()`值的影响
两种情况(键的固定哈希码或键的随机哈希码)的影响将产生相同的结果,即“ **意外行为**”。 HashMap 中哈希码最基本的需求是确定存储桶的位置,以将键值对放置在哪里,以及必须从哪里检索它。
两种情况(键的固定哈希码或键的随机哈希码)的影响将产生相同的结果,即“**意外行为**”。 `HashMap`中哈希码最基本的需求是确定存储桶的位置,以将键值对放置在哪里,以及必须从哪里检索它。
如果键对象的哈希码每次都更改,则键值对的确切位置每次都将计算为不同。 这样,存储在 HashMap 中的一个对象将永远丢失,并且将其从映射取回的可能性极小。
如果键对象的哈希码每次都更改,则键值对的确切位置每次都将计算为不同。 这样,存储在`HashMap`中的一个对象将永远丢失,并且将其从映射取回的可能性极小。
出于同样的原因,建议键是不可变的,以便每次在同一键对象上请求时,它们都返回唯一且相同的哈希码。
## 8.在多线程应用中的非同步代码中使用 HashMap
## 8.在多线程应用中的非同步代码中使用`HashMap`
在正常情况下,它**可使`HashMap`处于不一致状态**,在该状态下添加和检索的键值对可能不同。 除此之外,还会出现其他令人惊讶的行为,例如 NullPointerException
在正常情况下,它**可使`HashMap`处于不一致状态**,在该状态下添加和检索的键值对可能不同。 除此之外,还会出现其他令人惊讶的行为,例如`NullPointerException`
在最坏的情况下,**会导致无限循环**。 是。 你答对了。 它可能导致无限循环。 你问什么,如何? 好吧,这就是原因。
HashMap 达到其大小上限时,它具有重新哈希的概念。 重新哈希处理是创建新的内存区域,并在新的内存中复制所有已经存在的键值对的过程。 可以说,线程 A 尝试将键值对放入映射中,然后开始重新哈希。 同时,线程 B 来了,并开始使用 put 操作来操作存储桶。
`HashMap`达到其大小上限时,它具有重新哈希的概念。 重新哈希处理是创建新的内存区域,并在新的内存中复制所有已经存在的键值对的过程。 可以说,线程 A 尝试将键值对放入映射中,然后开始重新哈希。 同时,线程 B 来了,并开始使用`put`操作来操作存储桶。
在进行重新哈希处理时,有机会生成循环依赖关系,其中链表中的任何元素(在任何存储桶中)都可以指向同一存储桶中的任何先前节点。 这将导致无限循环,因为重新哈希处理的代码包含一个“ while(true){//获取下一个节点; }”块,并且在循环依赖项下它将无限运行。
在进行重新哈希处理时,有机会生成循环依赖关系,其中链表中的任何元素(在任何存储桶中)都可以指向同一存储桶中的任何先前节点。 这将导致无限循环,因为重新哈希处理的代码包含一个“`while(true){//获取下一个节点;}`”块,并且在循环依赖项下它将无限运行。
要仔细观察,请查看用于重新哈希处理的传输方法的艺术源代码:
......@@ -120,11 +121,12 @@ public Object get(Object key) {
以后我会写一篇更详细的文章。
希望我能够为**`HashMap`面试问题****ConcurrentHashMap 面试问题**投入更多知识。 如果您认为本文有帮助,请考虑与您的朋友分享。
希望我能够为`HashMap`面试问题和`ConcurrentHashMap`面试问题投入更多知识。 如果您认为本文有帮助,请考虑与您的朋友分享。
学习愉快!
参考文献:
[ConcurrentHashMap Java 文档](https://docs.oracle.com/javase/10/docs/api/java/util/concurrent/ConcurrentHashMap.html)
[ConcurrentHashMap Java 文档](https://docs.oracle.com/javase/10/docs/api/java/util/HashMap.html)
\ No newline at end of file
[`ConcurrentHashMap` Java 文档](https://docs.oracle.com/javase/10/docs/api/java/util/concurrent/ConcurrentHashMap.html)
[`HashMap` Java 文档](https://docs.oracle.com/javase/10/docs/api/java/util/HashMap.html)
\ No newline at end of file
# Java 版本和新功能
# Java 版本和新特性
> 原文: [https://howtodoinjava.com/java-version-wise-features-history/](https://howtodoinjava.com/java-version-wise-features-history/)
Java 版本 7 或 8 中的**新 Java 功能是什么? 这些是 Java 面试中经常被问到的问题。**
Java 版本 7 或 8 中的**新 Java 特性是什么**? 这些是 Java 面试中经常被问到的问题。
在此页面中,我依次列出了所有 **JDK 从 JDK 1.x 到 Java SE 12** 的更改。 尽管我已尽力涵盖了我所能收集的全部信息,但是,如果您知道我在下面遗漏的内容,请告诉我,我将添加该信息。
## Java 12 功能
## Java 12 特性
[Java 12](https://howtodoinjava.com/java12/new-features-enhancements/) (于 2019 年 3 月 19 日发布)是 JDK 的最新版本。 让我们看看它为开发人员和建筑师带来的新功能和改进。
[Java 12](https://howtodoinjava.com/java12/new-features-enhancements/) (于 2019 年 3 月 19 日发布)是 JDK 的最新版本。 让我们看看它为开发人员和架构师带来的新特性和改进。
* Stream API 中的 Collectors.teeing()
* 流 API 中的`Collectors.teeing()`
* 字符串 API 的更改
* Files.mismatch(路径,路径)
* `Files.mismatch(Path, Path)`
* 紧凑数字格式
* 支持 Unicode 11
* 切换表达式(预览)
* `switch`表达式(预览)
## Java 11 功能
## Java 11 特性
[Java 11](https://howtodoinjava.com/java11/features-enhancements/) (于 2018 年 9 月发布)包含许多重要且有用的更新。 让我们看看它为开发人员和建筑师带来的新功能和改进。
[Java 11](https://howtodoinjava.com/java11/features-enhancements/) (于 2018 年 9 月发布)包含许多重要且有用的更新。 让我们看看它为开发人员和架构师带来的新特性和改进。
* HTTP 客户端 API
* 启动不编译的单文件程序
* 字符串 API 的更改
* Collection.toArray(IntFunction)
* Files.readString()和 Files.writeString()
* Optional.isEmpty()
* `Collection.toArray(IntFunction)`
* `Files.readString()``Files.writeString()`
* `Optional.isEmpty()`
## Java 10 功能
## Java 10 特性
Java 9 发布后,Java 10 很快问世。 与以前的版本不同,Java 10 没有那么多令人兴奋的功能,但它仍然[很少有重要更新](https://howtodoinjava.com/java10/java10-features/),它们会改变您的编码方式以及其他将来的 Java 版本。
Java 9 发布后,Java 10 很快问世。 与以前的版本不同,Java 10 没有那么多令人兴奋的特性,但它仍然[很少有重要更新](https://howtodoinjava.com/java10/java10-features/),它们会改变您的编码方式以及其他将来的 Java 版本。
* [JEP 286:局部变量类型推断](https://howtodoinjava.com/java10/var-local-variable-type-inference/)
* JEP 322:基于时间的发行版本控制
* JEP 304:垃圾收集器接口
* JEP 307:用于 G1 的并行全 GC
* JEP 316:备用存储设备上的堆分配
* JEP 296:将 JDK 林整合到单个仓库中
* JEP 296:将 JDK 林整合到单个仓库中
* JEP 310:应用类 - 数据共享
* JEP 314:其他 Unicode 语言标签扩展
* JEP 319:根证书
......@@ -47,74 +47,74 @@ Java 9 发布后,Java 10 很快问世。 与以前的版本不同,Java 10
* 新增的 API 和选项
* 删除的 API 和选项
## Java 9 功能
## Java 9 特性
Java 9 在`September, 2017`可用。 最大的变化是模块化,即 Java 模块。
Java 9 在 2017 年九月可用。 最大的变化是模块化,即 Java 模块。
Java 9 中的一些重要功能/ [更改是:](https://howtodoinjava.com/java9/java9-new-features-enhancements/)
[Java 9 中的一些重要特性/更改是:](https://howtodoinjava.com/java9/java9-new-features-enhancements/)
* [Java 平台模块系统](https://howtodoinjava.com/java9/java-9-modules-tutorial/)
* [接口专用方法](https://howtodoinjava.com/java9/java9-private-interface-methods/)
* HTTP 2 客户端
* JShell – REPL 工具
* 平台和 JVM 日志记录
* 处理 API 更新
* 进程 API 更新
* 集合 API 更新
* [流 API](https://howtodoinjava.com/java9/stream-api-improvements/) 的改进
* [流 API 的改进](https://howtodoinjava.com/java9/stream-api-improvements/)
* 多版本 JAR 文件
* @不推荐使用的标签更改
*
* `@Deprecated`标签更改
*遍历
* Java 文档更新
* 其他功能
* 其他特性
请在此处查看更新的发行信息[](https://openjdk.java.net/projects/jdk9/)
[请在此处查看更新的发行信息](https://openjdk.java.net/projects/jdk9/)
## Java8 功能
## Java8 特性
**发行日期**`March 18, 2014`
**发行日期**2014.3.18
代号文化被删除。 包括的功能包括:
代号文化被删除。 包括的特性包括:
* API 中的 [Lambda 表达式](//howtodoinjava.com/java8/complete-lambda-expressions-tutorial-in-java/)支持
* [流 API](https://howtodoinjava.com/java8/java-streams-by-examples/)
* [函数式接口](//howtodoinjava.com/java8/functional-interface-tutorial/)[默认方法](//howtodoinjava.com/java8/default-methods-in-java-8/)
* [可选](//howtodoinjava.com/java8/java-8-optionals-complete-reference/)
* [`Optional`](//howtodoinjava.com/java8/java-8-optionals-complete-reference/)
* Nashorn – JavaScript 运行时,允许开发人员将 JavaScript 代码嵌入应用中
* Java 类型注
* Java 类型注
* [无符号整数运算](//howtodoinjava.com/java8/java-8-exact-airthmetic-operations-supported-in-math-class/)
* 重复注
* 重复注
* [新日期和时间 API](//howtodoinjava.com/java8/date-and-time-api-changes-in-java-8-lambda/)
* 静态链接的 JNI 库
* 从 jar 文件启动 JavaFX 应用
* 从 GC 中删除永久生成
* 从 GC 中删除永久
## Java SE 7 功能
## Java SE 7 特性
**发行日期**`July 28, 2011`
**发行日期**2011.7.28
此版本称为“海豚”。 包括的功能包括:
此版本称为“海豚”。 包括的特性包括:
* JVM 对动态语言的支持
* 压缩的 64 位指针
* [开关](//howtodoinjava.com/java-7/string-class-is-supported-in-switch-statement-in-java-7/)中的字符串
* [尝试声明中的自动资源管理](//howtodoinjava.com/java-7/automatic-resource-management-with-try-with-resources-in-java-7/)
* [钻石运算符](//howtodoinjava.com/java-7/improved-type-inference-in-java-7/)
* 简化的 varargs 方法声明
* [`switch`中的字符串](//howtodoinjava.com/java-7/string-class-is-supported-in-switch-statement-in-java-7/)
* [`try`语句中的自动资源管理](//howtodoinjava.com/java-7/automatic-resource-management-with-try-with-resources-in-java-7/)
* [菱形运算符](//howtodoinjava.com/java-7/improved-type-inference-in-java-7/)
* 简化的可变参数方法声明
* 二进制整数字面值
* [数字字面值下划线](//howtodoinjava.com/java-7/improved-formatted-numbers-in-java-7/)
* [改进的异常处理](//howtodoinjava.com/java-7/improved-exception-handling-in-java-7/)
* [ForkJoin 框架](//howtodoinjava.com/java-7/forkjoin-framework-tutorial-forkjoinpool-example/)
* [NIO 2.0](//howtodoinjava.com/category/java-7-features/nio/) 具有对多个文件系统,文件元数据和符号链接的支持
* [WatchService](//howtodoinjava.com/java-7/auto-reload-of-configuration-when-any-change-happen/)
* [`WatchService`](//howtodoinjava.com/java-7/auto-reload-of-configuration-when-any-change-happen/)
* Timsort 用于对对象的集合和数组进行排序,而不是归并排序
* 图形功能的 API
* 图形特性的 API
* 支持新的网络协议,包括 SCTP 和套接字直接协议
## Java SE 6 功能
## Java SE 6 特性
**发行日期**`December 11, 2006`
**发行日期**2006.12.11
此版本称为“野马”。 Sun 从版本号中删除了“ .0”,版本变为 Java SE6。所包含的功能包括:
此版本称为“野马”。 Sun 从版本号中删除了“`.0`”,版本变为 Java SE6。所包含的特性包括:
* 脚本语言支持
* 性能提升
......@@ -122,87 +122,87 @@ Java 9 中的一些重要功能/ [更改是:](https://howtodoinjava.com/java9/
* JDBC 4.0
* Java 编译器 API
* JAXB 2.0 和 StAX 解析器
* 可插拔注
* 可插拔注
* 新的 GC 算法
## J2SE 5.0 功能
## J2SE 5.0 特性
**发行日期**`September 30, 2004`
**发行日期**2004.9.30
此版本称为“老虎”。 此发行版中添加了 Java 面试中要求的大多数功能
此版本称为“老虎”。 此发行版中添加了 Java 面试中要求的大多数特性
版本也称为 5.0,而不是 1.5。 包括的功能在下面列出:
版本也称为 5.0,而不是 1.5。 包括的特性在下面列出:
* [泛型](//howtodoinjava.com/java/generics/complete-java-generics-tutorial/)
* [注解](//howtodoinjava.com/2014/06/09/complete-java-annotations-tutorial/)
* 自动装箱/拆箱
* [枚举](//howtodoinjava.com/java-5/guide-for-understanding-enum-in-java/)
* 瓦拉格斯
* [增强的`for each`循环](//howtodoinjava.com/java/basics/enhanced-for-each-loop-in-java/)
* 可变参数
* [增强的`for`循环](//howtodoinjava.com/java/basics/enhanced-for-each-loop-in-java/)
* [静态导入](//howtodoinjava.com/java/basics/static-import-declarations-in-java/)
* `java.util.concurrent`中新的[并发工具](//howtodoinjava.com/java-5/java-executor-framework-tutorial-and-best-practices/)
* `Scanner`类,用于解析来自各种输入流和缓冲区的数据。
## J2SE 1.4 功能
## J2SE 1.4 特性
**发行日期**`February 6, 2002`
**发行日期**2002.2.6
此版本称为“ Merlin”。 包括的功能包括:
此版本称为“Merlin”。 包括的特性包括:
* [`assert`](//howtodoinjava.com/tutorials/java-keywords/assert/)关键字
* [正则表达式](//howtodoinjava.com/java-regular-expression-tutorials/)
* 异常链
* 互联网协议版本 6(IPv6)支持
* [新的 I / O; 蔚来](//howtodoinjava.com/java-nio-tutorials/)
* 记录 API
* 图像 I / O API
* [新的 I/O;`Future`](//howtodoinjava.com/java-nio-tutorials/)
* 日志 API
* 图像 I/O API
* 集成的 XML 解析器和 XSLT 处理器(JAXP)
* 集成的安全性和加密扩展(JCE,JSSE,JAAS)
* Java Web Start
* 首选项 API(java.util.prefs
* 首选项 API(`java.util.prefs`
## J2SE 1.3 功能
## J2SE 1.3 特性
**发行日期**`May 8, 2000`
**发行日期**2000.5.8
该版本称为“ Kestrel”。 包括的功能包括:
该版本称为“Kestrel”。 包括的特性包括:
* 热点 JVM
* Hotspot JVM
* Java 命名和目录接口(JNDI)
* Java 平台调试器架构(JPDA)
* Java 声音
* JavaSound
* 复合代理类
## J2SE 1.2 功能
## J2SE 1.2 特性
**发行日期**`December 8, 1998`
**发行日期**1008.12.8
此版本称为“游乐场”。 就添加的类数而言,这是一个主要版本(几乎是其大小的三倍)。 引入“ J2SE”一词是为了区分代码平台与 J2EE 和 J2ME。 包括的功能包括:
此版本称为“游乐场”。 就添加的类数而言,这是一个主要版本(几乎是其大小的三倍)。 引入“J2SE”一词是为了区分代码平台与 J2EE 和 J2ME。 包括的特性包括:
* `strictfp`关键字
* Swing 图形 API
* Sun 的 JVM 首次配备了 JIT 编译器
* Java 插件
* [收藏框架](//howtodoinjava.com/java/collections/useful-java-collection-interview-questions/)
* [集合框架](//howtodoinjava.com/java/collections/useful-java-collection-interview-questions/)
## JDK 1 功能
## JDK 1 特性
**发行日期**`January 23, 1996`
**发行日期**1996.1.23
这是[初始版本](https://web.archive.org/web/20080205101616/http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.xml),最初称为 **Oak** 。 它具有非常不稳定的 API 和一个名为 **WebRunner** 的 Java Web 浏览器。
这是[初始版本](https://web.archive.org/web/20080205101616/http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.xml),最初称为 **Oak** 。 它具有非常不稳定的 API 和一个名为`WebRunner`的 Java Web 浏览器。
第一个稳定版本 JDK 1.0.2 被称为 Java 1。
1997 年 2 月 19 日,发布了 JDK 1.1,其中列出了一些主要功能,例如:
1997 年 2 月 19 日,发布了 JDK 1.1,其中列出了一些主要特性,例如:
* AWT 事件模型
* 内部
* 内部
* JavaBeans
* JDBC
* RMI
* [反射](//howtodoinjava.com/java/related-concepts/real-usage-examples-of-reflection-in-java/)仅支持自省,无法在运行时进行修改。
* Windows 的 JIT(即时)编译器
同样,随时建议我在上面的列表中错过的任何 Java 版本中的 **Java 功能。**
同样,随时建议我在上面的列表中错过的任何 Java 版本中的 **Java 特性**
学习愉快!
\ No newline at end of file
......@@ -161,4 +161,4 @@ Token Value >>>> null
[Gson 用户指南](https://github.com/google/gson)
[`JsonReader` Java Doc](https://static.javadoc.io/com.google.code.gson/gson/2.8.5/com/google/gson/stream/JsonReader.html)
\ No newline at end of file
[`JsonReader` Java 文档](https://static.javadoc.io/com.google.code.gson/gson/2.8.5/com/google/gson/stream/JsonReader.html)
\ No newline at end of file
......@@ -71,7 +71,7 @@ Servlet 容器连接到 Web 服务器,该服务器在特定端口号(通常
当客户端首次访问 Web 应用和/或要通过`request.getSession()`首次获取`HttpSession`时,则 Servlet 容器将创建它,并生成一个长而唯一的 ID(您可以通过`session.getId()`获取并存储在服务器的内存中。 servlet 容器还将在 HTTP 响应中设置 Cookie,其中`JSESSIONID`为 cookie 名称,唯一会话 ID 为 cookie 值。
根据 [**HTTP cookie 规范**](http://www.faqs.org/rfcs/rfc2965.html "http cookie")(体面的 Web 浏览器和 Web 服务器必须遵守的合同),要求客户端(Web 浏览器)在后续请求中将该 Cookie 发送回 只要 Cookie 有效即可。 Servlet 容器将确定每个传入的 HTTP 请求标头中是否存在名为`JSESSIONID`的 cookie,并使用其值从服务器的内存中获取关联的`HttpSession`
根据 [**HTTP cookie 规范**](http://www.faqs.org/rfcs/rfc2965.html "http cookie")(体面的 Web 浏览器和 Web 服务器必须遵守的约定),要求客户端(Web 浏览器)在后续请求中将该 Cookie 发送回 只要 Cookie 有效即可。 Servlet 容器将确定每个传入的 HTTP 请求标头中是否存在名为`JSESSIONID`的 cookie,并使用其值从服务器的内存中获取关联的`HttpSession`
`HttpSession`会一直存在,直到没有被使用为止,您可以在`web.xml`中指定该设置,该设置**默认为 30 分钟**。 因此,如果客户端超过 30 分钟不再访问该 Web 应用,则 Servlet 容器将破坏该会话。 即使指定了 cookie,每个后续请求都将无法再访问同一会话。 servlet 容器将创建一个新的。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册