List(有序) | Set(无序、不重复) | Map | |||||
ArrayList | LinkedList | Vector | HashSet | TreeSet | HashMap | Hashtable | TreeMap |
基于数组 | 基于链表 | 基于数组 | 基于哈希表 | 基于二叉数 | 基于哈希表 | 基于哈希表 | 基于红黑树 |
尾部追加查询快,中间插入删除慢 | 尾部追加和查询慢,中间插入删除快 | 与ArrayList一样,但多线程同步 | 以hashcode码为标识,性能优于TreeSet适合快速查找 | 需要排序时使用 | Map中插入、删除和定位元素 | 效率没HashMap高,但线程同步 | 按自然循序或自定义顺序遍历键 |
允许为空 | 允许为空 | 允许为空 | 允许有一项为空 | 不允许为空 | 允许一项为空 | 不允许为空 | 不允许为空 |
0.引言
数据结构是以某种形式将数据组织在一起的集合。数据结构不仅存储数据,还支持那些访问和处理的操作。比如ArrayList它是一种将数据存储在线性表中的数据结构,另外Java还提供了能有效地组织和操作数据的数据结构,这些数据结构通常称之为Java集合框架(Java Collections Framework)。
在面对对象思想里,一种数据结构被称之为一个容器,它是一个能存储数据或者元素的对象。定义一种数据结构从本质上讲就是定义一个类,数据结构类应用使用数据域存储数据,并提供方法支持查找、插入和删除等操作。因此创建一个数据结构就是创建这个类的一个实例。然后用这个实例上的方法操作这个数据结构。
集合框架支持两种类型的容器:存储一个元素集合,简称集合(collection)和存储键值对,称之图(map)。
1.集合
集合(Collection)包括三种类型:规则集(Set)、线性表(List)、队列(Queue)。Set实例用于存储一组不重复的元素,List的实例用于存储一个由元素构成的有序集合,Queue的实例用于存储用先进先出方式处理的对象。这些集合的特性都被定义在接口中,而它的实现是在具体类中提供的。
Collection接口是util包下的,所以在使用Collection下的方法要导util包,提供了具体的子接口(List和Set)。Collections有一个方法可对元素排序sort(List list);
主要方法:
boolean add(E e)添加
boolean clear()清除
boolean isEmpty()判断容器是否包含元素
boolean remove(Object o)在此collection中移除指定元素
Iterator<E> iterator()返回在此collection的元素上进行迭代的迭代器
int size()返回此collection中的元素数
2.子接口 List<E> extends Collection<E>:有序,可重复
新增方法:
void add(int index,E element) 在列表的指定位置插入指定元素
E get(int index)返回列表中指定位置的元素
E remove(int index)移除列表中指定位置的元素
E set(int index,E element)用指定元素替换列表中指定位置的元素
Object[] toArray()返回按适当顺序包含列表中所有元素的数组
1). ArrayList<E>类实现List<E>接口:基于数组,尾部追加查询快,中间插入删除慢,允许为空
常用方法:
ArrayList()构造一个初始初始为10的空列表
ArrayList(Collection<? extends E> c)构造一个包含指定collection的元素列表
ArrayList(int initialCapacity)构造一个具有指定初始容量的空列表
void trimToSize()将此ArrayLIst实例的容量调整为列表的当前大小
实例
package com.example.test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Demo01 {
public static void main(String[] args) {
List list=new ArrayList();
list.add("hello");
list.add(12);
list.add(true);
list.add(1,"world");//输出helloworld12true
list.set(0, "hello1");//输出hello1world12true
list.remove(1);//输出hello112true
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i));;
}
System.out.println();
list.clear();
list.add("hello2");
list.add(11);
list.add(false);
//迭代器的使用
Iterator it=list.iterator();//it先指向第一个元素的前面
while(it.hasNext()){//再判断是否有下一个元素
Object obj=it.next();//有取得下一个元素
System.out.print(obj);
}
}
}
输出:
2).LinkedList<E>实现List<E>接口:基于链表,尾部追加和查询慢,中间插入删除快
方法与ArrayList相同
3).Vector 底层基于数组的实现,是同步的(在多线程环境安全)
方法与ArrayList相同
2.子接口 Set<E> extends Collection<E>:无序,不能出现重复元素,至多包含一个null元素
1).HashSet<E>实现Set<E>接口,基于哈希码(HashCode),允许有一项为空
package com.example.test;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Demo02 {
public static void main(String[] args) {
Set set=new HashSet();
set.add("hello");
set.add(12);
set.add(null);
set.add(true);
set.add(null);//只输出一个null,不会报错
Iterator it=set.iterator();
while(it.hasNext()){
Object obj=it.next();
System.out.print(obj);
}
}
}
输出
2).TreeSet<E>实现Set<E>接口,基于树的实现,不允许出现为空,并插入的类型一致,不然会报错
3.图
图是一种依照键值存储元素的容器,键值很像下标。在List中,下标是整数,在Map中,键值可以是任意类型的对象。图中不能有重复的键值,每个键值都对应一个值,一个键值和它的对应值构成一个条目,真正在图中存储的是这个条目。
图的类型有三种:散列图HashMap、链式散列图LinkedHashMap和树形图TreeMap。
常用方法:
void clear() 从此映射中移除所有映射关系
V get(Object key) 返回指定键所映射的值,没有返回null
Set<K> keySet()返回此映射中包含的键的Set视图,就是得到所有的key
V put(K key,V value)将指定的值与此映射中的指定键关联
V remove(Object key)如果存在一个键的映射关系,将其移除
int size()返回此映射中的键值映射关系数
Collection<V> values()得到所有的值
1).HashMap<K,V>实现Map<K,V>接口,基于哈希码,允许有一项为空,不同步
2).TreeMap<K,V>实现Map<K,V>接口,基于红黑树,不允许为空
3).Hashtable<K,V>实现Map<K,V>接口,底层基于哈希表,是同步的
实例:
package java0401;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class Demo01 {
public static void main(String[] args) {
//Map map=new HashMap();
Map map=new TreeMap();
map.put(1001, "tom");
map.put(1002, 123);
map.put(1003, null);
Set<Map.Entry> set=map.entrySet();
for (Map.Entry entry : set) {
System.out.println(entry.getKey()+":"+entry.getValue());
}
//图的遍历
/*Set set=map.keySet();
Iterator it=set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}*/
//获得所有的VALUE
/* Collection cl=map.values();
Iterator it=cl.iterator();
while(it.hasNext()){
System.out.println(it.next());
}*/
//map.clear();
//map.remove("hello");
//System.out.println(map.get("hello"));//得到hello映射的值,没有返回NULL
}
}
结果