1、Java的容器有哪些?
Java容器分为Collection和Map两大类,其下又有很多子类,如下所示:
●Collection
。List
。ArrayList
。LinkedList
。Vector
■Stack
。Set
。HashSet
■LinkedHashSet
。TreeSet
●Map
。HashMap
。LinkedHashMap
。TreeMap
。ConcurrentHashMap
。Hashtable
2、Collection和Collections有什么区别?
1)Collection是一个集合接口,它提供了对集合对行基本操作的通用接口方法,所有集合都是它的子类,比如List、Set等。
2)Collections是一个包装类,包含了很多静态方法,不能被实例化,就像个工具类,比如提供的排序方法:Collections, sort(list)。
3、 Collection 和 Collections 有什么区别?
List、Set、Map的区别主要体现在两个方面:元素是否有序'是否允许元素重复。 三者之间的区别,如下表:
4、 HashMap 和 Hashtable 有什么区别?
•存储:HashMap运行 key 和 value 为 null, 而 Hashtable不允许。
•线程安全:Hashtable是线程安全的,而HashMap是非线程安全的。
•推荐使用:在Hashtable的类注释可以看到,Hashtable是保留类不建议使用,推荐在单线程环境下使用 HashMap替代,如果需要多线程使用则用ConcurrentHashMap 替代。
5、如何决定使用HashMap还是Tree Map?
对于在Map中插入、删除、定位一个元素这类操作,HashMap是最好的选择,因为相对而言HashMap的插入会更快,但如果你要对一个key集合进行有序的遍历,那TreeMap的选择。
6、说一下HashMap的实现原理?
HashMap基于Hash算法实现的,我们通过put(key,value)存储,get(key)来获取。当传入key时,HashMap会根据key. hashCode()计算出hash值,根据hash值将value保存在bucket里。当计算出的hash值相同时,我们称之为hash冲突,HashMap的做法是用链表和红黑树存储相同hash值的value。当hash冲突的个数比较少时,使用链表否则使用红黑树。
7、说一下HashSet的实现原理?
HashSet是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成,HashSet不允许重复的值。
8、 Array List 和 Linked List 的区别是什么?
•数据结构实现:ArrayList是动态数组的数据结构实现,而LinkedList是双向链表的数据结构实现。
•随机访问效率:ArrayList比Li n ked List在随机访问的时候效率要高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。
•增加和删除效率:在非首尾的增加和删除操作,LinkedList要比ArrayList效率要高,因为ArrayList增删操作要影响数组内的其他数据的下标。
综合来说,在需要频繁读取集合中的元素时,更推荐使用ArrayList,而在插入和删除操作较多时,更推荐使用LinkedList。
9、 如何实现数组和List之间的转换?
•数组转List:使用 Arrays.asList(array)进行转换。
• List转数组:使用List自带的toArray()方法。
10、 AirayList和Vector的区别是什么?
•线程安全:Vector使用了 Synchronized来实现线程同步,是线程安全的,而ArrayList是非线程安全的。
•性能:ArrayList在性能方面要优于Vector。
•扩容:ArrayList和Vector都会根据实际的需要动态的调整容量,只不过在Vector扩容每次会增加1倍,而Array List只会增加50%。
11、 Array 和 ArrayList 有何区别?
• Array可以存储基本数据类型和对象,ArrayList只能存储对象。
• Array是指定固定大小的,而ArrayList大小是自动扩展的。
• Array内置方法没有ArrayList多,比如addAll、removeAll、iteration等方法只有ArrayList 有。
12、在Queue中poll()和remove()有什么区别?
•相同点:都是返回第4元素,并在队列中删除返回的对象。
•不同点:如果没有元素 P〇ll()会返回null, 而 remove()会直接抛出NoSuchElementException 异常。
代码示例:
Queue queue = new LinkedList();
queue. offer("string"); // add
System, out. println(queue. poll());
System, out. println(queue, remove());
System, out. println(queue. size());
13、哪些集合类是线程安全的?
Vector、Hashtable、Stack都是线程安全的,而像HashMap则是非线程安全的,不过在JDK 1.5之后随着Java. util, concurrent并发包的出现,它们也有了自己对应的线程安全类,比如HashMap对应的线程安全类就是ConcurrentHashMap。
14、迭代器Iterator是什么?
Iterator接口提供遍历任何Collection的接口。我们可以从一个Collection中使用迭代器方法来获雌代器实例。迭代器取代了 Java集合框架中的Enumeration,迭代器允许调用者在迭代过程中移除元素。
15、 Iteratr怎么使用?有什么特点?
Iterator使用代码如下:
List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
while(it. hasNext()){
String obj = it. next();
System, out. println(obj);
}
Iterator的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。
16、Iterator和 Listlterator有什么区别?
• Iterator可以遍历Set和List集合,而Listlterator只能遍历List。
• Iterator只能单向遍历,而Listlterator可以双向遍历(向前/后遍历)。
• Listlterator从Iterator接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一^元素、获取前面或后面元素的索引位置。
17、 怎么确保一个集合不能被修改?
可以使用 Collections. unmodifiableCollection(Collection c)方法来创建一个只读集合,这样改变集合的任何操作都会抛出Java. lang. UnsupportedOperationException异常。
示例代码如下:
List<String> list = new ArrayListo ();
list.add("x");
Collection<String> clist = Collections.unmodifiableCollection(list);
clist.add("y"); //运行时此行报错
System.out.println(list.size());