一、集合框架概述
所谓集合,它用于存储对象的容器,它的实现就是基于数组,但为什么我们不能存到数组中呢?因为在大多数情况下,对象的个数是不确定的,而数组一旦存储了就不能改变,这时就使用一个叫集合容器进行存储。因为集合石可变长度的。
集合的特点:1.用于存储对象的容器;2.集合的长度是可变的;3.集合不可以存储基本数据类型值,可存储引用类型,也就是保存的是对象的地址(存的都是对象的引用,而非对象本身)。这些也是数组与集合的区别。
集合框架——体系共性功能
集合容器因为内部的数据结构不同,有多种具体容器.不断向上抽取,就形成了集合框架.框架的顶层Collection接口.
集合从体系上分为三种:
(1) 列表(list):list集合区分元素的顺序(存入和取出顺序一致),元素都有索引,允许包含相同的元素.
(2) 集(set):set集合不区分元素的顺序,不允许包含相同的元素.
(3) 映射(Map):Map集合以"键--值"对的形式保存数据,"键"不能重复,每一个键只对应一个"值".
(一)、List接口
list容器特有的常见方法有一个共性特点:都有一个整数型序号,记录该对象在容器的位置,可根据这个序号(索引)来访问容器中的元素。
常用的实现list接口类:
(1)vector:内部是数组结构,同步的.相对于其他,没有优势,增删查询都比较慢.
(2)ArrayList:内部是数组数据结构,是不同步的,它基本上替代了Vector.如果是多线程,也可以不用Vector,而是给ArrayList加锁实现同步.相对于其他类,他的查询速度快.
(3)LinkedList:内部是链表数据结构,是不同步的,相对于其他类,他的增删速度很快.
(二)、Set接口
set接口实现Set接口容器中元素是没有顺序的且不可以重复。set没有提供新的方法,set接口中方法与Collection接口一致.
常用的实现Set接口类:
(1)HashSet:内部数据结构式哈希表,是不同步的,(取出只有用迭代器);
(2)TreeSet:可以对Set集合中的元素进行排序.是一种二叉树结构.是根据接口Comparable、Comparator(比较器)实现自然排序。不是同步的。
(三)、Map集合
Map:一次添加一对元素,也称双列集合。Collection:一次添加一个元素,也称单列集合。
Map中存储“键-值”对,由键来标识,所以不能重复。
常用的实现Map接口类:
(1)HashMap:内部结构式哈希表,不是同步的,允许null作为键和值.
(2)HashTable:内部结构式哈希表,是同步的,不允许null作为键和值.
(3)TreeMap:内部是二叉树,不是同步的,可以对Mao集合中的键进行排序.
二、集合迭代器Iterator接口
//迭代器的使用
Conllection coll = new ArrayList();
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
//使用了Conllection中Iterator()方法.调用集合中的迭代方法.是为了获取集合中的迭代器对象
Iterator it = coll.iterator();
while(it.hasNext()){
system.out.println(it.next());
}
//上面有一个缺点,迭代完之后,迭代器的引用it还能继续使用,改写成:
for(Iterator it=coll.iterator();it.hasNext();){
system.out.println(it.next());
}
迭代器原理:Iterotar该对象必须依赖于具体容器,因为每个容器的数据结构不同,所以迭代器对象是在容器中进行内部实现的.
对于容器而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可,也就是iterator方法.Iterotor接口就是对所有的Collection容器进行元素取出的公共接口。
Enumeration接口
Enumeration接口的功能与Iterator接口类似,也能对集合中的元素进行遍历,但是它只能对Vector,Hashtable类提供遍历方法。并且不支持移除操作,这个用的相对较少。
三、工具类
(一)Collectons类
Conllection集合框架的工具类,他的方法都是静态的。实现了基于list容器的常用算法;
例举部分常用功能:
1.void sort(List list) 对容器内的元素进行升序排序
2.void
reverse(List list) 对容器内的元素进行逆序排序
3.void
shuffle(List list) 对容器内的元素进行随机排序
4.void
fill(List list,Object obj) 对特定的对象来填充list
5.void
copy(List des,List src) 将scr容器的内容拷贝到des容器中
6.void
rotate(List list,int distance) 对列表中元素按distance进行移位操作
7.int
binarySearch(List list,Object obj) 采用折半查找在list中obj对象的位置,返回这个对象在容器中的位置(注意:调用此方法前,必须对列表升序排序,否则结果不确定).
(二)Arrays类
Arrays类他的方法也都是静态的,实现了对数组元素进行排序,查找,转换为字符串形式和列表等功能.
(重用方法)
List asList(Object a[]) 将数组转成list集合
数组能用的方法是有限的,好处:可以使用集合的方法操作数组。但是,数组长度是固定的,所以即使转成集合了,对于集合的增删方法不可用,不能使用改变它长度的方法。否则出现异常:UnsuppertedOperationException();
(1) 如果数组中的元素是对象,那么转成集合时,直接将数组中的元素作为集合中的元素进行集合存储;
(2) 如果数组中的元素是基本数据类型数值,那么会将数组作为集合中的元素进行存储.
如:int [] arr = {33,1,5,56,41,4};
可写成:List<int []> list =
Arrays.asList(arr); 或者 Integer [] arr =
{33,1,5,56,41,4};
Conllection---toArray方法:将集合转换成数组。这个方法可以对集合进行限定,不允许增删操作。(集合本身支持,但变成数组后就不支持了),作用:限定操作
四、集合框架JDK5.0特性
(一)Foreach循环
Foreach是增强了for语句后出现的。对于遍历Array和Collection的时候相对便利。
foreach语句
格式:for(类型 变量:Collection集合或数组)
//list集合
List<String> list = new Arraylist<String>();
list.add("aa");
list.add("bb");
for(String a:list){
//打印a
}
//数组
int[] arr = {86,13,3,5,8,6};
for(int i:arr){
//打印 i
}
传统for和增强for的区别:传统for可以完成对语句的控制,因为可限定条件,控制增量.增强for是一种简化形式,它只用于遍历,它必须有遍历目标,一般为Collection单列集合或数组
但是它一样能遍历map集合,可以将map集合转成单列的set,就可以了.
(二)函数可变参数
public static int newAdd(int...arr){};
其实就是一个数组,但是不用创建数组,在内部自动将元素封装成了数组,简化了调用者的书写.注意:可变参数必须定义在参数列表结尾处.如:(int a,int...arr);
(三)静态导入
import static java.util.Collection.sort;
Collection.sort(list);//原来是这样写.
sort(list); //导入后就可以这样写.我个人认为这样可读性有点差.
静态导入,其实导入的是类中的静态成员.