关于Java中并发集合有:

(1)CouncurrentHashMap

(2)CopyOnWriteArrayList

(3)LinkedBlockingQueue

(4)ArrayBlockingQueue

这些的适用场景及其实现原理是必须要掌握的。

1、Hash的死锁原因

参考:HashMap 死锁分析 http://github.thinkingbar.com/hashmap-infinite-loop/

2、关于ConcurrentHashMap相关的问题

ConcurrentHashMap的1.7与1.8的实现差别很大,可以参考文章:

(1)谈谈ConcurrentHashMap1.7和1.8的不同实现 http://www.jianshu.com/p/e694f1e868ec

(2)https://zhuanlan.zhihu.com/p/21673805

下面关于ConcurrentHashMap必须要知道的几个问题:

(1)ConcurrentHashMap的锁分段技术。

(2)ConcurrentHashMap的读是否要加锁,为什么。

(3)ConcurrentHashMap的迭代器是强一致性的迭代器还是弱一致性的迭代器。

迭代器在遍历底层数组。在遍历过程中,如果已经遍历的数组上的内容变化了,迭代器不会抛出ConcurrentModificationException异常。如果未遍历的数组上的内容发生了变化,则有可能反映到迭代过程中。这就是ConcurrentHashMap迭代器弱一致的表现

ConcurrentHashMap的结构大概如下所示。

3、LinkedHashMap的应用

LinkedHashMap维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序(insert-order)或者是访问顺序,其中默认的迭代访问顺序就是插入顺序,即可以按插入的顺序遍历元素。基于LinkedHashMap的访问顺序的特点,可构造一个LRU(Least Recently Used)最近最少使用简单缓存。也有一些开源的缓存产品如ehcache的淘汰策略(LRU)就是在LinkedHashMap上扩展的。

public class LruCache<K, V> extends LinkedHashMap<K, V> {
            /** 最大容量 */
            private int maxCapacity;  

            public LruCache(int maxCapacity) {
                super(16, 0.75f, true);
                this.maxCapacity = maxCapacity;
            }  

            public int getMaxCapacity() {
                return this.maxCapacity;
            }  

            public void setMaxCapacity(int maxCapacity) {
                this.maxCapacity = maxCapacity;
            }  

            /**
             * 当列表中的元素个数大于指定的最大容量时,返回true,并将最老的元素删除。
             */
            @Override
            protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
                if (super.size() > maxCapacity) {
                    return true;
                }
                return false;
            }
        }

  

public class LruCacheTest {  

            public static void main(String[] args) {
                LruCache<String, Object> cache = new LruCache<String, Object>(10);  

                for (int i = 1; i <= 15; i++) {
                    cache.put(i + "", i);
                }  

                // 此时访问指定KEY的元素
                cache.get("10");  

                Iterator<Entry<String, Object>> iterator = cache.entrySet().iterator();
                for (; iterator.hasNext();) {
                    Entry<String, Object> entry = iterator.next();
                    System.out.println("key=" + entry.getKey() + ",value=" + entry.getValue());
                }
            }
        }

输出如下:

key=7,value=7
key=8,value=8
key=9,value=9
key=11,value=11
key=12,value=12
key=13,value=13
key=14,value=14
key=15,value=15
key=10,value=10

 

Java面试02|Java集合的更多相关文章

  1. # 095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 03 封装总结 01 封装知识点总结

    095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  2. 094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 04 static关键字(续)

    094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  3. 093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 03 static关键字(下)

    093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  4. 092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 02 static关键字(中)

    092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  5. 091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 01 static关键字(上)

    091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  6. 090 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 04 使用包进行类管理(2)——导入包

    090 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  7. 089 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 使用包进行类管理(1)——创建包

    089 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  8. 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 02 封装的代码实现

    088 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 02 封装的代码实现 本文知识点:Java封装的代码实现 说明:因为时间紧张,本人写博客过程中只 ...

  9. 087 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 01 封装的概念和特点

    087 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 01 封装的概念和特点 本文知识点:封装的概念和特点 说明:因为时间紧张,本人写博客过程中只是对 ...

随机推荐

  1. [ Android 五种数据存储方式之一 ] —— SharedPreferences存储数据

    SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数. 主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstanceS ...

  2. 滚动视图(ScrollView)的功能与用法

    滚动视图ScrollView由FrameLayout派生而出,它就是一个用于为普通组件添加滚动条的组件.ScrollView里最多只能包含一个组件,而ScrollVew的作用就是为该组件添加垂直滚动条 ...

  3. IIS HTTP重定向到HTTPS

    最近客户一个网站升级至HTTPS协议访问,但是为了用户输入,客户要求当用户输入的是HTTP协议时,能自动定向到HTTPS,类似百度网站,当你输入www.baidu.com并回车后,地址栏自动变成了ht ...

  4. spring mvc 参数传递的三种方式

    springmvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  5. 在Flex中用于处理XML对象的E4X 方法

    ECMAScript for XML 规范定义了一组用于使用 XML 数据的类和功能.这些类和功能统称为 E4X.ActionScript 3.0 包含以下 E4X 类:XML.XMLList.QNa ...

  6. Flex移动皮肤开发(一)

    范例文件 mobile-skinning-part1.zip Flex 4.5提供的移动增强的皮肤特性,支持触摸交互.性能优良,并且考虑到了内存占用问题.尽管目前市场上有不少性能优异的设备,但典型的S ...

  7. RabbitMQ小白菜学习之在window下的安装配置

    RabbitMQ安装 首先需要下载RabbitMQ的平台环境Erlang OTP平台和RabbitMQ Server(windows版): OTP 19.1 Windows 64-bit Binary ...

  8. 从零开始学C#——基本语法(二)

    基本语法 C#,又名Csharp,天朝喜欢叫C井. C#是一种面向对象的编程语言.在面向对象的程序设计方法中,程序有各种相互交互的对象组成.相同种类的对象通常具有相同的类型,或者说,是在先沟通那个的c ...

  9. js如何判断一个变量是否是数组?

    //方法一 var arr = [1,2,3]; var obj = {'name': 'xiaoming','age': 19}; if(arr.constructor == Array){ ale ...

  10. nRF51800 蓝牙学习 进程记录 2:关于二维数组 执念执战

    前天在玩OLED时想完成一直想弄得一个东西,就是简单的单片机游戏.因为STM32和nRF51822的内存足够,所以就用缓存数组的方法来显示图像(我也不知道术语是啥,反正就是在内存中建立一个128X64 ...