Java面试准备(Java集合)
2017-03-07 本文已影响67人
蒹葭流
ArrayList、LinkedList、Vector区别
- ArrayList 是一个可改变大小的数组,其大小将会动态地增长。
- LinkedList 是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList,这些对比都是指数据量很大或者操作很频繁的情况下的对比,如果数据和运算量很小,那么对比将失去意义。
LinkedList 还实现了 Queue 接口,该接口比List提供了更多的方法,包括 offer(),peek(),poll()等。 - Vector 和ArrayList类似,但属于强同步类,开销会比较大。Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求其大小的双倍空间,而ArrayList每次对size增长50%.
Queue队列
其接口定义为:
public interface Queue<E> extends Collection<E> {
//获取但不移除队列头,
E element();
//添加元素到队尾
boolean offer(E o);
//获取但不移除队列头的元素
E peek();
//移除对头元素
E poll();
//移除对头元素
E remove();
}
- Queue主要特征在于FIFO,的实现一般并不容许插入null,只有LinkedList是一个例外,它容许插入null。
- 当Queue的元素已经到达限制数目时,add会抛出 IllegalStateException异常,offer会返回false。
- 当Queue为空时,remove抛出NoSuchElementException异常,而poll返回null。
- element和peek返回但不删除Queue中的头元素,它们的区别类似remove与poll。
BlockingQueue与CountDownLatch
- BlockingQueue接口定义了一种阻塞的FIFO queue,每一个BlockingQueue都有一个容量:
当容量满时,往BlockingQueue中添加数据时会造成阻塞。
当容量为空时,取元素操作会阻塞。
其两个常用子类是ArrayBlockingQueue和LinkedBlockingQueue。
- CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。主要方法:
public CountDownLatch(count);
public void countDown();
public void await() ;
构造方法指定了计数的次数。countDown方法,当前线程调用此方法则计数减一。await方法,调用该方法会一直阻塞当前线程,直到计时器的值为0。
Map
常用的Map
- Hashtable:底层是哈希表数据结构,不可以存入null健null值,该集合是线程同步的 。
- TreeMap: 底层是二叉树数据结构,可以用于给map集合中的健进行排序 该集合线程不同步。
- HashMap底层是哈希表数据结构,允许使用null健null值,该集合是不同步.当添加元素,如果出现添加相同的健时,后添加的值会覆盖原有健对应的值。
ConcurrentHashMap
- 是线程安全并且高效的HashMap,在并发编程中经常可见它的使用.
- Hashtable线程安全,但是效率低下
Map的遍历方法之一
HashMap<String,String> source = new HashMap<>();
for (Map.Entry<String,String> entry: source.entrySet()){
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
Map的遍历方法之二
Collection<String> values =source.values();
for (Iterator<String> it = values.iterator(); it.hasNext();) {
String s = it.next();
System.out.println(s);
}
Map的遍历方法之三
//需要Java8以上的版本
source.forEach((k,v)->System.out.println( k + " : " + v));
Collections、Collection与Arrays
- Collection是一个集合接口,是List、Set、Queue接口。
- Collections包含有各种有关集合操作的静态多态方法,此类不能实例化,就像一个工具类。如Collections的排序方法sort。
ArrayList<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(5);
list.add(3);
list.add(2);
//默认升序,输出1 2 2 3 5
Collections.sort(list);
//降序,输出5 3 2 2 1
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
- Arrays类能方便地操作数组,它提供的所有方法都是静态的,主要方法:
给数组赋值:通过fill方法。
对数组排序:通过sort方法,按升序,有些重载方法可以传入Comparator接口。
比较数组:通过equals方法比较数组中元素值是否相等。
查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作。
int[] ints=new int[5];
//数组全部赋值为6
Arrays.fill(ints,6);
//数组第2个和第4个赋值为7,未赋值的未0
Arrays.fill(ints,1,4,7);
//升序
Arrays.sort(ints);
//对第1个到第4个进行升序
Arrays.sort(ints,1,4);
int[] ints1=ints.clone();
Arrays.equals(ints,ints1); //true
int[] ints2=new int[5];
Arrays.fill(ints2,8);
Arrays.equals(ints,ints2);//true
//使用二分搜索算法查找指定元素所在的下标(必须是排序好的,否则结果不正确)
Arrays.sort(ints);
//会返回第一个找到的下标
System.out.println(Arrays.binarySearch(ints,6));