株洲阿里云代理商:ArrayMap源码

株洲阿里云代理商是指阿里云的一个代理商机构,提供阿里云产品的代理和销售服务。而”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源码

株洲阿里云代理商提供的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

(0)
luotuoemo的头像luotuoemo
上一篇 2023年12月28日 12:19
下一篇 2023年12月28日 12:42

相关推荐

  • 杭州阿里巴巴云计算园区

    想知道: 杭州市 阿里云计算有限公司 在哪 备案是免费的。 请先到备案后台提交资料,再根据要求当面拍照。如不方便当面拍照,可索取幕布自行拍照。 可以找咱们帮你。 想知道: 杭州市杭州阿里巴巴西溪园区离哪里地铁站口最近在哪? 展开全部目前是武林门站离园区近6km 我想问一下杭州阿里巴巴具体在哪个位置? 阿里巴巴杭州总部中国杭州市滨江区网商路699号滨江新园区 …

    2023年8月25日
    20200
  • 阿里云企业邮箱:如何减少邮件干扰?

    阿里云企业邮箱:如何减少邮件干扰? 随着电子邮件逐渐成为企业沟通的重要工具,越来越多的企业开始选择使用阿里云企业邮箱,来提升工作效率、保障信息安全。然而,电子邮件的使用也伴随着一定的干扰问题,尤其是垃圾邮件、广告邮件以及无关信息的频繁出现,这些都会影响到企业员工的工作效率和信息流畅性。那么,如何利用阿里云企业邮箱来减少邮件干扰呢?本文将结合阿里云企业邮箱的特…

    2025年4月16日
    5700
  • 桂林阿里云企业邮箱代理商:阿里邮箱收件服务器和发件服务器

    桂林阿里云企业邮箱代理商:阿里邮箱收件服务器和发件服务器 阿里云企业邮箱优势 桂林阿里云企业邮箱代理商提供的阿里云企业邮箱具有许多优势,使其成为一种理想的选择。以下是一些主要的优势: 安全性 阿里云企业邮箱采用先进的安全技术,保护用户的数据免受恶意攻击和黑客入侵。它提供多层次的身份验证和加密功能,确保邮件和附件的机密性。 稳定性 阿里云企业邮箱部署在高性能的…

    2024年2月4日
    19700
  • 阿里云服务器到底能干嘛

    阿里云服务器可以用于各种用途,包括但不限于以下几种: 1.网站托管:你可以使用阿里云服务器来托管你的网站,提供稳定可靠的访问服务。 2.数据库服务:阿里云服务器支持各种数据库软件,并提供高可用、高性能的数据库服务。 3.应用开发和测试:你可以在阿里云服务器上搭建开发环境,进行应用程序的开发和测试。 4.数据备份和存储:你可以将重要数据备份到阿里云服务器,并且…

    2023年10月25日
    19600
  • 西双版纳阿里云企业邮箱代理商:苹果手机登录阿里邮箱设置服务器

    西双版纳阿里云企业邮箱代理商:苹果手机登录阿里邮箱设置服务器 阿里云企业邮箱是一种专为企业用户定制的高效、安全、稳定的企业邮件解决方案。作为阿里巴巴旗下的产品,它融合了阿里集团多年来的技术积淀和经验,提供了一系列强大的功能和优势。 优势一:稳定可靠 阿里云企业邮箱采用分布式部署架构,拥有多个数据中心,并且采用了全球领先的云计算技术,保障了系统的稳定性和可靠性…

    2024年2月2日
    20400

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

4000-747-360

在线咨询: QQ交谈

邮件:ixuntao@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
购买阿里云服务器请访问:https://www.4526.cn/