From 450c3f6d978c5b091785fc98d9fd1cf2ec369fc2 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Fri, 23 Mar 2018 21:31:09 +0800 Subject: [PATCH] auto commit --- notes/Java 容器.md | 66 +++++++++++++++++++++++++++++++++++-------- pics/Iterator-1.jpg | Bin 0 -> 28672 bytes 2 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 pics/Iterator-1.jpg diff --git a/notes/Java 容器.md b/notes/Java 容器.md index f660fa59..a9125742 100644 --- a/notes/Java 容器.md +++ b/notes/Java 容器.md @@ -45,7 +45,7 @@ - LinkedList:可以用它来支持双向队列; -- PriorityQueue 是基于堆结构实现。 +- PriorityQueue 是基于堆结构实现,可以用它来实现优先级队列。 ## Map @@ -57,8 +57,6 @@ - TreeMap:基于红黑树实现。 -- ConcurrentHashMap:线程安全 Map,不涉及类似于 HashTable 的同步加锁。 - ## Java 1.0/1.1 容器 对于旧的容器,我们决不应该使用它们,只需要对它们进行了解。 @@ -71,9 +69,22 @@ ## 迭代器模式 -从概览图可以看到,每个集合类都有一个 Iterator 对象,可以通过这个迭代器对象来遍历集合中的元素。 +

-[Java 中的迭代器模式](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md#1-%E8%BF%AD%E4%BB%A3%E5%99%A8%E6%A8%A1%E5%BC%8F) +Collection 实现了 Iterable 接口,其中的 iterator() 方法能够产生一个 Iterator 对象,通过这个对象就可以迭代遍历 Collection 中的元素。 + +从 JDK 5 之后可以使用 foreach 方法来遍历实现了 Iterable 接口的聚合对象。 + +```java +List list = new ArrayList<>(); +list.add("a"); +list.add("b"); +for (String item : list) { + System.out.println(item); +} +``` + +> [迭代器模式](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md#%E5%8D%81%E4%BA%8C%E8%BF%AD%E4%BB%A3%E5%99%A8%E6%A8%A1%E5%BC%8F) ## 适配器模式 @@ -85,19 +96,51 @@ java.util.Arrays#asList() 可以把数组类型转换为 List 类型。 list = Arrays.asList(arr); ``` +> [适配器模式](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md#%E5%8D%81%E9%80%82%E9%85%8D%E5%99%A8%E6%A8%A1%E5%BC%8F) + # 三、散列 -使用 hasCode() 来返回散列值,使用的是对象的地址。 +hasCode() 返回散列值,使用的是对象的地址。 而 equals() 是用来判断两个对象是否相等的,相等的两个对象散列值一定要相同,但是散列值相同的两个对象不一定相等。 相等必须满足以下五个性质: -1. 自反性 -2. 对称性 -3. 传递性 -4. 一致性(多次调用 x.equals(y),结果不变) -5. 对任何不是 null 的对象 x 调用 x.equals(null) 结果都为 false +**1. 自反性** + +```java +x.equals(x); // true +``` + +**2. 对称性** + +```java +x.equals(y) == y.equals(x) // true +``` + +**3. 传递性** + +```java +if x.equals(y) && y.equals(z) { + x.equals(z); // true; +} +``` + +**4. 一致性** + +多次调用 equals() 方法结果不变 + +```java +x.equals(y) == x.equals(y) == x.equals(y) == x.equals(y); // true +``` + +**5. 与 null 的比较** + +对任何不是 null 的对象 x 调用 x.equals(null) 结果都为 false + +```java +x.euqals(null); // false; +``` # 四、源码分析 @@ -423,3 +466,4 @@ private V putForNullKey(V value) { - Java 编程思想 - [Java Collection Framework](https://www.w3resource.com/java-tutorial/java-collections.php) +- [Iterator 模式](https://openhome.cc/Gossip/DesignPattern/IteratorPattern.htm) diff --git a/pics/Iterator-1.jpg b/pics/Iterator-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f9f818c6c6b6daf939bcc0faad4b9c7d5f80c2a4 GIT binary patch literal 28672 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 EDnjQw?qt7U!v$iQpu#B*j# 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