Java集合框架是Java的基础,也是工作中最长使用的,那么就简单总结下java类库中一些面试容易遇到的问题,以及这里集合框架的简单使用,以及如何使用能达到高效率。
Java中最常用使用的集合类主要有,
Collection、List、Set、Map、Iterator、Enumeration、Query等等
下图中主要展示一些最常用到的接口、类和常用子类
如图所示,在最常用的三个集合中,List和Set是继承与Collection接口的,而Map和Collection毫无关系。
可以看到Collection接口的定义方式:
public interface Collection<E> extends Iterable<E> (JDK1.5后都支持泛型)
一般开发中,基本不直接使用Collection接口进行开发,而是一些继承于它的子接口,主要有List、Set、Queue等
List和Set接口的定义方式:
public interface List<E> extends Collection<E>
public interface Set<E> extends Collection<E>
Queue队列(具体使用详见api)
public interface Queue<E> extends Collection<E>
boolean add(E e); // 将指定的元素插入此队列
boolean offer(E e); // 将指定的元素插入此队列,此方法通常要优于 add(E)
E remove(); // 将指定的元素插入此队列
E poll(); // 获取并移除此队列的头,如果此队列为空,则返回 null。
E element(); // 获取,但是不移除此队列的头。
E peek(); // 获取但不移除此队列的头;如果此队列为空,则返回 null。
而Map类直接实现Serializable接口
class Map implements Serializable
至于实现Serializable接口的主要作用,无非就是便于实例化,表示该类可以序列化.序列化的目的是将一个实现了Serializable接口的对象转换成一个字节序列。
List接口(可以存放重复的数据)
子类:ArrayList、Vector、LinkedList
List接口的最常使用就是 List list = new ArrayList();还有一种Vector vector = new Vector();(特殊情况下使用)
一些常见的面试题,会问ArrayList、Vector和LinkedList的区别?
Vector是线程同步的,安全的(执行效率低,所有方法都加synchronized(如:public synchronized int size()),ArrayList是线程不同步的(如:public int size())(效率高)。当元素超出初始大小时,ArrayList增加初始一半的大小,而Vector会增加一倍。两个都是查找速度非常快,增加和删除操作非常慢(和数组类似)。而LinkedList是一个双向链表,在添加和删除操作效率高,但是查找慢。
遍历list也有3种方式
public class TestList {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
for (int j = 0 ; j <100000; j++) {
list.add("list"+j);
}
/**
* 1 效率低
*/
for(String list1 : list) {
System.out.println(list1);
}
/**
* 2 循环遍历, 效率高 重要的是先取出list的size,不要每次循环都去取
*/
int size = list.size();
for(int i =0 ;i < size; i++) {
list.get(i);
}
/**
* 3 迭代遍历,效率高,比第二中稍微慢一点
*/
Iterator<String> iter = list.iterator();
while(iter.hasNext()) {
iter.next();
}
}
}
Set接口(不能存放重复的内容,所有的重复内容靠hashCode()和equals()两个方法区分)
子类: 无序存放HashSet 有序存放TreeSet
声明: Set<String> set = new HashSet<String>();
public class TestSet {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
for(int i=0; i< 100000; i++) {
set.add("testSet"+i);
}
/** 1 迭代遍历 */
for(Iterator<String> iterator = set.iterator();iterator.hasNext();){
System.out.print(iterator.next()+" ");
}
/** 2 for增强循环遍历 */
for(String value : set){
System.out.print(value+" ");
}
}
}
Queue 队列操作接口,采用FIFO(先进先出)的方式。先进先出指的是在一个集合中,会按照顺序增加内容。
Map接口
Map接口每次操作的是一对对象,成对出现的,即二元偶对象,key--value,而collection、Set、List是单值操作,独立存在的。
public interface Map<K,V>
常用子类
HashMap 无序存放,key不可重复(新)
HashTable 无序存放,key不可重复(老)
TreeMap 可以排序,按照key排序,key不可重复
package com.lj.collenction;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class TestMap {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("1", "jordan");
map.put("2", "kobe");
map.put("3", "T-MAC");
map.put("4", "paul");
// 得到全部的key
Set<String> keys = map.keySet();
Iterator<String> iter = keys.iterator();
while(iter.hasNext()) {
String str = iter.next();
System.out.println(str + " ");
}
// 得到全部的value
Collection<String> values = map.values();
Iterator<String> iterValue = values.iterator();
while(iterValue.hasNext()) {
String str = iterValue.next();
System.out.println(str + " ");
}
}
}