1. Java容器主要有哪些?
主要分为两类,第一类是Collection,第二类是Map。其中Collection包含List与Set。
2. List、Set、Map之间的区别是什么?
区别主要从元素是否有序、重复这两个方面来比较。
3. HashMap的实现原理
HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。
当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存 在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。
注:红黑树是自平衡的二叉查找树
4. HashSet的实现原理
HashSet利用HashMap的Key键不能重复的特性来实现存储。
例如:我们向HashSet中存储“a”、“b”、“c”三个字符串,实际底层就是存储为以“a”、“b”、“c”为Key键和以PRESENT为Value的HashMap。PRESENT是HashSet类中定义的常量,它的数据类型是Object对象,无实际意义。
所以HashSet基于HashMap实现,底层实际调用的都是HashMap的方法,数据使用HashMap进行存储,由于HashMap是无序的,所以HashSet也是无序的。
5. ArrayList与LinkedList的区别是什么?
在数据结构实现中,ArrayList基于数组实现,LinkedList基于链表实现
在随机访问速率中,ArrayList性能优于LinkedList
在插入与删除操作是,LinkedList性能优于ArrayList(ArrayList影响其他元素的下标)
在存储过程中,LinkedList相比ArrayList占用更多的内存
综合来说:在读取操作较多的情况下,使用ArrayList,在操作较多的情况下,使用LinkedList
- 哪些集合类是线程安全的?
Vector、Hashtable、Stack
在 JDK 1.5 之后随着 Java. util. concurrent 并发包的出现,它们也有了自己对应的线程安全类,比如 HashMap 对应的线程安全类就是 ConcurrentHashMap。
7. 迭代器 Iterator 是什么?
一种遍历集合的方式
支持从迭代器中移除元素
8. Iterator 怎么使用?有什么特点?
使用Iterator的hasNext()、next()、remove()方法进行操作
Iterator 的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。
9. Iterator 和 ListIterator 有什么区别?
Iterator可以遍历List、Set;ListIterator只能遍历List
Iterator单向遍历、ListIterator支持双向遍历
ListIterator继承Iterator,在此基础上补充了其他方法,比如获取前后一个元素的下标、添加元素、替换元素等等。
10. Array 和 ArrayList 有何区别?
Array指定容量,ArrayList动态扩容
Array可以存储基本数据类型,ArrayList只能存储对象
Array的默认方法没有ArrayList提供的多,比如 addAll、removeAll、iteration