集合类存放于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() //返回键值对的数目
以上为个人总结