提交 8093a461 编写于 作者: W wizardforcel

2020-06-14 11:28:21

上级 c01aa869
......@@ -202,7 +202,7 @@ Support data - support link - - support popup -
**C)装饰器模式与子类别之间的差异**
装饰器模式和子类之间的区别在于,在子类中,您可以“使用单个类”修饰实现接口的任何类。 假设我想给自己一个`java.util.Map`,每当我添加或删除键时,它都会打印一条消息。 如果我只实际使用过`java.util.HashMap`,那么我可以创建`PrintingMap`吗? 作为`HashMap`的子类并重写&删除。 但是,如果要创建`TreeMap`的打印版本,则可以创建`PrintingTreeMap`? (哪些代码与`PrintingMap`具有几乎相同的代码?
装饰器模式和子类之间的区别在于,在子类中,您可以“使用单个类”修饰实现接口的任何类。 假设我想给自己一个`java.util.Map`,每当我添加或删除键时,它都会打印一条消息。 如果我只实际使用过`java.util.HashMap`,那么我可以创建`PrintingMap`吗? 作为`HashMap`的子类并覆盖&删除。 但是,如果要创建`TreeMap`的打印版本,则可以创建`PrintingTreeMap`? (哪些代码与`PrintingMap`具有几乎相同的代码?
## 装饰器模式的常用用法:
......
......@@ -84,7 +84,7 @@ public class Account
例如,spring 框架具有类`DispatcherServlet`。 此类充当基于 String 的 Web 应用的**前端控制器**。 要使用此类,我们不需要修改此类。 我们所需要做的就是传递初始化参数,然后我们可以按需要扩展其功能。
请注意,除了在应用启动期间传递初始化参数之外,我们还可以重写方法,以通过扩展类来修改目标类的行为。 例如,struts `Action`类被扩展以覆盖请求处理逻辑。
请注意,除了在应用启动期间传递初始化参数之外,我们还可以覆盖方法,以通过扩展类来修改目标类的行为。 例如,struts `Action`类被扩展以覆盖请求处理逻辑。
```java
public class HelloWorldAction extends Action
......
......@@ -111,7 +111,7 @@ Servlet 上面没有做一些重要的事情,您可能需要学习。
1. `MyFirstServlet`扩展了`HttpServlet`。 这是强制性的,因为所有 servlet 必须是扩展`javax.servlet.GenericServlet`的通用 servlet 或扩展`javax.servlet.http.HttpServlet`的 HTTP servlet。
2. 覆盖`doGet()``doPost()`方法。 这些方法在`HttpServlet`类中定义。 每当 GET 或 POST 请求到来时,都会将其映射到其相应的方法,例如,如果您对此 Servlet 发出 HTTP GET 请求,然后调用`doGet()`方法。
3. 还有一些其他有用的方法,您可以重写它们以在运行时控制应用,例如`getServletInfo()`
3. 还有一些其他有用的方法,您可以覆盖它们以在运行时控制应用,例如`getServletInfo()`
4. `HttpServletRequest``HttpServletResponse`是所有`doXXX()`方法的默认参数。 我们将在后面的部分中了解有关这些对象的更多信息。
这就是您应该知道的简单 servlet 的全部内容。
......
......@@ -16,7 +16,7 @@ Steps summary:
**重要**:请注意,Struts2 随附了许多现成的拦截器实现,因此请确保您确实需要创建自己的拦截器,或者有什么适合您的。
## 1)& 2)创建自定义拦截器类并实现重写的方法
## 1)& 2)创建自定义拦截器类并实现覆盖的方法
以下是自定义拦截器的示例代码,以及所有替代方法的实现。 请随时以适当的方法添加应用逻辑。
......
......@@ -64,7 +64,7 @@ public class IdentifyProblemsInCode {
在其他两个语句中,编译器确定了不可访问性,因此它报错错误。
如果我们再次像这样重写第二种方法。
如果我们再次像这样覆盖第二种方法。
```java
public void howToDoInJava_method2()
......
......@@ -28,7 +28,7 @@ Output:
形式为`E1 op= E2`的复合赋值表达式与`E1 = (T)((E1) op (E2))`,等效,其中`T``E1`的类型,不同之处在于`E1`仅被求值一次。
因此,可以有效地将我们的原始示例代码重写如下:
因此,可以有效地将我们的原始示例代码覆盖如下:
```java
int i = 5;
......
......@@ -40,7 +40,7 @@
* 为什么`String``HashMap`的好钥匙?
* 您将如何设计用作键的类?
* 您将重写`Key`类中的`hashCode()`方法吗? 有什么影响?
* 您将覆盖`Key`类中的`hashCode()`方法吗? 有什么影响?
* 为可以作为`HashMap`关键对象的类编写语法?
#### 1.5 [关于`ConcurrentHashMap`的问题](//howtodoinjava.com/tag/concurrenthashmap/ "concurrenthashmap")
......
......@@ -162,7 +162,7 @@ final int hash;
* Java 接口应使用关键字“`implements`”实现; Java 抽象类应使用关键字“`extends`”来扩展。
* Java 类可以实现多个接口,但只能扩展一个抽象类。
* 接口是绝对抽象,不能实例化; Java 抽象类也无法实例化,但是可以在存在`main()`的情况下调用。 从 Java8 开始,您可以在接口中定义[**默认方法**](//howtodoinjava.com/java8/default-methods-in-java-8/)
* 抽象类比接口要快一些,因为接口涉及在 Java 中调用任何重写方法之前进行的搜索。 在大多数情况下,这并不是显着的差异,但是如果您正在编写时间紧迫的应用,那么您可能不想无所事事。
* 抽象类比接口要快一些,因为接口涉及在 Java 中调用任何覆盖方法之前进行的搜索。 在大多数情况下,这并不是显着的差异,但是如果您正在编写时间紧迫的应用,那么您可能不想无所事事。
## 何时覆盖`hashCode()`和`equals()`?
......@@ -171,7 +171,7 @@ final int hash;
`hashCode()`方法用于获取给定对象的唯一整数。 当此对象需要存储在类似数据结构的`HashTable`中时,该整数用于确定存储桶位置。 默认情况下,对象的`hashCode()`方法返回并以整数形式表示存储对象的内存地址。 顾名思义,
`equals()`方法用于简单地验证两个对象的相等性。 默认实现只是检查两个对象的对象引用以验证它们的相等性。
请注意,通常有必要在每次重写此方法时都重写`hashCode`方法,以维护`hashCode()`方法的常规约定,该约定规定相等的对象必须具有相等的哈希码。
请注意,通常有必要在每次覆盖此方法时都覆盖`hashCode`方法,以维护`hashCode()`方法的常规约定,该约定规定相等的对象必须具有相等的哈希码。
* `equals()`必须定义一个相等关系(它必须是**自反,对称和可传递**)。 另外,它必须是一致的(如果未修改对象,则它必须保持返回相同的值)。 此外,`o.equals(null)`必须始终返回`false`
* `hashCode()`也必须保持一致(如果未根据`equals()`修改对象,则它必须保持返回相同的值)。
......
......@@ -25,7 +25,7 @@
这就是为什么不可变类(例如`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")找到。
......
......@@ -114,7 +114,7 @@ public class Employee implements Serializable
#### 1.4)`@XmlType`
它将 Java 类或枚举类型映射到架构类型。 它定义了其子代的类型名称,名称空间和顺序。 它用于将架构中的元素与模型中的元素进行匹配。
它将 Java 类或枚举类型映射到架构类型。 它定义了其子代的类型名称,命名空间和顺序。 它用于将架构中的元素与模型中的元素进行匹配。
```java
@XmlRootElement(name = "employee")
......
# Java SAX 解析器 – 读取 XML 示例
# Java SAX 解析器 – 读取 XML 示例
> 原文: [https://howtodoinjava.com/xml/sax-parser-read-xml-example/](https://howtodoinjava.com/xml/sax-parser-read-xml-example/)
......
# 使用 StAX Parser 的 Java 读取 XML – 游标和迭代器 API
# 使用 Java StAX 解析器读取 XML – 游标和迭代器 API
> 原文: [https://howtodoinjava.com/xml/read-xml-stax-parser-cursor-iterator/](https://howtodoinjava.com/xml/read-xml-stax-parser-cursor-iterator/)
......
......@@ -126,7 +126,7 @@ XPath 数据模型中有七种节点:
XSLT 样式表几乎从未使用过命名空间节点。 **它们的存在主要是为了 XSLT 处理器的利益**
> 请记住,即使从技术上来说,名称空间的声明(例如 `xmlns:auth="http://www.authors.net"`)在 XML 源中仍是一个属性,但它成为名称空间节点,而不是属性节点。
> 请记住,即使从技术上来说,命名空间的声明(例如 `xmlns:auth="http://www.authors.net"`)在 XML 源中仍是一个属性,但它成为命名空间节点,而不是属性节点。
## 3\. XPath 数据类型
......@@ -160,7 +160,7 @@ XPath 使用 UNIX 和[正则表达式](https://en.wikipedia.org/wiki/Regular_exp
**谓词用于查找特定节点或包含特定值的节点。** *谓词始终嵌入在方括号中。*
我们将在下一节中学习如何使用它们。
#### 4.3 使用 xpath 到达未知节点
#### 4.3 使用 xpath 访问未知节点
**XPath 通配符**可用于选择未知的 XML 元素。
......@@ -184,9 +184,9 @@ XPath 使用 UNIX 和[正则表达式](https://en.wikipedia.org/wiki/Regular_exp
| `descendant-or-self` | 选择当前节点的所有后代(子代,孙代等)和当前节点本身 |
| `following` | 选择当前节点的结束标记之后的文档中的所有内容 |
| `following-sibling` | 选择当前节点之后的所有同级 |
| `namespace` | 选择当前节点的所有名称空间节点 |
| `namespace` | 选择当前节点的所有命名空间节点 |
| `parent` | 选择当前节点的父节点 |
| `preceding` | 选择出现在文档中当前节点之前的所有节点,但祖先,属性节点和名称空间节点除外 |
| `preceding` | 选择出现在文档中当前节点之前的所有节点,但祖先,属性节点和命名空间节点除外 |
| `preceding-sibling` | 选择当前节点之前的所有同级 |
| `self` | 选择当前节点 |
......
# Java XPath `NamespaceContext` – 名称空间解析示例
# Java XPath `NamespaceContext` – 命名空间解析示例
> 原文: [https://howtodoinjava.com/xml/xpath-namespace-resolution-example/](https://howtodoinjava.com/xml/xpath-namespace-resolution-example/)
在此 Java 示例中,我们将使用[`NamespaceContext`](https://docs.oracle.com/javase/7/docs/api/javax/xml/namespace/NamespaceContext.html)将 XPath 名称空间解析学习为 XML 文件,该文件具有名称空间声明和各自的用法。
在此 Java 示例中,我们将使用[`NamespaceContext`](https://docs.oracle.com/javase/7/docs/api/javax/xml/namespace/NamespaceContext.html)将 XPath 命名空间解析学习为 XML 文件,该文件具有命名空间声明和各自的用法。
## 命名空间添加了 XML 文件
## 添加了 XML 文件的命名空间
我已经创建了`sample.xml`文件并将其放在类路径中。
......@@ -20,9 +20,9 @@
```
## 实现`NamespaceContext`以创建名称空间解析器
## 实现`NamespaceContext`以创建命名空间解析器
名称空间解析器可以与使用了名称空间定义的任何 XML 文件一起使用。 它搜索 XML 文档本身内任何给定名称空间前缀(作为参数传递)的名称空间声明。 因此**无需单独创建名称空间映射**
命名空间解析器可以与使用了命名空间定义的任何 XML 文件一起使用。 它搜索 XML 文档本身内任何给定命名空间前缀(作为参数传递)的命名空间声明。 因此**无需单独创建命名空间映射**
```java
public class NamespaceResolver implements NamespaceContext
......
......@@ -6,7 +6,7 @@
我正在使用 [**jdom**](https://mvnrepository.com/artifact/org.jdom "jdom jar")[**jaxen**](http://www.java2s.com/Code/Jar/j/Downloadjaxen111jar.htm "jaxen jar")。 这些也是可用的其他大量开源 API,但是想法保持不变。
## Java 程序使用 XPath 从 Java 中获得值
## 使用 XPath 从 Java 中获得值的 Java 程序
在给定的 Java 程序下面,从提供的 XML 字符串创建 DOM 对象。 然后,它使用`XPath.selectNodes()`方法应用 XPATH 表达式。
......
......@@ -110,7 +110,7 @@
| 获取其 ID 包含“1”的员工 | `/employees/employee[contains(@id,'1')]/firstName/text()` | `[Lokesh, Gary]` |
| 获取其 ID 包含 1 的员工 | `descendant-or-self::*[contains(@id,'1')]/firstName/text()` | `[Lokesh, Gary]` |
## 2\. Java 示例使用 xpath 查找具有属性值的 xml 元素
## 2\. 使用 xpath 查找具有属性值的 xml 元素的 Java 示例
我们来看一下用于求值以上 xpath 表达式以选择具有特定属性值的节点的代码。
......
# 创建 Eclipse 模板以加快 Java 编
# 创建 Eclipse 模板以加快 Java 编
> 原文: [https://howtodoinjava.com/eclipse/create-eclipse-templates-for-faster-java-coding/](https://howtodoinjava.com/eclipse/create-eclipse-templates-for-faster-java-coding/)
......@@ -114,7 +114,7 @@ try (BufferedWriter out = Files.newBufferedWriter(Paths.get(${fileName:var(Strin
```
## 2)XML I / O 模板
## 2)XML I/O 模板
以下模板用于读取 xml 文件或字符串并返回 DOM。
......
......@@ -84,7 +84,7 @@ openFile
```
## 温馨提示:在`eclipse.ini`中使用`-Xverify:none`,`-Xquickstart`和 `-server OR -client`
## 温馨提示:在`eclipse.ini`中使用`-Xverify:none`,`-Xquickstart`和 `-server`或`-client`
##### `-Xquickstart`
......@@ -94,7 +94,7 @@ openFile
如果要在类加载期间跳过类验证阶段,可以使用`-Xverify:none`。 使用`-Xverify:none`将禁用 Java 类验证,这可以将启动时间缩短 10-15%。 但是,指定此选项时,不会检测到损坏或无效的类数据。 如果加载了损坏的类数据,则 Java 虚拟机(JVM)可能会以意外的方式运行,或者 JVM 可能会失败。 但这只有在您自己修改字节码时才会发生。
##### `-server OR -client`
##### `-server`或`-client`
基于 Sun 的 Java 开发工具包(JDK)1.4.2 版中的 Java HotSpot 技术引入了一种自适应 JVM,其中包含用于随着时间的推移优化字节代码执行的算法。 JVM 以两种模式运行`-server``-client`。 如果使用默认的`-client`模式,将有更快的启动时间和较小的内存占用,但扩展性能较低。 如果允许 HotSpot JVM 通过连续执行字节代码来预热足够的时间,则可以使用`-server`模式来提高性能。 在大多数情况下,请使用`-server`模式,该模式可在更长的时间内产生更有效的运行时执行。 您可以监视进程大小和服务器启动时间,以检查`-client``-server`之间的差异。
......
......@@ -37,7 +37,7 @@ public class Test {
```
## 是方法重写还是方法隐藏?
## 是方法覆盖还是方法隐藏?
1. 上面的代码将成功编译,而不会发出警告或错误。 **方法隐藏**就是这种情况,子类的静态方法从超类隐藏了静态方法。
2. 如果我们从子类的显示方法中删除`static`关键字,则编译器会报错您**无法覆盖超类的静态方法**
......
......@@ -57,7 +57,7 @@
与“集中式 VCS”相比,“分布式 VCS”具有高度可扩展性,尤其是在开源项目中,该项目中数百万开发人员做出了贡献,而传统的版本控制系统无法完成这项任务。
#### 开源
#### 开源
Git 是开源的,免费的。 此外,开发人员可以在各种平台(如 Github)上从事开源项目。
......
......@@ -65,7 +65,7 @@ Tomcat 架构
上下文是一组称为容器的 Tomcat 组件的最里面的元素,它**代表单个 Web 应用**。 Tomcat 在加载应用时自动实例化并配置标准上下文。 作为配置的一部分,Tomcat 还处理应用文件夹的`\WEB-INF\web.xml`文件中定义的属性,并使这些属性可用于应用。
#### 连接器(16-19 行)
#### 连接器(16-19 行)
**连接器处理与客户端的通信。** Tomcat 提供了多个连接器,例如 HTTP 连接器用于大多数 HTTP 通信,AJP 连接器实现将 Tomcat 连接到另一个 Web 服务器(例如 Apache HTTPD 服务器)时使用的 AJP 协议。
......@@ -105,7 +105,7 @@ Tomcat 的默认配置包括名为 **localhost** 的主机。 可以通过在文
现在,让我们讨论以上`server.xml`中使用的其他一些概念。
#### 监听器(3-7 行)
#### 监听器(3-7 行)
监听器是一个 Java 对象,通过实现`org.apache.catalina.LifecycleListener`接口,它可以响应特定的事件。
......@@ -119,7 +119,7 @@ Tomcat 的默认配置包括名为 **localhost** 的主机。 可以通过在文
`GlobalNamingResources`元素只能在服务器组件内部定义。 **它定义了整个服务器都可以访问的 JNDI 资源。** 默认`server.xml`中定义的唯一资源是通过文件`conf/tomcat-users.xml`定义的基于用户和密码存储的数据库。
#### 领域(21-24 行)
#### 领域(21-24 行)
领域组件可以出现在任何容器组件(引擎,主机和上下门)内。 **它代表用户,密码和用户角色的数据库。 其目的是支持基于容器的认证。**
......
# Spring,Tomcat – 在负载均衡器后面获取真实 IP
# Spring,Tomcat – 获取负载均衡器后面的真实 IP
> 原文: [https://howtodoinjava.com/tomcat/tomcat-get-real-ip-behind-load-balancer/](https://howtodoinjava.com/tomcat/tomcat-get-real-ip-behind-load-balancer/)
......
......@@ -17,7 +17,7 @@ Swagger2 Annotations
Demo
```
## 昂首阔步
## Swagger
Swagger(现为“Open API Initiative”)是一种规范和框架,用于使用所有人都可以理解的通用语言来描述 REST API。 还有其他一些流行的框架,例如 RAML,Summation 等。但是,考虑到它的功能和在开发者社区中的接受程度,Swagger 在这一点上最受欢迎。
......
......@@ -169,7 +169,7 @@ public enum EnumSingleton {
```
## 6.将 `readResolve()`添加到单例对象
## 6.将`readResolve()`添加到单例对象
到目前为止,您必须已经决定如何实现单例。 现在,让我们看看即使在面试中也可能出现的其他问题。
......
......@@ -226,7 +226,7 @@ Temp1truefriend
```
## 构建者模式的优点和优点
## 构建器模式的优点和好处
毫无疑问,在构建器模式中,**代码行数增加了**至少增加了一倍,但是在**设计灵活性**和更多**可读代码**方面,努力得到了回报 。 构造器的**参数被简化**,并在**高可读性方法调用**中提供。
......@@ -236,7 +236,7 @@ Temp1truefriend
最后,我可以在对象构建过程中构建**不可变对象**,而无需太多复杂的逻辑。
## 构建器模式的成本与劣势
## 构建器模式的成本与缺点
尽管构建器模式减少了一些代码行,从而消除了使用设置器方法的需要,但仍然**通过引入构建器对象使总行数**翻了一番。 此外,尽管客户代码更具可读性,但客户代码也更为冗长。 虽然对我而言,可读性比代码行更重要。
......
......@@ -147,7 +147,7 @@ public class SedanCar extends Car {
```
#### 2.3 工厂创建对象
#### 2.3 创建对象的工厂
`CarFactory.java`是我们使用工厂模式实现的主要类。 仅在确定实例类型之后,才会实例化实例。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册