集合类存放于java.util包中。

集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。

常用的集合类型主要有3种:set(集)、list(列表)和map(映射)。

通俗的说,集合就是一个放数据的容器,准确的说是放数据对象引用的容器。

Collection 集合的根接口

------| List  如果是实现了List接口的集合类,具备的特点: 有序,可重复。

---------| ArrayList  ArrayList 底层是维护了一个Object数组实现的。 特点: 查询速度快,增删慢。

---------| LinkedList  LinkedList 底层是使用了链表数据结构实现的, 特点: 查询速度慢,增删快。

---------| Vector(了解即可)  底层也是维护了一个Object的数组实现的,实现与ArrayList是一样的,但是Vector是线程安全的,操作效率低。

------| Set  如果是实现了Set接口的集合类,具备的特点: 无序,不可重复。

----------| HashSet  底层是使用了哈希表来支持的,特点: 存取速度快.

----------| TreeSet   如果元素具备自然顺序 的特性,那么就按照元素自然顺序的特性进行排序存储。

------|Queue 队列接口集合类,是一种先进先出的数据结构,更新时使用术语“入队”“出队”用LinkedList实现接口

Map映射集合的根接口

------|HashMap 通过使用映射关系来到达存储数据,通过hashcode快速查找,具体特点:无序,速度快

------|TreeMap 映像树 ,基于红黑树实现,没有调优选项,处于平衡状态,具体特点:有序,速度慢

用法:

ArrayList:

定义:List<E> list=new ArrayList<E>();//构造一个空数组,默认容量为10

              ArrayList<E> list=new ArrayList<E>();//这两种定义方式一个是以List接口声明,( List为接口,ArrayList是List接口的实现类)另一个是以实现类ArrayList声明,两者相差不大,实现函数方法基本一样。(注:用List声明的数组中,像TrimToSize()没有,而用ArrayList声明里面可以使用,该方法用来删除预留元素的空间,这预留元素的空间并不是null而是每次ArrayList增长都会申请多一点空间,当size()=1000,ArrayList已经申请了1200空间,而该方法是删除多余的200空间,该方法用来内存紧张的时候使用),

       (尖括号里面的E是数据类型,比如:如果是String,则该数组里面只能存String类型的数据)

个人认为能用ArrayList声明尽量用ArrayList声明;

常用方法:

add(E e):                     在数组末尾添加元素
size():                           数组中实际元素个数,并不是数组容量
add(int index, E e):    在数组指定位置添加元素
clear():                         将数组中元素清空
contains(E e):             判断数组中是否含有某个元素
get(int index):             返回数组指定位置的元素
indexOf(E e):      返回数组指定元素第一次出现的位置
set(int index, E e):     替换数组指定位置的值
remove(int index):     移除数组指定位置的元素并返回删除的值
remove(E e):  移除数组中第一次出现的指定元素并返回true和false
addAll(Collection<? extends E> c):  在数组末尾添加另一个数组
addAll(int index, collection<? extends E> c):   在数组指定位置添加另一个数组
removeAll(Collection<?>c):   将数组中属于数组 c 中的元素全部删除

LinkedList:

定义:LinkedList<E> linkedlist=new LinkedList<E>();

LinkedList其实数据结构里面的双向链表,既然是链表,那么分配的存储空间并不是连续的,而是分散的,插入和删除操作很快,时间复杂度为O(1);但访问该数组时就比较慢了,必须从第一个元素开始找起,时间复杂度为O(n);

它包含了一个重要的内部类Node,Node是双向链表节点所对应的数据结构它包含的属性有,当前节点所包含的值,上一个节点及下一个节点。

LinkedList既可以作为先进先出的队列又可以作为后进先出的堆栈,并且提供了了丰富的方法

常用方法:

添加:

boolean add(E e):在链表后添加一个元素,如果成功,返回true,否则返回false;
addFirst(E e):在链表头部插入一个元素;
addLast(E e):在链表尾部添加一个元素;
add(int index, E element):在指定位置插入一个元素。
offer(E e);类似队列的插入方法
offerFirst(E e);在头部插入一个元素
offerLast(E e);在尾部插入一个元素

删除:

remove();移除链表中第一个元素;

