网龙Java面试题解析

一、问题描述

在网龙公司的Java面试中,常常会涉及到关于集合类的问题。下面是一道经典的面试题:

请编写一个Java类,实现一个简单的缓存系统,要求具备以下功能:

  1. 缓存系统的大小有限,当缓存容量达到上限后,需要按照某种策略(如LRU)来淘汰最近最少使用的缓存项。
  2. 缓存项设定了一个过期时间,超过过期时间的缓存项需要被自动删除。

二、解决方案

为了实现上述功能,我们可以创建一个Cache类,并利用Java的集合类进行实现。

首先,我们需要定义一个CacheItem类,用于存储缓存项的信息,包括键、值、过期时间等。

public class CacheItem<V> {
    private String key;
    private V value;
    private long expireTime;

    // 构造函数
    public CacheItem(String key, V value, long expireTime) {
        this.key = key;
        this.value = value;
        this.expireTime = expireTime;
    }

    // getter和setter方法
    // ...
}

接下来,我们可以在Cache类中使用HashMap来存储缓存项,并定义一些方法来实现缓存的添加、查找、淘汰等功能。

import java.util.HashMap;
import java.util.Map;

public class Cache<V> {
    private Map<String, CacheItem<V>> cacheMap;
    private int capacity;

    // 构造函数
    public Cache(int capacity) {
        this.capacity = capacity;
        this.cacheMap = new HashMap<>();
    }

    // 添加缓存项
    public void put(String key, V value, long expireTime) {
        // 检查缓存容量是否已满
        if (cacheMap.size() >= capacity) {
            // 淘汰最近最少使用的缓存项
            evict();
        }

        // 创建新的缓存项并放入缓存中
        CacheItem<V> cacheItem = new CacheItem<>(key, value, expireTime);
        cacheMap.put(key, cacheItem);
    }

    // 查找缓存项
    public V get(String key) {
        CacheItem<V> cacheItem = cacheMap.get(key);
        if (cacheItem != null) {
            // 检查缓存项是否过期
            if (System.currentTimeMillis() < cacheItem.getExpireTime()) {
                return cacheItem.getValue();
            } else {
                // 缓存项已过期,删除缓存
                cacheMap.remove(key);
            }
        }
        return null;
    }

    // 淘汰缓存项
    private void evict() {
        // 根据某种策略(如LRU)来淘汰缓存项
        // ...
        // 这里省略具体的淘汰策略实现
    }
}

三、使用示例

现在,我们可以创建一个Cache对象,并使用其添加和查找功能来演示缓存系统的使用。

public class Main {
    public static void main(String[] args) {
        // 创建一个容量为3的缓存系统
        Cache<String> cache = new Cache<>(3);

        // 添加缓存项
        cache.put("key1", "value1", System.currentTimeMillis() + 1000);  // 过期时间为1秒
        cache.put("key2", "value2", System.currentTimeMillis() + 2000);  // 过期时间为2秒
        cache.put("key3", "value3", System.currentTimeMillis() + 3000);  // 过期时间为3秒

        // 查找缓存项
        String value1 = cache.get("key1");
        System.out.println("key1的值为:" + value1);

        // 等待缓存项过期
        try {
            Thread.sleep(1500);  // 等待1.5秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 再次查找缓存项
        String value2 = cache.get("key1");
        System.out.println("key1的值为:" + value2);
    }
}

四、总结

通过上述实现,我们可以看到如何使用Java的集合类来实现一个简单的缓存系统。该缓存系统具备限制容量、过