java中的集合可以理解为一个容器,主要包括映射(map)、集合(set)、列表(list)、数组(array)和散列表(Hashtable)等抽象数据结构。集合框架内部主要是一些精心设计的接口、类和相关算法组成。其基本上全部放在java.util包中。
一、数组类:
在数组类中,其所有的方法基本上都是静态的,也意味着这些方法可以直接通过数组名
进行调用。数组类可以看作是对数组相关操作的一个有力补充。常见的方法有二分搜索、判断两数组是否相等、填充数组、对数组排序以及将数组以字符串形式输出等等。
在此,对于数组类中的一些方法的使用问题,总结几个常见的解决技巧:
▲排序问题
在数组类中所提供的排序方法只有sort方法,它是按照自然顺序进行排列的,那怎样实
现倒序呢?解决方法如下:
当然第一种方法就是通过重新编写代码(倒序)来实现,这样比较麻烦。另外一种方法我们可以运用下集合类Collections中所提供的一些好的方法reverse()来实现倒序。现在的关键是如何将数组元素转载到集合类中,可以想到的方法就是将数组中的元素一个一个装载到ArrayList中,然后调用反转方法就OK了!!代码如下:
▲数组与字符串联动
Arrays类提供了一个桥梁toString方法,为数组与字符串之间的互动提供了作用。这样
的话通过转换成字符串后,就可以利用字符串中的一些好的方法了。不过需要注意的是toString在很多地方都会出现,最原始出现的地方实在Object类中,在这个地方该方法返回的是对象的字符串表示,所以,在更多的情况下,一般是把这个方法重写了。
二、基本的集合接口
在这一节,将介绍常见的集合接口:Collection接口和Map接口。此外还有Collections
类,其主要是为集合对象提供一些静态方法。其层次关系如下:
(一)Set(集合)接口
集合是一个不包含重复元素的对象集合,其实际上是对数学中的集合概念的一种抽象,在Set接口所定义的方法中,有几个特别适用的方法:如addAll、iterator、retainAll、toArray.
addAll(Collection e)--------将Collection e中的所有数据加入
iterator()---------可以按序输出集合对象中的元素
retainAll(Collection e)---------仅保留那些包含在Collection中的元素
toArray()------------返回一个包含Set中所有元素的数组
【延伸】一个很经典的编程应用(利用Set特点):(程序需要接收命令行参数。)
1、HashSet和TreeSet
两者都实现了Set接口,两者的最大区别则是:HashSet创建的是一个无序的集合对象,
而TreeSet类则是有序的集合对象。因此,当需要从集合中有序地获取元素时,可考虑采用TreeSet来建立对象,可以利用这一点,将HashSet对象中的元素按序输出。
(二)List(列表)接口
在此,我先将几种接口做个简单的比较:
Collection接口-------是一组允许重复的对象
Map接口-----------所包含的是一个键-值对
Set接口-----------继承Collection,但不允许接口中出现重复的元素
List接口---------继承Collection接口,允许集合中出现有重复,并引入位置索引
列表是指一个有序的对象集合,通过列表接口,可以利用整数索引对列表中的每个元素进行准确的控制,包括对特定位置的元素进行查询等。同样List接口中也有些比较实用的方法,如addAll、get、indexOf、iterator和listIterator、subList、toArray等。
get(int index)-----------返回列表中指定的元素
indexOf(Object o)-----返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回-1。
lastIndexOf(Object o)----返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回-1。
listIterator()-------返回此列表元素的列表迭代器(按适当顺序)。
listIterator(int index)-------- 返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。
在此我着重讲解下列表特有的迭代器listIterator:
listIterator接口继承了Iterator接口,在Iterator接口中,只有三个方法可以用,即hasNext、next和remove。可以实现按序输出集合对象中的元素。而listIterator接口在原有接口基础上增加了一些实用的方法,说得更加直接一点,那就是后者在前者的基础上允许一边遍历集合,还可以同时进行一些修改操作,如删除、替换等。另外它还允许逆向遍历集合对象。
■ ArrayList和LinkedList
ArrayList和LinkedList两种都实现了list接口,前者时通过数组方式实现的,而后者则是通过链表结构来实现的,因此,双方各自所提供的方法也都有差异,若相对列表结构的开始和结束处有频繁的添加或删除操作时,可以考虑使用链表结构来实现。
(二)映射(Map)
映射接口描述了不重复的键到值的映射,并且一个映射对象中不能包含重复的键,且
每个键只能映射到一个值。这点其实是数学中的“一一映射”关系的一个抽象。我们先来看看映射接口常见的一些方法。
containsKey(Object key)------- 如果此映射包含指定键的映射关系,则返回 true。
containsValue(Object value)----- 如果此映射将一个或多个键映射到指定值,则返回 true。
keySet()-------返回此映射中包含的键的 Set 视图。
values()------返回此映射中包含的值的 Collection 视图。
■HashMap和TreeMap类
HashMap是基于哈希表实现的,而TreeMap是基于红黑树来实现的。红黑树总是处于平衡状态,而为了优化HashMap空间的使用,可以调试初始的容量和负载因子,HashMap的默认初始容量为16,默认加载因子为0.75。至于两者个字的优点,在往Map中插入、删除和定位元素,HashMap是最好选择;若需要按顺序遍历键值,则选择TreeMap比较好些。