1. Collection和Set的区别?

Set是内容不重复的Collection,继承了Collection接口

2. Map是不是Collection?

Map是一种映射关系(两个集合间的对应关系),不是Collection

3. TreeMap和HashMap的区别?

TreeMap是通过树来实现的映射,是有序的,不允许null;HashMap是通过hash表来实现的映射,无序,允许null

4. HashMap vs HashTable

HashTable是线程安全的,通过synchronized关键字实现同步,不允许为null;HashMap是线程不安全的,允许为null

5. 实现Key-Value的LRU缓存

  1. import java.util.Iterator;
  2. import java.util.LinkedHashMap;
  3. import java.util.stream.Collectors;
  4. import java.util.stream.StreamSupport;
  5. public class LRUCache<K, V> implements Iterable<K>{
  6. private final int max = 3;
  7. private final LinkedHashMap<K, V> cache = new LinkedHashMap<>(max);
  8. public void cache(K key, V value) {
  9. if (cache.containsKey(key)) {
  10. cache.remove(key);
  11. } else if (cache.size() >= max) {
  12. Iterator<K> iterator = cache.keySet().iterator();
  13. iterator.next();
  14. iterator.remove();
  15. }
  16. cache.put(key, value);
  17. }
  18. @Override
  19. public Iterator<K> iterator() {
  20. return cache.keySet().iterator();
  21. }
  22. public static void main(String[] args) {
  23. LRUCache<String, Integer> cache = new LRUCache<>();
  24. cache.cache("A", 1);
  25. System.out.println(
  26. "leave <-" + StreamSupport.stream(cache.spliterator(), false)
  27. .collect(Collectors.joining("<-"))
  28. );
  29. cache.cache("B", 2);
  30. System.out.println(
  31. "leave <-" + StreamSupport.stream(cache.spliterator(), false)
  32. .collect(Collectors.joining("<-"))
  33. );
  34. cache.cache("C", 3);
  35. System.out.println(
  36. "leave <-" + StreamSupport.stream(cache.spliterator(), false)
  37. .collect(Collectors.joining("<-"))
  38. );
  39. cache.cache("D", 4);
  40. System.out.println(
  41. "leave <-" + StreamSupport.stream(cache.spliterator(), false)
  42. .collect(Collectors.joining("<-"))
  43. );
  44. cache.cache("C", 10);
  45. System.out.println(
  46. "leave <-" + StreamSupport.stream(cache.spliterator(), false)
  47. .collect(Collectors.joining("<-"))
  48. );
  49. }
  50. }