1. 集合Collection中存储的如果是自定义类的对象,需要自定义类重写哪个方法?为什么?
equals()方法。 contains() /remove()/retainsAll() ….
List:equals()方法
Set:(HashSet、LinkedHashSet为例):equals()、hashCode()
(TreeSet为例):Comparable:compareTo(Object obj);
Comparator:compare(Object o1,Object o2)
2. ArrayList,LinkedList,Vector三者的相同点与不同点?【面试题】
List Map Set
ArrayList、LinkedList与Vector的区别
ArrayList、LinkedList与Vector算是在面试用比较常见的知识点了。
2.1、ArrayList
ArrayList继承AbstractList抽象父类,实现了List接口(可以进行list操作)、RandomAccess(可随机访问)、Cloneable(可拷贝)、Serializable(可序列化)
• 线程不安全
• 底层实现是数组ArrayList的默认初始化容量是10,每次扩容时候增加原先容量的一半,也就是变为1.5倍
2.2、LinkedList
LinkedList实现了List接口(可以进行list操作)、Deque接口(能够当做双向端队列使用)、Cloneable(可拷贝)、Serializable(可序列化)
• 线程不安全
• 底层实现是双向链表,可以方便的从前/后进行遍历
2.3、Vector
Vector 是矢量队列,它是JDK1.0版本添加的类。继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口
• 底层是数组,线程安全
• 所有方法都是同步,有性能损失
• Vector初始化length是10,每次扩容时候增加原先容量的一倍,也就是变成原来的2倍
总的来说:查询多用ArrayList,增删多用LinkedList,多线程使用Vector
ArrayList
增删慢不是绝对的,尾部增删是ArrayList快,如果删除的是中间位置的话,还是ArrayList要快
3. List 接口的常用方法有哪些?(增、删、改、查、插、长度、遍历)
add(Object obj)
remove(Object obj)/remove(int index)
set(int index,Object obj)
get(int index)
add(int index,Object obj)
size()
使用Iterator;foreach;普通的for
4. 如何使用Iterator和增强for循环遍历List。举例说明
• 1.使用迭代器Iterator的hasNext()和next()方法来遍历集合
Iterator iterator = coll.iterator();
while (iterator.hasNext()) {
Object object = (Object) iterator.next();
System.out.println(object);
}
System.out.println();
• 2.使用增强for循环来遍历集合
//格式: for (数据类型 形参 :被遍历集合) {}
for (Object obj : coll) {
System.out.println(obj);
}
5. Set存储数据的特点是什么?常见的实现类有什么?说明一下彼此的特点。
HashSet LinkedHashSet TreeSet
HashMap LinkedHashMap TreeMap
6.List、Map、Set的存储特点?
List:以特定次序来持有元素,可有重复元素
Set:无法拥有重复元素,内部排序
Map:保存key-value值,value可多值