Java集合框架包含的内容
Java集合框架为我们提供了一套性能优良、使用方便的接口和类、它们都位于Java.util包中。
但支持多线程的集合类位于java.util.concurrent包下。
数组与集合的区别如下:
1)数组长度不可变化而且无法保存具有映射关系的数据;集合类用于保存数量不确定的数据,以及保存具有映射关系的数据。
2)数组元素既可以是基本类型的值,也可以是对象;集合只能保存对象。
集合框架包含三大块内容:对外的接口、接口的实现和对集合运算的算法。
接口:表示集合的抽象数据类型,如:Collection、List、Set、Map、Iterator。
实现:集合框架中接口的具体实现,上图实线框表示、粗实线2表示最常用的实现,如Array List、Linked List、Hash Map、Hash Set。
算法:在一个实现了某个集合框架中的接口的对象身上完成某种有用的计算的方法,如查找、排序等。【Java提供了进行集合操作的工具类Collections(注意不是Collection,类似于Arrays类),它提供了对集合进行排序等多种算法实现。在使用Collections的时候可以查阅JDK帮助文档。】
Java集合框架中的两大类接口:Collection和Map。其中Collection又有两个子接口:List和Set。
所以Java共有三大类接口:List、Set和Map。
共同点:都是集合接口、都可以用来存储很多对象。
区别:
- Collection接口存储一组不唯一(允许重复)、无序的对象。
- Set接口继承Collection接口,存储一组唯一(不允许重复)、无序的对象。
- List接口继承Collection接口,存储一组不唯一(允许重复)、有序(根据插入的次序排放,不会重新排列)的对象。
- Map接口存储一组成对的键——值对象、提供key(键)到value(值)。Map中的key不要求有序,不允许重复。value同样不要求有序,但可以重复。
- Iterator接口是负责定义访问和遍历元素的接口。(又称迭代器)。
List接口
List集合代表一个有序、可重复集合,集合中每个元素都有其对应的顺序索引。List集合默认按照元素的添加顺序设置元素的索引,可以通过索引(类似数组的下标)来访问指定位置的集合元素。常用类有Array List和Linked List。都可以容纳所以类型的对象,包括NULL、允许重复、且都有序存储。
1)ArrayList
ArrayList是一个动态数组,也是我们最常用的集合,是List类的典型实现。它允许任何符合规则的元素插入甚至包括null。每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小。随着容器中的元素不断增加,容器的大小也会随着增加。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。
ArrayList擅长于随机访问。同时ArrayList是非同步的。
2)LinkedList
LinkedList是List接口的另一个实现,除了可以根据索引访问集合元素外,LinkedList还实现了Deque接口,可以当作双端队列来使用,也就是说,既可以当作“栈”使用,又可以当作队列使用。
LinkedList的实现机制与ArrayList的实现机制完全不同,ArrayLiat内部以数组的形式保存集合的元素,所以随机访问集合元素有较好的性能;LinkedList内部以链表的形式保存集合中的元素,所以随机访问集合中的元素性能较差,但在插入、删除元素时有较好的性能。
List接口常用方法:【ArrayList可与Linked List方法通用】。
1、add(Object element): 向列表的尾部添加指定的元素,起始索引位置从0开始。
2、size(): 返回列表中的元素个数。
3、get(int index): 返回列表中指定位置的元素,index从0开始。
4、add(int index, Object element): 在列表的指定位置插入指定元素。
5、set(int i, Object element): 将索引i位置元素替换为元素element并返回被替换的元素。
6、Object get(int index):返回指定索引位置处的元素。注意:取出的元素时Object类型,使用前要进行强制类型转换。
7、clear(): 从列表中移除所有元素。
8、isEmpty(): 判断列表是否包含元素,不包含元素则返回 true,否则返回false。
9、contains(Object o): 如果列表包含指定的元素,则返回 true。
10、remove(int index): 移除列表中指定位置的元素,并返回被删元素。
11、remove(Object o): 移除集合中第一次出现的指定元素,移除成功返回true,否则返回false。
12、iterator(): 返回按适当顺序在列表的元素上进行迭代的迭代器。
Linked List详细方法
栈:先进先出。堆:先进后出。
使用LinkedList实现堆栈和队列
一.使用LinkedList实现堆栈(先进后出)
二.使用LinkedList实现队列(先进先出,后进后出)
一.使用LinkedList实现堆栈(先进后出)
首先我们通过一个例子来了解linkedlist实现堆栈的原理,即先进后出:
假设有一个子弹匣,当我们往里面添加子弹的时候,往往第一颗子弹会被压到子弹匣的最底部,而最后一粒添加的子弹是在子弹匣的最顶部,即先进的子弹在最底部,后进的子弹在最顶部.
当我们开枪的时候,往往是从最顶部发出,但我们会发现最顶部的那颗子弹是最后添加的,而最底部的子弹是最后发出的,即先进后出.
注意:
1.堆是堆,栈是栈;堆栈是堆栈!
2.堆栈是一种数据结构!
图解:
import java.util.LinkedList;
public class MyStack {
//定义一个linkedlist集合
private LinkedList<Object> lst=new LinkedList<>();
//压栈(添加子弹)
public void push(Object obj) {
lst.addFirst(obj);
}
//出栈(开枪)
public Object pop() {
Object first = lst.getFirst();
lst.removeFirst();
return first;
}
//判断大小
public int size() {
return lst.size();
}
//测试
public static void main(String[] args) {
//实例化
MyStack ms=new MyStack();
//压栈
ms.push("a");
ms.push("b");
ms.push("c");
ms.push("d");
//判断是否还有元素
while(ms.size()!=0) {
//出栈
System.out.println(ms.pop());
}
}
}
二.使用LinkedList实现队列(先进先出,后进后出)
简单的来说像是在吹泡泡…
图解:
import java.util.LinkedList;
public class MyQueue {
//定义一个linkedlist集合
private LinkedList<Object> lst=new LinkedList<>();
//入队
public void add(Object obj) {
lst.addFirst(obj);
}
//出队
public Object get() {
return lst.removeLast();
}
//判断大小
public int size() {
return lst.size();
}
//测试
public static void main(String[] args) {
//实例化
MyQueue mq=new MyQueue();
//入队
mq.add("a");
mq.add("b");
mq.add("c");
mq.add("d");
mq.add("e");
//判断是否还有元素
while(mq.size()!=0) {
System.out.println(mq.get());//出队
}
}
}
增加:
add(E e):在链表后添加一个元素; 通用方法
addFirst(E e):在链表头部插入一个元素; 特有方法
addLast(E e):在链表尾部添加一个元素; 特有方法
push(E e):与addFirst方法一致
offer(E e):在链表尾部插入一个元素
add(int index, E element):在指定位置插入一个元素。
offerFirst(E e):JDK1.6版本之后,在头部添加; 特有方法
offerLast(E e):JDK1.6版本之后,在尾部添加; 特有方法
删除:
remove() :移除链表中第一个元素; 通用方法
remove(E e):移除指定元素; 通用方法
removeFirst(E e):删除头,获取元素并删除; 特有方法【 Object类型】
removeLast(E e):删除尾; 特有方法【 Object类型】
pollFirst():删除头; 特有方法
pollLast():删除尾; 特有方法
pop():和removeFirst方法一致,删除头。
poll():查询并移除第一个元素 特有方法
查:
get(int index):按照下标获取元素; 通用方法
getFirst():获取第一个元素; 特有方法【 Object类型】
getLast():获取最后一个元素; 特有方法 【Object类型】
peek():获取第一个元素,但是不移除; 特有方法
peekFirst():获取第一个元素,但是不移除;
peekLast():获取最后一个元素,但是不移除;
pollFirst():查询并删除头; 特有方法
pollLast():删除尾; 特有方法
poll():查询并移除第一个元素 特有方法
Map接口
HashMap是最常见的Map实现类,它的存储方式是哈希表,有点是查询指定元素效率高。
HashMap线程不安全——HashTable线程安全
Map概述
- Map与Collection并列存在。用于保存具有映射关系的数据:key-value
- Map 中的 key 和 value 都可以是任何引用类型的数据
- Map 中的 key 用Set来存放,不允许重复,即同一个 Map 对象所对应 的类,须重写hashCode()和equals()方法
- 常用String类作为Map的“键”
- key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到 唯一的、确定的 value
Map的方法:
添加、删除、修改操作:
- Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
- void putAll(Map m):将m中的所有key-value对存放到当前map中
- Object remove(Object key):移除指定key的key-value对,并返回value
- void clear():清空当前map中的所有数据
元素查询的操作:
- Object get(Object key):获取指定key对应的value
- boolean containsKey(Object key):是否包含指定的key
- boolean containsValue(Object value):是否包含指定的value
- int size():返回map中key-value对的个数
- boolean isEmpty():判断当前map是否为空
- boolean equals(Object obj):判断当前map和参数对象obj是否相等
元视图操作的方法:
- Set keySet():返回所有key构成的Set集合
- Collection values():返回所有value构成的Collection集合
- Set entrySet():返回所有key-value对构成的Set集
常用方法:
添加:put(Object key,Object value)
删除:remove(Object key)
修改:put(Object key,Object value)
查询:get(Object key)
长度:size()
遍历:keySet() / values() / entrySet()
迭代器Iterator
Collection接口的iterator()方法返回一个Iterator,然后通过Iterator接口的两个方法即可方便实现遍历。
- boolean hasNext():判断是否存在另一个可访问的元素。
- Object next():返回要访问的下个元素。
Iterator为集合而生,专门实现集合的遍历。隐藏了各种集合实现类的内部细节,提供了遍历集合的统一编程接口。
泛型集合
在创建集合时指定集合中元素的类型。从集合中取出元素时无须进行类型强制转换,避免了Class ClassCastException异常,并且如果把非指定类型对象放入集合,就会出现编译错误。
Java中共有八个包装类:Byte、Short、Integer、Long、Float、Double、Boolean和Character。