面向对象语言对事物都是以对象的形式而体现,因此,为了方便多个对象的操作,Java为我们提供了集合类.相对于数组而言,集合的长度是可变的,它存储的都是对象,并且可以存储不同类型的对象;数组的长度是固定的,储存的都是基本数据类型.下面分享一张集合框架图,整体了解一下集合框架.
Collection是顶层结构中的根接口。Collection 表示一组对象,这些对象也称为 Collection 的元素。一些 Collection 允许有重复的元素,而另一些则不允许。一些 Collection 是有序的,而另一些则是无序的。下面都两个接口List和Set.
List是有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。与 set 不同,列表通常允许重复的元素。List有三个实现类.ArrayList,特点:底层数据结构是数组,查询快,增删慢,线程不安全,效率高;LinkedList,特点:底层数据结构是链表,查询慢,增删快,线程不安全,效率高;Vector,特点:底层数据结构是数组,查询快,增删慢,线程安全,效率低.一般不用Vector.
Set集合的元素是无序的(存入和取出的顺序不一定一致),且元素不可以重复,要将自定义类型的对象放入Set集合中要重写hashCode和equals方法。因为它保证集合元素唯一性的依据是通过计算元素的hashCode和equals方法的返回值。存入TreeSet集合的元素,会自动排序,这要求元素要具有比较性(实现Comparable接口)或者集合本身有比较性(向构造方法中传入一个继承了比较器)。
泛型(generic) 从JDK1.5开始加入的新概念,是一种安全机制,用来保证程序的安全性.泛型的出现,可以强制集合存储指定的数据类型.在集合指定存储数据类型后,如果存储了其他数据类型,会导致编译失败.泛型的格式为: 集合类<数据类型> 变量 = new 集合类<数据类型>();
迭代器(Iterator) 它是Collection接口中的一个方法.Iterator iterator() 返回的是接口实现类.Collection下面的子接口实现类都具备这个方法.返回值是一个接口类型.接口名字为Iterator(迭代器).Iterator接口中有两个方法:boolean hasNext() 判断集合中有没有下一个被取出的元素,有则返trueObject next() 获取集合下一个元素而List接口中定义了一个抽象方法,即listIterator() 返回的是一个接口的实现类对象.接口是ListIterator,它是List集合的特有迭代器.它可以进行列表的逆向遍历.方法有:boolean hasPrevious() previous().
Foreach(增强for循环) 也是JDK1.5出现的一种新的循环方式.在JDK1.5中多了一个接口java.lang.Iterable,它是Collection接口的父接口.它的出现,主要是为增强for循环而出现的.因此,我们学习的集合框架中的集合,都可以使用增强for循环,而且包含数组.Foreach的出现,利于程序员使用循环,并且减少代码量. 增强for遍历数组时不会出现越界问题,但是它不能操作数组中的元素,只是方便做遍历.在遍历集合时,集合必须有泛型.格式: for(数据类型 变量名 : 数组或者集合){}
Iterator和增强for的异同点: 两者都能对集合进行遍历,Foreach只能获取集合中的元素,但是不能操作集合中的元 素.因此对数组的遍历建议采用传统for循环.而迭代器触雷遍历集合,还能对集合中的元素进行移除操作.ListIterator更可以在遍历 集合的过程中对集合进行一些列增删改查操作.
Map 集合独立于Collection.Map接口不继承Collection接口.Map一次存储一个键值对,即两个对象.键需要保证唯一性,值可以重复.在集合中,每个键只能对应一个值.Map带有泛型: Map <K,V> K作为键的对象的泛型Key:V作为值的对象的泛型Value.Map集合的获取方式主要依赖Set集合,实现步骤为:1. 调用Map集合的方法Set <K> keySet()作用:将Map中的所 有的键,存储到Set集合2. 迭代Set集合,获取到的是Set中的元素,这些元素是Map中 的键
3. 调用Map集合中的get方法,通过键获取值注意:增强for循环不能遍历Map集合,但是可间接实现遍历,使用keySet和entrySet方法可以实现.
Map集合下有三个子类,Hashtable:底层是哈希表,不可以存储null键和null值.线程是安全的,运行效率低.HashMap:底层是哈希表,可以存储null键和null值,线程不安全,运行效率高.TreeMap:底层是二叉树结构,可以用于Map集合中的键排序,线程不安全,运行效率高.在集合框架中,Map集合与Set集合很相像.Set底层使用了Map集合.
在集合框架中,还有两个工具类,Collections和Arrays工具类.Collections中的方法:
fill(list,newElement)方法可以将list集合中所有元素替换成指定元素
replaceAll(list,oldElement,newElement)对集合中指定元素替换
sort(collection) 对集合排序
reverseOrder()返回一个反转的比较器,return s2.compareTo(s1);
reverseOrder(Comparator comp)返回一个指定比较器反转后的比较器
swap(List l,int i,int j)置换list中指定两个位置的元素
public static void shuffle();将集合中的元素随机排序
Arrays是用于操作数组的工具类,里面的方法都是静态的.
集合可变数组,方法为:toArray(),主要是为了限定对元素的操作,不需要进行增删改查.
数组变集合,方法为:asList(),返回的是一个固定大小的一个集合.可以使用集合的思想和方法来操作数组中的元素.这里要注意的是:数组转成集合后,因为数组定长,不能使用集合中增删改查的方法.如果数组中的元素是对象,那么变成集合时,数组中的元素直接转成集合中的元素,如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。