Java中的集合类
Java用集合类来容纳不同种类的数据,这种容纳是建立在未知的基础上,即Java要用有限种类的集合类,来容纳无限种类的数据对象。
归纳起来Java的集合类可以分为3类,即集、列表和映射。
1、集(Set)
集(Set):和数学上的“集合”概念相对应,是最简单的一种集合。
Set集合中不区分元素的顺序,因此也就不记录元素的加入顺序。
Set集合中不包含重复元素,即任意的两个元素e1和e2都有e1.equals(e2)=false,并且最多有一个null元素。
2、列表(List)
列表(List)
List列表区分元素的顺序,即List列表能够精确的控制每个元素插入的位置,用户能够使用索引(元素在List中的位置)来访问List中的元素。和Set集合的不同,List允许包含重复元素。
3、映射(Map)
映射:保存的是“键-值”对信息,即Map中存储的每个元素都包括起标识作用的“键”和该元素的“值”两部分,查找数据时不需提供相应的“键”,才能查找到该“键”所映射的“值”。因此,Map集合中不能包含重复的“键”,并且每个“键”最多只能映射一个值。
Collection接口和Map接口:
Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”。
Collection接口有多个子接口,其中最重要的两个java.util.Set和java.util.List分别描述集Set和列表List。
列表:
java.util.List接口描述的是列表结构,允许程序员对列表元素的插入位置进行精确控制,并增加了根据元素索引来访问元素、搜索元素等功能。在继承父接口Collection的基础之上,List接口新增的相应方法:
void add(int index, E element) boolean add(E e)
E remove(int index) boolean remove(Object o)
E get(int index)
int size()
int indexOf(Object obj)
List<E> subList(int fromIndex, int toIndex)
void clear()
Java.util.List接口的实现类有多个,分别体现了列表的不同分化形式。
ArrayList
Vector
Stack
LinkedList
先进后出的Stack类
Stack是Vector类的子类,特点: “后进先出”(Last In First Out)类型的容器,即最后一个被“压(push)”进堆栈中的对象,会被第一个“弹(pop)”出来。
构造方法
Stack() :用于创建支持“后进先出”访问方式的对象
例:Stack st=new Stack();
Stack <String> st = new Stack();
其他方法
E peek() 返回栈顶元素,但没有弹出栈顶元素
E pop() 弹出栈顶元素,并返回其中的对象。
E push(E item) 向堆栈顶端压入item对象,同时将item对象返回。
boolean empty() 判断堆栈是否为空,如果该堆栈为空,返回true,反之返回false。
例10.4 Stack类的综合应用。
Stack st = new Stack(); //Stack <String> st = new Stack();
st.push("First Element");
st.push("second Element"); 死循环,因为peek()方法只返回栈顶元素而没有弹出
st.push("third Element");
while(st.empty() != true){
System.out.println(st.pop().toString());
}
注意:由于Stack继承了Vector类,所以以下语句从语法上来讲,不会有问题。但却破坏了堆栈“后进先出”的特性,所以,不推荐使用。
st.addElement("bad usage1");
st.addElement("bad usage2");
st.addElement("bad usage3");
for(int i=0;i<st.size();i++){
System.out.println(st.elementAt(i));
}
LinkedList类:链式存储方式
数组(逻辑上相邻的两个元素在物理上也是相邻的)
(1)可以根据数组起始地址和其中元素的索引号,很快地定位到数组中的任意元素
(2)插入、删除元素等操作效率底
链式存储方式(逻辑上相邻的两个元素在物理上不相邻,通过“链条”连接)
(1)链表中元素访问的代价要比数组高。
(2)能很方便地完成元素的插入和删除工作