您的位置:首页 > 编程语言 > Java开发

java集合整合详解

2019-03-07 20:23 99 查看

听身边有很多工作面试的朋友有谈到面试中必然会问到的一个东西,就是我们开发过程中经常会用到的集合,我也特地查了下资料特地整合了一部分,希望对大家也有些帮助!
说到集合我们不得不知道的是一个集合的父类接口Collection:

Collection:

而Collection里的子接口我总共分了两大类,一类是类似于想ArrayList的经常会使用的一些常规一点儿的集合类,还有一类也就是Arrays(数组)跟Map接口类,为什么会分为两类是因为Map跟Arrays相较于另外四大接口方法上以及存值形式,有很大区别,所以我分为两类来进行讲解!

首先我们先来讲讲第一大类型里的,List接口,Set接口,Queue接口(队列)

List:

List有一个普遍的特点就是可以添加一些重复的元素,而且是有顺序(按照添加顺序来排列)的。

ArrayList:
优点:get和set速度都比较快。
缺点:对于插入和现有项的删除比较繁杂,也就辅助的代价相较于LinkedList要高昂,除非是add从末端开始。

LinkedList:
优点:因为是链表的形式结构,插入或是删除都要优于上者。
缺点:但相反的对于查询get和set方法调用就输ArrayList了。

而面试一般会问到:ArrayList和LinkedList的区别?
这个时候可以结合两个集合的优缺点来进行比较。再结合一些实际的使用场景来进行实例的比较这样会比较具有说服性!
例如:
想面对项目开发中一些频繁增删的数据集合时我们选择LinkedList,反之不经常需要增删的数据集合我们选择ArrayList

Set:

Set是一个可以添加重复元素,而且没有顺序的集合

HashSet:
Set接口子类下速度最快,没有明显的顺序保存元素,集合的元素可以为null,但只能放一个null对象

TreeSet:
最大的特点就是会根据保存的对象进行升序排序
例如:
添加 9,6,5,4,3 TreeSet={3,4,5,6,9}

LinkedHashSet:
按照被添加的顺序保存对象

面试问题:三者的区别?

答题方式同上List接口

Queue:

基本上,一个队列就是一个先入先出(FIFO)的数据结构

这个就直接上代码了:

package com.ljq.test;

import java.util.LinkedList;
import java.util.Queue;

public class QueueTest {
public static void main(String[] args) {
//add()和remove()方法在失败的时候会抛出异常(不推荐)
Queue<String> queue = new LinkedList<String>();
//添加元素
queue.offer("a");
queue.offer("b");
queue.offer("c");
queue.offer("d");
queue.offer("e");
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("poll="+queue.poll()); //返回第一个元素,并在队列中删除
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("element="+queue.element()); //返回第一个元素
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("peek="+queue.peek()); //返回第一个元素
for(String q : queue){
System.out.println(q);
}

}
}

另外就是我们第二大类了,Arrays跟Map:

Arrays(数组):

数组类型首先数组类型是直接有序存储在内存中速度肯定是没话说。但短板在于Arrays在定义过程中必须指定长度。这样就会有局限性,会造成资源浪费或是说长度过长导致溢出的异常。

面试题:Array跟ArrayList的区别?这个就不用说了,ArrayList可增长,而Arrays不可增长,官方是推荐使用ArrayList的,当然,在一些单一可知长度的数据情况下,选择Arrays就更合理了,结合情况讲就完事儿!

Map:

Map最大的特点就是存值是键值对(K/V)的形式。

HashMap:

较快的访问速度,没有明确的按照顺序保存元素。

TreeMap:

按照比较结果来进行升序存建

LinkedHashMap:
按照插入顺序存剑,同时还保留了HashMap的查询速度

Map集合大致就如此了,当然面试中可能会问道一些比较冷门的HashTable之类的这些可以着手线程安全方面讲!

关于Collection继承的Iterable接口的相关知识

Iterable:
1.实现了Iterable的接口都可以增强for循环
2.实现Iterable接口的集合类必须提供一个名为Iterator()的方法,该方法返回值为Iterator

我以前报过的异常:ConcurrentModificationExecption

说到这个异常我们就不得不讲到当时弄得我莫名其妙的一个bug了,Collection中的:remove(object)跟Iterable中的:remove()的区别。

当时也是做一个删除集合中的元素并用新的元素替代的操作,发现了这个问题,就是在掉用remove移除元素是发生的错误

先说说两种remove方法的区别:

Iterable中的remove(),需要注意的是Iterable的remove方法不需要参数。
该方法可以删除由next()最新返回的项(注意:以后不能调用remove,知道对next再一次进行调用以后)

Collection的remove(object)方法
Collection的remove方法必须首先找出要被删除的项,找到该项的位置采用的是单链表结构查询,单链表查询效率比较低,需要从集合中一个一个便利才能找到该对象

而回抛出异常的时候是因为:集合中对象的个数会改变。而Iterator内部对象的个数不会Iterator中的对象个数和原来集合中对象的个数会保持一致,不一致则会出现异常

ps:
总共就这些了,完后还有其他的一些比较冷门的集合就不一一列举了,只简单说一下,这些面试中出现几率较高的了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: