株洲阿里云代理商是指阿里云的一个代理商机构,提供阿里云产品的代理和销售服务。而”ArrayMap”是一个 Android 框架中的一个数据结构,用于存储键值对的集合。
以下是 ArrayMap 的部分源码:
public class ArrayMap<K, V> {
private static final int BASE_SIZE = 4;
private static final int CACHE_SIZE = 10;
private int[] mHashes;
private Object[] mArray;
private int mSize;
public ArrayMap() {
mHashes = ContainerHelpers.EMPTY_INTS;
mArray = ContainerHelpers.EMPTY_OBJECTS;
mSize = 0;
}
public int size() {
return mSize;
}
public V put(K key, V value) {
int hash = key == null ? 0 : key.hashCode();
int index = indexOfKey(hash);
if (index >= 0) {
return setValueAt(index, value);
}
index = ~index;
if (mSize >= mHashes.length) {
int n = mSize >= (BASE_SIZE * 2) ? (mSize + (mSize >> 1))
: (mSize >= BASE_SIZE ? (BASE_SIZE * 2) : BASE_SIZE);
int[] ohashes = mHashes;
Object[] oarray = mArray;
allocArrays(n);
if (mHashes.length > 0) {
System.arraycopy(ohashes, 0, mHashes, 0, ohashes.length);
System.arraycopy(
oarray, 0, mArray, 0, oarray.length);
}
freeArrays(ohashes, oarray, mSize);
}
if (index < mSize) {
System.arraycopy(mHashes, index, mHashes, index + 1,
mSize - index);
System.arraycopy(mArray, index, mArray, index + 1,
mSize - index);
}
mHashes[index] = hash;
mArray[index] = value;
mSize++;
return null;
}
private void allocArrays(int size) {
if (size == (BASE_SIZE * 2)) {
synchronized (ArrayMap.class) {
if (ArrayMap_HashFunctions.isSmall(mSize, 0, BASE_SIZE) &&
mSize < (BASE_SIZE * 2)) {
if (Cache.kArrayMapSizeErrorCache != null) {
mHashes = Cache.kArrayMapSizeErrorCache.mHashes;
mArray = Cache.kArrayMapSizeErrorCache.mArray;
// Reset everything in the cache since we're taking it
// over. Also reset the cache to a new object. (New
// objects are clearly smaller than 2 * BASE_SIZE.)
Cache.kArrayMapSizeErrorCache.mHashes = null;
Cache.kArrayMapSizeErrorCache.mArray = null;
Cache.kArrayMapSizeErrorCache = new Cache();
}
}
}
}
mHashes = new int[size];
mArray = new Object[size << 1];
}
private void freeArrays(int[] hashes, Object[] array, int size) {
if (Cache.kArrayMapSizeErrorCache != null) {
if (size == (BASE_SIZE * 2)) {
Cache.kArrayMapSizeErrorCache.mHashes = hashes;
Cache.kArrayMapSizeErrorCache.mArray = array;
}
}
mSize = size;
}
}
此源码为 ArrayMap 的简化版,仅显示了部分方法和变量。ArrayMap 通过使用两个数组 mHashes 和 mArray 来存储键值对,其中 mHashes 数组用于存储键的 hash 值,mArray 数组则用于存储键值对的实际数据。
ArrayMap 主要提供以下功能:
- put(): 将键值对存储到 ArrayMap 中。如果键已经存在,则更新对应的值;如果键不存在,则添加新的键值对。
- size(): 返回 ArrayMap 中键值对的数量。
注意:上述源码为简化版,实际 ArrayMap 的源码较为复杂,包含多个其他方法和内部类实现了不同的功能。完整的 ArrayMap 源码可以在 Android 源码中找到。
株洲阿里云代理商提供的ArrayMap源码如下:
package com.aliyun.demo;
import java.util.HashMap;
import java.util.Map;
public class ArrayMap<K, V> {
private Entry<K, V>[] table;
private int size;
public ArrayMap() {
table = new Entry[16];
size = 0;
}
public V get(K key) {
int hash = key.hashCode() % table.length;
Entry<K, V> entry = table[hash];
while(entry != null) {
if(entry.key.equals(key)) {
return entry.value;
}
entry = entry.next;
}
return null;
}
public void put(K key, V value) {
int hash = key.hashCode() % table.length;
Entry<K, V> entry = table[hash];
if(entry == null) {
table[hash] = new Entry<>(key, value);
size++;
} else {
while(entry.next != null) {
if(entry.key.equals(key)) {
entry.value = value;
return;
}
entry = entry.next;
}
if(entry.key.equals(key)) {
entry.value = value;
} else {
entry.next = new Entry<>(key, value);
size++;
}
}
}
public void remove(K key) {
int hash = key.hashCode() % table.length;
Entry<K, V> entry = table[hash];
Entry<K, V> prev = null;
while(entry != null) {
if(entry.key.equals(key)) {
if(prev == null) {
table[hash] = entry.next;
} else {
prev.next = entry.next;
}
size--;
return;
}
prev = entry;
entry = entry.next;
}
}
public int size() {
return size;
}
private static class Entry<K, V> {
private K key;
private V value;
private Entry<K, V> next;
public Entry(K key, V value) {
this.key = key;
this.value = value;
this.next = null;
}
}
}
这是一个简化的ArrayMap实现,用于存储键值对。该ArrayMap内部使用数组和链表来实现。具体实现方式如下:
- 内部类Entry定义了键值对的结构,包含了一个键key,一个值value,以及一个指向下一个Entry的指针next。
- ArrayMap类内部维护了一个Entry类型的数组table,用于存储实际的数据。
- put()方法用于将指定的键值对加入到ArrayMap中。首先根据key的hashCode值计算出存储位置,然后检查该位置上是否已经存在Entry。如果不存在,则直接加入;如果存在,则需要遍历链表来找到对应的Entry,如果找到则更新value,否则插入到链表末尾。
- get()方法根据key查找对应的value。首先根据key的hashCode值计算出存储位置,然后遍历链表来找到对应的Entry并返回其value。
- remove()方法根据key删除对应的键值对。首先根据key的hashCode值计算出存储位置,然后遍历链表来找到对应的Entry并从链表中删除。
- size()方法返回ArrayMap中键值对的个数。
请注意,这只是一个简单的ArrayMap实现,用于演示和理解ArrayMap的基本原理。实际上,Android平台上的ArrayMap实现更为复杂和高效。
发布者:luotuoemo,转转请注明出处:https://www.jintuiyun.com/115812.html