1.java 容器都有哪些?
容器分为三大类:
- List:有序可重复集合,ArrayList,LinkedList,Vector,Stack
- Set:无序不可重复集合,HashSet,TreeSet,LinkedHashSet
- Map:关系映射,HashMap,TreeMap,LinkedHashMap,HashTable
2.Collection 和 Collections 有什么区别?
- Collection是容器接口,是List和Set的根接口
- Collections是工具类,提供处理集合的各种方法,
3.List、Set、Map 之间的区别是什么?
容器分为三大类:
- List:有序可重复集合,ArrayList,LinkedList,Vector,Stack
- Set:无序不可重复集合,HashSet,TreeSet,LinkedHashSet
- Map:关系映射,HashMap,TreeMap,LinkedHashMap,HashTable
4.ArrayList 和 LinkedList 的区别是什么?
- ArrayList 动态数组,索引方便,插入不方便
- LinkedList 链表,索引不方便,插入方便
5.ArrayList 和 Vector 的区别是什么?
- ArrayList 线程不安全,扩容 *1.5
- Vector 方法使用synchronized关键字。线程安全,扩容*2,效率比ArrayList低,适合存大数据并且要求线程安全
6.哪些集合类是线程安全的?
-
Vector:就比 Arraylist 多了个同步化机制(线程安全)。
-
Hashtable:就比 Hashmap 多了个线程安全。
-
ConcurrentHashMap: 是一种高效但是线程安全的集合。
-
Stack:栈,也是线程安全的,继承于 Vector。
7.Iterator 怎么使用?有什么特点?Iterator的 fail-fast属性是什么?
Iterator是一种设计模式,一种轻量级对象,
Iterator使用的时候需要集合调用重写的iterator方法,返回一个iterator对象,通过该对象遍历集合元素。只有collection接口继承了iterator接口,map接口没有。
正在被迭代的集合对象被删除时,必须使用迭代器的删除方法。
所有的java.util包中的集合类都被设计为fail-fast,集合与迭代器一起作用,保证能否安全的删除集合中元素。如果正在被迭代的对象发生结构上的改变时,集合中的两个字段(集合修改次数和迭代器对集合的修改次数)就会不一样,就会抛出异常。
8.Iterator 和 ListIterator 有什么区别?
Iterator是List和Set的迭代器
ListIterator是List的迭代器
Iterator单向,ListIterator双向,ListIterator继承自Iterator,并且实现了更多功能,添加替换等。
9.如何决定使用 HashMap 还是 TreeMap?
HashMap效率高,存取数据快,但是数据无序
TreeMap效率低,但是存储数据是排序的,可以取到最大和最小值
补充:
10.Arrays和Collections的常用方法
Arrsys: 是数组的工具类,提供了对数组操作的工具方法。
Collections: 是集合对象的工具类,提供了操作集合的工具方法。
其中 Arrays 和 Collections 中所有的方法都为静态的,不需要创建对象,直接使用类名调用即可。
Arrays常用方法:
- sort() 排序
- asList() 将数组转化为arraylist
- toString() 返回 数组中元素以逗号分隔,两边是[] 的字符串
Collections常用方法
- sort() 排序
- reverse() 反转顺序
- synchronizedMap、synchronizedSet、synchronizedList 使线程安全
11.如何实现数组和 List 之间的转换?
调用工具类的Arrays的asList方法
12.Array 和 ArrayList 有何区别?
- Arrays是数组的工具类
- Array是数组,声明时必须 说明大小和类型
- ArrayList是动态数组,不比声明大小,数组大小动态扩展,在不使用泛型的情况下都不比声明类型。
补充:
泛型只是在编译期间生效,运行期间会被擦除,保证类型安全,消除了强制类型转换,带来性能上的收益。
13.在 Queue 中 poll()和 remove()有什么区别?
- poll () 和 remove () 都将移除并且返回对头,但是在 poll () 在队列为空时返回 null,而 remove () 会抛出 NoSuchElementException 异常。
- peek () 和 element () 都将在不移除的情况下返回队头,但是 peek () 方法在队列为空时返回 null,调用 element () 方法会抛出 NoSuchElementException 异常。
- add () 和 offer () 都是向队列中添加一个元素。但是如果想在一个满的队列中加入一个新元素,调用 add () 方法就会抛出一个 unchecked 异常,而调用 offer () 方法会返回 false。
14.怎么确保一个集合不能被修改?
(一)、final
我们很容易想到用 final 关键字进行修饰,我们都知道
- final 修饰的类不能被继承,
- final 修饰的方法不能被重写,
- final 修饰的变量不能修改
这里需要特别注意,变量是基本类型的时候,值不可修改,变量是对象的时候,引用不可修改。
final ArrayList list = new ArrayList();
list.add(1);
list.add(2);
ArrayList list1 = new ArrayList();
list1.add(3);
list1.add(4);
list1 = list;//正常
list = list1;//报错
可以看到,集合list的值是可以不断添加,但是当引用改变的时候就会报错,所以使用final只能让集合的引用不可修改,而值还是可以修改和添加
(二)
使用 Collections. unmodifiableCollection (Collection c) 方法来创建一个只读集合,这样改变集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。
List<String> list = new ArrayList<>();
list. add("A");
Collection<String> unmlist = Collections. unmodifiableCollection(list);
unmlist. add("B"); // 运行时此行报错
System. out. println(list.size());
【Java 面试那点事】
这里致力于分享 Java 面试路上的各种知识,无论是技术还是经验,你需要的这里都有!
这里可以让你【快速了解 Java 相关知识】,并且【短时间在面试方面有跨越式提升】
面试路上,你不孤单!