ArrayMap Class

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 public class ArrayMap<K, V> {
 5     private List<K> keys;
 6     private List<V> values;
 7 
 8     public ArrayMap() {
 9         keys = new ArrayList<>();
10         values = new ArrayList<>();
11     }
12 
13     public void put(K key, V value) {
14         int index = keys.indexOf(key);
15         if (index != -1) {
16             values.set(index, value);
17         } else {
18             keys.add(key);
19             values.add(value);
20         }
21     }
22 
23     public boolean containsKey(K key) {
24         return keys.contains(key);
25     }
26 
27     public V get(K key) {
28         int index = keys.indexOf(key);
29         if (index != -1) {
30             return values.get(index);
31         }
32         return null;
33     }
34 
35     public List<K> keys() {
36         return new ArrayList<>(keys);
37     }
38 
39     public int size() {
40         return keys.size();
41     }
42 }
public class Main {
    public static void main(String[] args) {
        ArrayMap<String, Integer> map = new ArrayMap<>();

        map.put("apple", 1);
        map.put("banana", 2);
        map.put("cherry", 3);

        System.out.println("Contains key 'banana': " + map.containsKey("banana"));
        System.out.println("Contains key 'grape': " + map.containsKey("grape"));

        System.out.println("Value for key 'apple': " + map.get("apple"));
        System.out.println("Value for key 'orange': " + map.get("orange"));

        System.out.println("Keys: " + map.keys());
        System.out.println("Size: " + map.size());
    }
}

output:

Contains key 'banana': true
Contains key 'grape': false
Value for key 'apple': 1
Value for key 'orange': null
Keys: [apple, banana, cherry]
Size: 3

当你使用ArrayMap类时,你创建了一个键值对的映射表。在ArrayMap内部,它使用两个ArrayList来存储键和值,保持了键值对的对应关系。

这是ArrayMap类的主要实现细节:

1. 成员变量:
- `keys`:一个ArrayList,用于存储键。
- `values`:一个ArrayList,用于存储值。

2. 构造函数:
- 构造函数初始化了`keys`和`values`,创建了空的ArrayList对象。

3. `put()`方法:
- `put()`方法用于将键值对添加到ArrayMap中,或者更新已存在的键的值。
- 它首先通过调用`indexOf()`方法查找键在`keys`列表中的索引。
- 如果索引不为-1,说明键已存在,我们将在`values`列表中相同索引位置的值进行更新。
- 如果索引为-1,说明键是一个新的键,我们将键添加到`keys`列表末尾,并在`values`列表中添加对应的值。

4. `containsKey()`方法:
- `containsKey()`方法用于检查ArrayMap是否包含指定的键。
- 它调用`contains()`方法来检查`keys`列表中是否包含给定的键,如果包含则返回true,否则返回false。

5. `get()`方法:
- `get()`方法用于根据键获取相应的值。
- 它首先通过调用`indexOf()`方法查找键在`keys`列表中的索引。
- 如果索引不为-1,说明键存在,我们将返回在`values`列表相同索引位置的值。
- 如果索引为-1,说明键不存在,我们返回null。

6. `keys()`方法:
- `keys()`方法返回一个包含所有键的新的ArrayList副本。
- 这样做是为了防止外部代码修改ArrayMap的内部键列表。

7. `size()`方法:
- `size()`方法返回ArrayMap中键的数量,即`keys`列表的大小。

这些方法使得你能够添加、更新、检索键值对,检查键是否存在,并获取所有键和键的数量。通过使用ArrayList来存储键和值,ArrayMap实现了简单的键值对映射功能。

 

 

在Java中,`List` 是一个接口,而 `ArrayList` 是 `List` 接口的一个具体实现类。它们之间有一些不同之处:

1. 实现关系:
- `List` 是一个接口,定义了列表的通用行为和方法。它是许多其他列表实现类(如 `ArrayList`、`LinkedList` 等)的父接口。
- `ArrayList` 是 `List` 接口的一个具体实现类,它实现了 `List` 接口中定义的方法,提供了一种基于数组的动态列表。

2. 底层数据结构:
- `List` 接口本身不涉及底层数据结构的具体实现,它只定义了对列表进行操作的方法。
- `ArrayList` 使用数组作为其底层数据结构来存储元素,因此它具有通过索引快速访问元素的优势。

3. 动态扩展:
- `ArrayList` 是动态扩展的,它可以根据需要自动增加其内部数组的容量来容纳更多的元素。这意味着在添加或插入元素时,`ArrayList` 可能会重新分配内部数组的大小。

4. 线程安全性:
- `List` 接口本身并不保证线程安全性,因此在多线程环境下使用时需要进行额外的同步处理。
- `ArrayList` 不是线程安全的,如果多个线程同时访问和修改同一个 `ArrayList` 实例,可能会导致并发问题。如果需要在多线程环境下使用列表,可以考虑使用 `Vector`、`CopyOnWriteArrayList` 等线程安全的列表实现。

总结:
`List` 是一个接口,定义了列表的通用行为和方法。`ArrayList` 是 `List` 接口的具体实现类,使用数组作为底层数据结构,提供了动态扩展的能力。`ArrayList` 是最常用的列表实现之一,它具有快速随机访问元素的能力,但在多线程环境中需要额外的同步措施。除了 `ArrayList`,Java还提供了其他实现了 `List` 接口的类,如 `LinkedList`、`Vector` 等,它们在不同的场景中具有不同的特点和用途。

 

在ArrayMap中,为了更好地适应不同的实现和提供更大的灵活性,选择使用List而不是具体的ArrayList来定义`keys`。这样做的好处是,使用List作为类型,我们可以在需要时更轻松地更改实现类,例如将ArrayList更改为LinkedList或其他实现List接口的类,而无需更改ArrayMap的其余部分。

通过使用List作为类型,ArrayMap不会对具体的实现类做出任何假设。这使得我们可以更容易地切换实现类,根据具体的需求和场景选择最合适的列表实现。

此外,使用List还有助于提高代码的可读性和可维护性。通过将`keys`声明为List类型,我们明确了ArrayMap类需要一个键的列表,但不关心具体的实现细节。这使得代码更加灵活和可扩展,同时也提供了更好的代码抽象和封装。

综上所述,使用List而不是具体的ArrayList来定义`keys`是一种设计选择,它提供了更大的灵活性和可扩展性,同时保持了代码的可读性和可维护性。

posted @ 2023-05-15 16:58  哎呦_不想学习哟~  阅读(52)  评论(0)    收藏  举报