上安卓面试总结(1)——Java基础
上一篇写到了 Java 的一些基础知识,这篇将以面试的态度去回顾一些 Java 的集合框架,博文的目的不是想让看的人立马能学会多少东西(更多可以看这篇 Java 集合笔记),更多的是希望能够借精简的内容,去回忆,去发散,加深对知识的理解,或许再看一次,还会生出原来如此的想法,这是很美妙的。
1、概述Java 容器示意图
容器 Collection:储存对象集合Map:储存键值对(两个对象)的映射表(Entry) Set TreeSet:基于红黑树,支持有序新 *** 作,基于范围查找元素(SortedSet)HashSet:基于哈希表实现,支持快速查找,但不支持有序 *** 作LinkedHashSet:具有 HashSet 的查找效率,且内部使用双向链表维护元素的顺序 List ArrayList:基于动态数组实现,支持随机访问(RandomAccess)Vectoy:和 ArrayList 类似,当是线性安全的LinkedList:基于双向链表实现,只能顺序访问,但是可以快速地在键表中间插入和删除元素 Queue LinkedList:可以用它实现双向队列(Deque)PriorityQueue:基于堆结构实现,可以用它实现优先队列 Map TreeMap:基于红黑树实现(SortedMap)HashMap:基于哈希表实现HashTable:和 HashMap 类似,但是线程安全的,可用 ConcurrentHashMapLinkedHashMap:使用双向链表来维护元素的顺序,顺序为插入顺序,或者是最近最少使用顺序(LRU) 2、迭代器Collection 继承了 Iterable 接口
Iterable --> Iterator:通过 iterator() 方法实现
Iterable 方法:
next()hasNext()remove():删除上次 next 方法是返回的元素(必须配合使用)dafault forEachRemaining(Consumer)Iterator 的位置实际是在两个元素中间,remove 的是前一个,next 的是后一个
如何遍历数组?
3、视图与包装器视图:好像创建了一个新集,将内容填进去,并返回这个集(keySet)
Arrays.asList(xxx):包装器子范围不可修改视图同步视图:synchronizedMap()受查视图 4、源码分析 ① ArrayList RandAccess,仅标记随机访问,删除代价高扩容:默认10,不够扩一半(1.5倍),需要复制数组modCount 记录结构变化,迭代、序列化时检查 --> ConcurrentModificationExceptiontransient:标记数组,只对数组内有的值进行序列化(手动 *** 作) ② Vector 内部使用了 synchronized 进行同步,也有 modCount,扩容是 2 倍代替: 用 Collections.synchronizedList<>() 得到线程安全的 ArrayList使用 CopyOnWriteArrayList ③ CopyOnWriteArrayList 读:在原始数组进行、写:在一个复制数组进行,有加锁,写完代替原有数组(指针)优点:大大提高了读 *** 作的效率缺点:内存加倍,数据不一致,没实时性 ④ LinkedList 双向链表实现,不支持随机访问,无需扩容在任意位置添加删除元素更快 ⑤ HashMap 内部包含了一个 Entry 类型的数组 EntryCAS + synchronized
来保证并发安全性 。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)