如果我是Android面试官七

Java集合类作为Android面试中不可缺少的一环,常能区分出面试者Java功底是否厚实。今天整理一篇关于Java集合类的知识。

一、什么是Set

Set是一个接口,继承于Collection。主要是保证其内部数据的唯一性,即添加相同的数据,会添加失败。常用的实现类有三种,HashSet、TreeSet以及LinkedHashSet。

二、HashSet

HashSet内部维护了一个HashMap,其add方法是把添加的Object作为key,放到hashMap中,从而利用HashMap的put方法保证了不能加入同样key值的键值对。而value部分则用一个空数据作为value加入(看了源码才发现,真特么的巧妙)。至于取值时,则是取出keySet的迭代器,逐个遍历取值。使用时如果是自己的类,为了保证不加入同样的值,要重写hashCode的计算方法以及equals方法。不然都调用Object的hashCode方法和equals方法是比较不出来的。

三、TreeSet

TreeSet内部维护了一个实现NavigableMap的实现类,put时会根据自然顺序排序或者自定义的顺序排序。当使用空参数的构造方法是,默认建立一个TreeMap。内部维护了一个TreeMap来存储数据。add方法则是调用了TreeMap的put方法。与HashSet一样,仍然是把Object作为key使用一个new出来的Object空数据作为value。利用TreeMap的put最终存放数据,保证了唯一性。

四、LinkedHashSet

LinkedHashSet继承于HashSet,区别在于初始化时调用了super的多参数构造方法,而多出的参数并无实际意义,仅仅是用于区分是否是LinkedHashSet。若调用了多参的构造方法,则此时的HashSet里会维护一个LinkedHashMap。这下就都懂了。add方法还是会以Object为key,调用LinkedHashMap的put方法来保证唯一性。

以上,关于常用的Set实现类的总结就到这,不看源码不知道,他们是真的骚。

五、ThreadLocal

ThreadLocal是一个比较NB的东西,最初认识它是在Android的handler机制中得知的。它的NB之处就在于它能够区分线程,以线程为key,保存值。ThreadLocal的get方法会返回一个泛型,那个泛型就是我们想要保存的数据结构,handler机制中是Looper对象。ThreadLocal里面维护了一个ThreadLocalMap内部类,这个内部类里有一个名为table的Entry数组。这里就是存放数据的地方了。取的时候,以线程为key,通过线程的hashCode算法找到位置,取出Entry,再取出Entry里的value。而一个线程中,持有ThreadLocalMap对象,作为这个线程携带的数据。

是不是有点乱?总之,就是你需要明白线程Thread类是可以携带数据的,所携带的数据为ThreadLocalMap,ThreadLocal可以以Thread作为key来取出线程携带的ThreadLocalMap里的数据。

六、ArrayMap

ArrayMap实现了Map接口。它是android库提供的!

猜你喜欢

转载自blog.csdn.net/Kongou/article/details/81748945