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`是一种设计选择,它提供了更大的灵活性和可扩展性,同时保持了代码的可读性和可维护性。

浙公网安备 33010602011771号