boolean remove(Object o):移除链表中指定的元素;

remove(int index):移除链表中指定位置的元素;

removeFirst():移除链表中第一个元素,与remove类似;

removeLast():移除链表中最后一个元素;

boolean removeFirstOccurrence(Object o):移除链表中第一次出现所在位置的元素;

boolean removeLastOccurrence(Object o):移除链表中最后一次出现所在位置的元素;

获取元素:

get(int index):按照下边获取元素;

getFirst():获取第一个元素;

getLast():获取第二个元素;

以上为队列的先进先出的方法

下面的方法是堆栈的类似方法:

push(E e):与addFirst一样,实际上它就是addFirst;
pop():与removeFirst一样,实际上它就是removeFirst;
poll():查询并移除第一个元素;
peek():获取第一个元素,但是不移除;
peekFirst():获取第一个元素,但是不移除;
peekLast():获取最后一个元素,但是不移除;

比较特殊的方法:

getFirst();
getLast();

获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException

removeFirst();
removeLast();

获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException

在JDK1.6出现了替代方法。

offerFirst();
offerLast();
peekFirst();
peekLast();

获取元素,但不删除元素。如果集合中没有元素,会返回null。

pollFirst();
pollLast();

获取元素,但是元素被删除。如果集合中没有元素,会返回null。

遍历的方法:

(01) 第一种,通过迭代器遍历。即通过Iterator去遍历。

for(Iterator iter = list.iterator(); iter.hasNext();)
    iter.next();

(02) 通过快速随机访问遍历LinkedList

int size = list.size();
for (int i=0; i<size; i++) {
    list.get(i);       
}

(03) 通过另外一种for循环来遍历LinkedList

for (Integer integ:list)  ;
(04) 通过pollFirst()来遍历LinkedList
while(list.pollFirst() != null) ;
(05) 通过pollLast()来遍历LinkedList
while(list.pollLast() != null) ;
(06) 通过removeFirst()来遍历LinkedList
try {
    while(list.removeFirst() != null) ;
} catch (NoSuchElementException e) {
}

(07) 通过removeLast()来遍历LinkedList

try {
    while(list.removeLast() != null)  ;
} catch (NoSuchElementException e) {
}

(注:千万不要通过随机访问去遍历LinkedList,如果该数组很长所花费的时间也就会很长)

Vector:又称之为向量类,与ArrayList差不多,只不过Vector是线程安全,它里面的方法基本都是用synchronized修饰。

HashSet:

定义:HashSet<E> hashset=new HashSet<E>();

              或者Set<E> hashset=new HashSet<E>();

上面提到Set是无序,所以HashSet里面没有重复的数据,可以允许为null值,它是Set接口的一个实现类

如何添加同一个数据,HashSet会调用hashCode()用来判断是否相同,执行完HashCode后也会执行equals,如果两者都返回true,那么它就会认为这两者数据是一样的,就会停止添加,否则直接添加

如何重写了equals函数那么HashCode也必须重写,否则会出错

常用方法:

add(E e)     如果此 set 中尚未包含指定元素,则添加指定元素。

clear()     从此 set 中移除所有元素。

clone()       返回此 HashSet 实例的浅表副本:并没有复制这些元素本身。contains(Object o)     如果此 set 包含指定元素,则返回 true。

isEmpty()    如果此 set 不包含任何元素,则返回 true。

iterator()    返回对此 set 中元素进行迭代的迭代器。

remove(Object o)   如果指定元素存在于此 set 中,则将其移除。

size()       返回此 set 中的元素的数量(set 的容量)。

TreeSet:

它是红黑树数据结构,他是是基于TreeMap实现

TreeSet是非同步的

TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。

HashMap:

通过键值对key-value的形式存值,有点类似于哈希表的链式存储方式,

允许用null作为key和value

这个实现的基本操作提供了稳定的性能(get和put)

Get(Object key)     //获取key对应的value值
Put(key,value)      //存值
HashMap不能直接遍历,必须通过KeySet()方法返回一个key的Set集合然后在通过遍历set来获取value的值
remove(Object key)    //如果存在的话,从这个映射中移除指定的键的映射。
Size()      //返回键值对的数目

 

 

以上为个人总结