Java的集合框架简单介绍
java中有一个由设计优良的接口和类组成的Java集合框架,以方便程序员操作成批的数据或对象元素,本文会讲解其中常用的一些接口的方法以及其应用
集合框架结构
这里只显示了Collection接口的一部分接口和Map接口下常用的HashMap接口,而这两个接口下还是有许多其他的接口的,本文没有介绍,读者有兴趣可以再去了解。
-----------------------------------------------------------------正文开始---------------------------------------------------------
1.Collection接口
Collection接口是Set接口和List接口的父接口,是最基本的接口,定义了对集合进行基本操作的一些通用方法,Collection接口提供的主要方法如下:
之后的接口可以调用这些方法
CollectionTest.java
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionTest{
public static void main(String[] args){
Collection c =new ArrayList(); //创建集合c
c.add("Apple");
c.add("Banana");
c.add("pear");
c.add("Orange");
ArrayList arry =new ArrayList(); //创建集合arry
arry.add("Cat");
arry.add("Dog");
System.out.println("集合c中元素个数为:"+c.size());
if(!arry.isEmpty()){ //array不为空
c.addAll(arry); //将集合array中的元素添加到集合c中
}
System.out.println("集合c中的元素个数:"+c.size());
Iterator iterator=c.iterator(); //返回迭代器对象
System.out.println("集合c中的元素:");
while(iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
System.out.println();
if(c.contains("Cat")){
System.out.println("----集合c中包含元素Cat-----");
}
c.removeAll(arry); //从集合c中删除集合arry中所有的元素
iterator=c.iterator();
System.out.println("集合c中的元素:");
while (iterator.hasNext()){
System.out.println(iterator.next()+" ");
}
System.out.println();
//将集合中的元素存放到字符数组中
Object[] str=c.toArray();
String s="";
System.out.println("数组中的元素为:");
for(int i=0;i<str.length;i++){
s=(String) str[i]; //将对象强制转化为字符串
System.out.print(s+" "); //输出数组元素
}
System.out.println();
}
}
这里用到了待会要讲到的ArrayList类,主要是为了突出Collection接口与子接口的关系以及操作
1.Collection接口能够将整个子接口的元素作为一个整体来进行添加与删除
2.通过迭代器对象(Iterator)来将集合中的元素输出
结果:
2.List 接口
List接口是Collection的子接口,实现List接口的容器类中的元素是有顺序的,并且元素可以重复。List容器中的元素对应一个整数型的序号,记录其在List容器中的位置,可以根据序号存取容器中的元素。除了继承Collection接口的方法外,又提供了一些方法
本文介绍实现List接口的容器类ArrayList、LinkedList
- a.ArrayList类
ArrayList类实现一个可变大小的数组,可以像链表一样被访问。它以数组的方式实现,允许快速随机存取。它允许包含所有元素,包括null元素。每个ArrayList类实例都有一个容量(capacity),即存储元素的数组大小,这个容量可以随着不断添加新元素而自动增加
ArrayList类常用的构造方法有3种重载形式:
构造一个初始容量为10的空列表:
public ArrayList()
构造一个指定初始容量的空列表:
public ArrayList(int initialCapacity)
构造一个包含指定集合元素的列表,这些元素是按照该集合的迭代器返回它们的顺序排列:
public ArrayList(Collection c)
ArrayListTest.java
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ArrayListTest{
public static void main(String args[]){
ArrayList list=new ArrayList();
list.add("cat");
list.add("dog");
list.add("pig");
list.add("sheep");
list.add("pig");
System.out.println("------输出集合中的元素-----");
Iterator iterator=list.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
System.out.println();
//替换指定索引处的元素
System.out.println("返回替换集合中索引是1的元素: "+list.set(1,"mouse"));
iterator = list.iterator();
System.out.println("----元素替换后集合中的元素------");
while(iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
System.out.println();
//获取指定索引处的集合元素
System.out.println("获取集合中索引是2的元素:"+list.get(2));
System.out.println("集合中第一次出现pig的索引"+list.indexOf("pig"));
System.out.println("集合中最后一次出现dog的索引"+list.lastIndexOf("dog"));
List l =list.subList(1,4); //返回集合中 [1,4)的集合
iterator = l.iterator();
System.out.println("-------新集合中的元素------");
while(iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
System.out.println();
}
}
结果:
- b. LinkedList 类
LinkedList实现了List接口,允许null元素。LinkedList类实现一个链表可以对集合的首部和尾部进行插入和删除操作,这些操作可以使LinkedList类被用作堆栈(stack)、队列(queue)或双向队列(deque)。相对于ArrayList,LinkedList在插入或删除元素时提供了好的性能,但是随机访问元素的速度则相对较慢。LinkedList类除了承List接口的方法,又提供了一些方法
LinkedListTest.java
import java.util.Iterator;
import java.util.LinkedList;
public class LinkedListTest{
public static void main(String [] args){
LinkedList list = new LinkedList();
list.add("cat");
list.add("dog");
list.add("pig");
list.add("sheep");
list.add("mouse");
list.add("duck");
System.out.println("-------输出集合中的元素---------");
Iterator iterator=list.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
System.out.println();
System.out.println("获取集合中的第一个元素:"+list.getFirst());
System.out.println("获取集合中的最后一个元素:"+list.getLast());
System.out.println("删除集合中的第一个元素"+list.removeFirst());
System.out.println("删除集合中的最后一个元素"+list.removeLast());
System.out.println("------------删除元素后的集合---------");
iterator = list.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
System.out.println();
}
}
结果:
3.Set接口
Set接口的容器类中的元素是没有顺序的,并且元素不可以重复,Set接口没有新增方法
- a.HashSet类
HashSet类实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,但最多只能有一个。HashSet添加一个元素时,会调用元素的hashCode()方法,获得其哈希码,根据这个哈希码计算该元素在集合中的存储位置。HashSet使用哈希算法存储集合中的元素,可以提高集合元素的存储速度
HashSet类的常用构造方法有3种重载形式
构造一个新的空Set集合:
public HashSet()
构造一个包含指定集合中的元素的新Set集合:
public HashSet(Collection c)
构造一个新的空Set集合,指定初始容量:
public HashSet(int initialCapacity)
HashSetTest.java
import java.util.HashSet;
import java.util.Iterator;
public class HashSetTest{
public static void main(String [] args){
HashSet hash = new HashSet();
hash.add("56");
hash.add("32");
hash.add("50");
hash.add("48");
hash.add("48");
hash.add("23");
System.out.println("集合元素个数:"+hash.size());
Iterator iter = hash.iterator();
while(iter.hasNext()){
System.out.print(iter.next()+" ");
}
System.out.println();
}
}
结果:
b.TreeSet类
TreeSet类不仅继承了Set接口,还继承了SortedSet接口,它不允许出现重复元素。由于SortedSet接口可以对集合中的元素进行自然排序(即升序排序),因此TreeSet类会对实现了Comparable接口的类的对象自动排序
TreeSet类提供的方法如表:
TreeSetTest.java
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;
public class TreeSetTest{
public static void main(String [] args){
TreeSet tree=new TreeSet();
tree.add("45");
tree.add("32");
tree.add("68");
tree.add("12");
tree.add("20");
tree.add("80");
tree.add("75");
System.out.println("集合元素个数:"+tree.size());
System.out.println("------集合中的元素-----");
Iterator iter=tree.iterator();
while(iter.hasNext()){
System.out.print(iter.next()+" ");
}
System.out.println();
System.out.println("----集合中20~68的元素----");
SortedSet s = tree.subSet("20","68");
iter = s.iterator();
while(iter.hasNext()){
System.out.print(iter.next()+" ");
}
System.out.println();
System.out.println("--------集合中45之前的元素------");
SortedSet s1 = tree.headSet("45");
iter = s1.iterator();
while(iter.hasNext()){
System.out.print(iter.next() + " ");
}
System.out.println();
System.out.println("--------集合中45之后的元素------");
SortedSet s2 = tree.tailSet("45");
iter = s2.iterator();
while(iter.hasNext()){
System.out.print(iter.next()+" ");
}
System.out.println();
System.out.println("集合中的第一个元素:"+tree.first());
System.out.println("集合中的第一个元素:"+tree.last());
System.out.println("获取并移出集合中第一个元素:"+tree.pollFirst());
System.out.println("获取并移出集合中最后一个元素:"+tree.pollLast());
System.out.println("------集合中的元素------");
iter = tree.iterator();
while(iter.hasNext()){
System.out.print(iter.next()+" ");
}
System.out.println();
}
}
结果:
4.Map接口
Map接口是用来存储“键-值”对的集合,存储的“键-值”对是通过键来标识的,所以键不可以重复
- a.HashMap类
HashMap是基于哈希表的Map接口的实现类,以“键-值”对映射的形式存在。它在HashMap中总是被当作一个整体,系统会根据哈希算法来计算“键-值”对的存储位置,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。可以通过键快速地存取值。TreeMap类继承了AbstractMap,可以对键对象进行排序。
Map接口提供的方法如表:
HashMapTest.java
import java.util.Iterator;
import java.util.Set;
import java.util.HashMap;
public class HashMapTest{
public static void main(String[] args){
HashMap map = new HashMap();
map.put("101","一代天骄");
map.put("102","成吉思汗");
map.put("103","只识弯弓射大雕");
map.put("104","俱往矣");
map.put("105","数风流人物");
map.put("106","还看今朝");
System.out.println("键值为102的值为:"+map.get("102"));
Set s = map.keySet();
Iterator iterator =s.iterator();
String key="";
while(iterator.hasNext()){
key=(String)iterator.next();
System.out.println(key+":"+map.get(key));
}
}
}
结果:
--------------------------------------------------------------正文结束------------------------------------------------------------
参考书籍:《Java 从入门到项目实践 》