![Solution using visitor pattern](img/e6edffc1348f322b944f93c38e03d38c.png"Solution using visitor pattern")
...
...
@@ -70,7 +70,7 @@ Solution using visitor pattern
在上面的类图中,我们为 Mac 和 Linux 操作系统配置了路由器。 如果我们还需要添加 Windows 功能,那么我不需要更改任何类,只需定义一个新的访问者 WindowsConfigurator 并实现 RouterVisitor 接口中定义的 visit()方法。 它将提供所需的功能,而无需任何进一步的修改。
在上面的类图中,我们为 Mac 和 Linux 操作系统配置了路由器。 如果我们还需要添加 Windows 功能,那么我不需要更改任何类,只需定义一个新的访问者 WindowsConfigurator 并实现 RouterVisitor 接口中定义的 visit()方法。 它将提供所需的功能,而无需任何进一步的修改。
上面的解决方案明显违反了 [**SMART 类别设计**](//howtodoinjava.com/best-practices/5-class-design-principles-solid-in-java/"SMART principles for class design") 中提到的**打开/关闭原则**。
#### [使用 ToStringBuilder](//howtodoinjava.com/apache-commons/how-to-override-tostring-effectively-with-tostringbuilder/ "How to override toString() effectively with ToStringBuilder") 有效覆盖 toString()
#### [使用 ToStringBuilder](//howtodoinjava.com/apache-commons/how-to-override-tostring-effectively-with-tostringbuilder/ "How to override toString() effectively with ToStringBuilder") 有效覆盖 toString()
ToStringBuilder 是 apache commons lang 库提供的实用程序类。 学习使用它编写高度自定义的 toString()方法。
ToStringBuilder 是 apache commons lang 库提供的实用程序类。 学习使用它编写高度自定义的 toString()方法。
#### [在任何循环内使用数组代替 Vector.elementAt()](//howtodoinjava.com/best-practices/use-array-instead-of-vector-elementat-inside-any-loop-for-better-performance/ "Use array instead of Vector.elementAt() inside any loop for better performance")
#### [在任何循环内使用数组代替 Vector.elementAt()](//howtodoinjava.com/best-practices/use-array-instead-of-vector-elementat-inside-any-loop-for-better-performance/ "Use array instead of Vector.elementAt() inside any loop for better performance")
#### [在 Java 中始终使用 length()而不是 equals()来检查空字符串](//howtodoinjava.com/java/string/always-use-length-instead-of-equals-to-check-empty-string-in-java/ "Always use length() instead of equals() to check empty string in java")
#### [在 Java 中始终使用 length()而不是 equals()来检查空字符串](//howtodoinjava.com/java/string/always-use-length-instead-of-equals-to-check-empty-string-in-java/ "Always use length() instead of equals() to check empty string in java")
因此,对于`s`和`t`中的任何两个字符串,当且仅当`s.equals(t)`为`true`时,`s.intern() == t.intern()`才为`true`。 意味着如果 s 和 t 都是不同的字符串对象,并且具有相同的字符序列,则在这两个变量上调用 intern()将导致两个变量引用的单个字符串池文字。
因此,对于`s`和`t`中的任何两个字符串,当且仅当`s.equals(t)`为`true`时,`s.intern() == t.intern()`才为`true`。 意味着如果 s 和 t 都是不同的字符串对象,并且具有相同的字符序列,则在这两个变量上调用 intern()将导致两个变量引用的单个字符串池文字。
那么,您真的需要非常深入地了解字符串池的概念,才能回答此问题或类似问题。 我的建议..关于[字符串类和字符串池](//howtodoinjava.com/java/string/interview-stuff-about-string-class-in-java/"String pool concepts")的“认真学习”。
@@ -17,11 +17,11 @@ Explain transient and volatile keywords in java?
DifferencebetweenIteratorandListIterator?
```
## 为什么要避免使用 finalize()方法?
## 为什么要避免使用 finalize()方法?
我们都知道,在回收分配给对象的内存之前,垃圾收集器线程会调用[`finalize()`](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#finalize--)方法的基本声明。 请参阅此程序的[,该程序证明根本不能保证`finalize()`调用。 其他原因可能是:](//howtodoinjava.com/java/related-concepts/why-not-to-use-finalize-method-in-java/"Why not to use finalize() method in java")
[在此处了解有关同步的更多信息。](//howtodoinjava.com/java/multi-threading/thread-synchronization-object-level-locking-and-class-level-locking/"Thread synchronization, object level locking and class level locking")
[在此处阅读更多有趣的事实以及指南。](//howtodoinjava.com/java/related-concepts/working-with-hashcode-and-equals-methods-in-java/"Working with hashCode and equals methods in java")
[在此处详细了解垃圾收集。](//howtodoinjava.com/java/garbage-collection/revisiting-memory-management-and-garbage-collection-mechanisms-in-java/"Revisiting memory management and garbage collection mechanisms 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") 不变的东西。
`@XmlRootElement`将类或[枚举类型](https://howtodoinjava.com/java/enum/guide-for-understanding-enum-in-java/)映射到 XML 元素。 当使用`@XmlRootElement`批注注释顶级类或枚举类型时,则其值在 XML 文档中表示为 XML 元素。
`@XmlRootElement`将类或[枚举类型](https://howtodoinjava.com/java/enum/guide-for-understanding-enum-in-java/)映射到 XML 元素。 当使用`@XmlRootElement`注解注释顶级类或枚举类型时,则其值在 XML 文档中表示为 XML 元素。
*[java.sql.DriverManager#getConnection()](https://docs.oracle.com/javase/10/docs/api/java/sql/DriverManager.html#getConnection%28java.lang.String%29"driver manager get connection")
*[java.net.URL#openConnection()](https://docs.oracle.com/javase/10/docs/api/java/net/URL.html#openConnection%28%29"url open connection")
*[java.lang.Class#newInstance()](https://docs.oracle.com/javase/10/docs/api/java/lang/Class.html#newInstance%28%29"class new instance")
*[java.sql.DriverManager#getConnection()](https://docs.oracle.com/javase/10/docs/api/java/sql/DriverManager.html#getConnection%28java.lang.String%29"driver manager get connection")
*[java.net.URL#openConnection()](https://docs.oracle.com/javase/10/docs/api/java/net/URL.html#openConnection%28%29"url open connection")
*[java.lang.Class#newInstance()](https://docs.oracle.com/javase/10/docs/api/java/lang/Class.html#newInstance%28%29"class new instance")