缓存数组,线程安全

该博客展示了一个线程安全的缓存数组类CacheList的实现。它提供了构造函数、数据存取、添加、删除、清除等方法,还支持数据删除时的回调。通过同步方法保证线程安全,可用于存储和管理数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * 缓存数组,线程安全
 *
 */
public class CacheList<T> {

    private T[] mValues;

    private int mMaxCount;
    private int mCount;
    private int mIndex;//index代表下一个位置

    private OnRemoveListener<T> mOnRemoveListener;

    /**
     * 构造函数
     *
     * @param values 存储数据的数组
     */
    public CacheList(@NonNull T[] values) {
        this(values, null);
    }

    /**
     * 构造函数
     *
     * @param values 存储数据的数组
     * @param l      当某个数据被删除时回调,回调线程为调用{@link #removeFirst()}、{@link #remove(int)}、{@link #removeCount(int)、{@link #clear()}函数的线程
     */
    public CacheList(@NonNull T[] values, OnRemoveListener<T> l) {
        this.mValues = values;
        this.mMaxCount = values.length;
        this.mOnRemoveListener = l;
    }

    /**
     * 取出数组里的第一个
     */
    public synchronized T getFirst() {
        return get(0);
    }

    /**
     * 获得index的数据
     *
     * @param index 索引
     */
    public synchronized T get(int index) {
        if (index < 0 || index >= mCount) {
            return null;
        }
        return mValues[getRealIndex(index)];
    }

    /**
     * 添加到最后
     *
     * @param value 值
     */
    public synchronized void add(T value) {
        if (mCount == mMaxCount) {
            if (mOnRemoveListener != null) {
                mOnRemoveListener.onRemove(true, mValues[mIndex]);
            }
            mCount--;
        }
        mValues[mIndex++] = value;
        if (mIndex >= mMaxCount) {
            mIndex = 0;
        }
        mCount++;
    }

    /**
     * 删除第一个
     */
    public synchronized T removeFirst() {
        return remove(0);
    }

    /**
     * 删除索引的数据
     *
     * @param index 索引
     */
    public synchronized T remove(int index) {
        if (index >= mCount) {
            return null;
        }
        int realIndex = getRealIndex(index);
        T value = mValues[realIndex];

        int i;
        if (index < mCount / 2) {
            for (i = index; i > 0; i--) {
                mValues[getRealIndex(i)] = mValues[getRealIndex(i - 1)];
            }
        } else {
            for (i = index; i < mCount; i++) {
                mValues[getRealIndex(i)] = mValues[getRealIndex(i + 1)];
            }
        }
        mValues[getRealIndex(i)] = null;
        mCount--;

        if (mOnRemoveListener != null) {
            mOnRemoveListener.onRemove(false, value);
        }

        return value;
    }

    /**
     * 从第一个开始删除到count个
     *
     * @param count 数量
     */
    public synchronized void removeCount(int count) {
        if (count > mCount) {
            count = mCount;
        }
        for (int i = 0; i < count; i++) {
            int index = getRealIndex(i);
            if (mOnRemoveListener != null) {
                mOnRemoveListener.onRemove(false, mValues[index]);
            }
            mValues[index] = null;
        }

        mCount -= count;
    }

    /**
     * 清除所有
     */
    public synchronized void clear() {
        removeCount(mCount);
    }

    /**
     * 获得大小
     */
    public synchronized int size() {
        return mCount;
    }

    /**
     * 是否为空
     */
    public synchronized boolean isEmpty() {
        return mCount == 0;
    }

    private int getRealIndex(int index) {
        int realIndex = mIndex - mCount + index;
        if (realIndex < 0) {
            return mMaxCount + realIndex;
        } else {
            return realIndex;
        }
    }

    public interface OnRemoveListener<T> {
        void onRemove(boolean isOverflow, T value);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hanyang Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值