问题:java容器都有那些?
java容器分为controller和map两大类其中又又很多子类
如下示例
Controller
List接口
Arraylist
LinkedList
Vector
Stack
Queue接口
ArrayBlockingQueue :一个由数组支持的有界队列。
LinkedBlockingQueue :一个由链接节点支持的可选有界队列。
PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。
DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。
Set接口
hashSet
LinkedHashSet
TreeSet
Map接口
HashMap
LinkedHashMap
TreeMap
ConcurrentHashMap
Hashtable
问题:collection和collections有哪些区别
collection 是一个集合的接口她对集合对象经行基本的操作的通用接口所有的集合类如List,set等
collection 是一个包装类,包含了很多静态方法不能实例化就像一个工具类 如果 collections.sort(list)
问题:List,Set,Map 的区别是什么?
list set map 的区别主要体现在两个方面 元素是否有序 是否允许元素重复
问题:hashMap 和Hashtable有什么区别
HaShMap运行key和value 为null 二HaShtalbe不允许
HashMap 线程不安全 Hashtable 线程安全
Hashtbale 是保留类 ConcurrentHashMap 来代替她
问题:如何决定使用hashMap 还是TreeMap
对于插入,删除定位一个元素这种操作,hashMap是最好的选择因为相对而言HashMap的插入会更快,如果你要对一个key集合经行有序的便利,那treeMap是更好的选择
问题:说一下hashMap的原理?
HashMap 基于HaShcode 算法实现的 ,我们通过put(key,vlue)
来获取,当传入key时HashMap会更具key,hashCode()计算出hash值更具hash值将value保存到bucket 里当计算hash值相同的时候 ,HashMap的做法是用链表和红荷数存储相同的hashi值
当阈值为8的时候转为红黑树以减少搜索时间
问题:HashMap长度为什么是2的幂次方
为了能让HashMap存续高效 尽量减少碰撞,也就是要尽量把数据分配均匀。哈希映射比较松散一共40亿的长度一般内存呢放不下这么长的数组所以散列值不能直接拿来用用之前还要对数组长度进行取模运算。(n-1)&hashi (n) 代表数组长度也就解释了HashMap长度是2的幂次方
问题:ConcurrentHashMap和Hashtable的区别
底层数据结构:1.7的时候concurrentHashMap底层采用了分段数组+链表 实现。jdk1.8 使用了数组+链表/红黑树实现
实现线程安全的方法
concurrentHashMap使用了分段锁 对于整个数据桶经行分割每个锁只锁住了一部分数据,1.8之后直接用了Node+链表+红黑树的结构并发控制使用synchronizedCas来操作
HashTable同一把锁 使用synchronized来保证线程安全效率低下 多个线程访问同步方法就会形成阻塞
问题:说一下HashSet的实现原理
HashSet是基于HashMap实现的 ,HashSet地城使用HashMap来保存所有元素因此HashSet的实现基本上都是调用HashMap 的方法完成的HashSet 不允许重复的值
问题:HashSet如何检查重复
当你把对象加入HashSet时HashSet会先计算hashcode来判断对象加入的位置同时和其他加入的对象经行equals方法来检查hashcode相等的对象是否真的相同如果两者相同HashSet就不会就让加入操作
问题:ArrayList和LinkedList的区别
数据结构上来说 ArrayList是动态数组的数据结构实现的,而LinkedList是双向链表的数据结构实现的 随机访问效率ArrayList比LinkedLIst效率要搞,因为LinkedList是线性数据存储方式,所以需要移动执政从前往后一次查找
增加和删除的效率 : 在非首位的增加和删除操作LinkeList要比ArrayList效率要高,以内ArrayList增删操作要影响其他数据的下表
综合来说在需要平凡读取集合元素时更他推荐使用ArrayList 而在插入和删除操作较多时,更推荐使用LinkedList
问题:如何实现数组之间的转换
数组转List使用 Array.asList() List转数组 使用toArray
问题:ArrayList和vector有什么区别
Vector是线程安全的 使用了Synchronized来实现线程同步而ArrayList是非线程安全的
性能方面 因为Vector 加了锁所以ArrayList更加快
扩容ArrayList 和Vector 都会动态扩容 只不过Vector 扩容每次会增加1背ArrayList只会增加百分之50
问题:Array和ArrrayList的区别
array可以存储基本数据和对象 ArrayList只能存储基础数据
Array是固定大小而ArrayList是可以扩展的
Array内置方法没有ArrayList多 比如addAll,removeAll,removeAll等方法只有ArrayList
问题:Queue中pull和remove()有什么区别?
相同点:返回的都是第一个元素并且在队列中返回
不同点:如果没有元素poll()会返回null而remove()会直接抛出NoSuchElementException异常
问题那些集合类是线程安全的?
Vector,hashTable,Stack都是线程安全的,而向HashMap则是非线程安全的 java.util.concurrent并发包的出现他们都有了自己自己对应的线程安全类
怎么确保一个集合不被修改?
可以使用Collecionts.unmodifiableCollection(Collection c)
Iterator和ListIterator有什么区别?
lterator可以便利set 和List集合而ListIterator只能便利List。Iterator可以便利Set和List集合,而ListIterator只能便利List。
Iterator 只能单项便利 而ListIterator可以双向便利,ListIterator 添加了一些额外的功能,比如添加一个元素,替换一个元素,获取前面后面元素的索引位置