Java提供了几个能有效地组织和操作数据的数据结构,这些数据结构简称为Java集合框架。
Java集合框架主要包括两种类型的容器,一种是集合(接口Collection<E>),存储一个元素集合,另一种是图(接口Map<K,V>),存储键/值对映射。Collection接口又有3种子类型,List、Set和Queue,再下面是一些抽象类,最后是具体实现类,常用的有ArrayList、LinkedList、Vector、HashSet、LinkedHashSet、HashMap、LinkedHashMap等等。
1. List
下面介绍ArrayList、LinkedList、Vector这三个类
java.util.ArrayList<E> : 基于数组:查询方便,插入麻烦
代码举例:
package List;
import java.util.ArrayList;
import java.util.List;
import DrawBoard2.Shape;
import DrawBoard2.ShapeLine;
public class MyListArry {
List<Shape> myList = null;
public void genData(){
myList = new ArrayList<Shape>();
myList.add(new ShapeLine(1,1,1,1,null,1));//添加元素
myList.add(new ShapeLine(2,1,1,1,null,1));
myList.add(new ShapeLine(3,1,1,1,null,1));
myList.add(new ShapeLine(4,1,1,1,null,1));
}
public void printData(){
//遍历ArrayList
int size = myList.size();//获取元素个数
for(int i = 0;i < size;i++){
Shape shape = myList.get(i);//获取指定位置元素
System.out.println(shape);
}
}
public static void main(String[] args) {
MyListArry mla = new MyListArry();
mla.genData();
mla.printData();
}
}
java.util.LinkedList<E> : 基于链表:插入容易,访问麻烦
代码举例(类似ArrayList)
package List;
import java.util.LinkedList;
import java.util.List;
import DrawBoard2.Shape;
import DrawBoard2.ShapeLine;
public class MyLink {
List<Shape> myList = null;
public void genData(){
myList = new LinkedList<Shape>();
myList.add(new ShapeLine(1,1,1,1,null,1));
myList.add(new ShapeLine(2,1,1,1,null,1));
myList.add(new ShapeLine(3,1,1,1,null,1));
myList.add(new ShapeLine(4,1,1,1,null,1));
}
public void printData(){
//遍历LinkedList
int size = myList.size();
for(int i = 0;i < size;i++){
Shape shape = myList.get(i);
System.out.println(shape);
}
}
public static void main(String[] args) {
MyLink ml = new MyLink();
ml.genData();
ml.printData();
}
}
LinkedList是在一个链表中存储元素,如果需要经常插入或者删除元素可以选择该类
java.util.Vector<E> : 基于数组:基于线程安全,付出一定性能代价(代码类似ArrayList)
注:List是有序的集合(可按插入顺序显示),且可以重复插入
2.Set
HashSet
package List;
import java.util.HashSet;
import java.util.Iterator;
import DrawBoard2.Shape;
import DrawBoard2.ShapeLine;
public class TestHashSet {
HashSet<Shape> myList = null;
public void genData(){
myList = new HashSet<Shape>();
myList.add(new ShapeLine(1,1,1,1,null,1));
myList.add(new ShapeLine(2,1,1,1,null,1));
myList.add(new ShapeLine(3,1,1,1,null,1));
myList.add(new ShapeLine(4,1,1,1,null,1));
}
public void printData(){
//遍历
Iterator<Shape> iterator = myList.iterator();//创建迭代器对象
while(iterator.hasNext()){ //如果有下一个元素可以迭代则返回true继续执行循环
Shape s = iterator.next();
System.out.println(s);
}
}
public static void main(String[] args) {
TestHashSet hs = new TestHashSet();
hs.genData();
hs.printData();
}
}
LinkedHashSet是HashSet的子类
注:Set是个无序的,且不允许重复元素存在的集合,遍历时用到迭代器
Iterator<Shape> iterator = hashSet.iterator();
while (iterator.hasNext()) {
Shape s = iterator.next();
System.out.println(s);
}
3.Map<K,V>
HashMap<K,V>
package List;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import DrawBoard2.Shape;
import DrawBoard2.ShapeLine;
public class TestHashMap {
HashMap<String,Shape> myList = null;
public void genData(){
myList = new HashMap<String,Shape>();
myList.put("shape1",new ShapeLine(1,1,1,1,null,1));
myList.put("shape2",new ShapeLine(2,1,1,1,null,1));
myList.put("shape3",new ShapeLine(3,1,1,1,null,1));
myList.put("shape4",new ShapeLine(4,1,1,1,null,1));
}
public void printData(){
//遍历
Set<String> keySet = myList.keySet(); //获得所含键
Iterator<String> iterator = keySet.iterator(); //调用迭代器方法
while(iterator.hasNext()){
String key = iterator.next();
Shape shape = myList.get(key); //获得指定键所映射的值
System.out.println(key);
System.out.println(shape);
}
}
public static void main(String[] args) {
TestHashMap hm = new TestHashMap();
hm.genData();
hm.printData();
}
}
在Map中键可以是任意类型的对象,但不能有重复的键,每个键都对应一个值,真正存储在图中的是键值构成的条目,LinkedHashMap继承自HashMap,它主要是用链表实现来扩展HashMap类,HashMap中条目是没有顺序的,但是在LinkedHashMap中元素既可以按照它们插入图的顺序排序,也可以按它们最后一次被访问的顺序排序。