Java的集合

来源:互联网 发布:刷砖软件 编辑:程序博客网 时间:2024/05/02 22:18

Java的集合类就像一个容器,用来存放Java类的对象。java.util提供的常见的集合类有List、Set和Map,其中List和Set实现了Collection接口。

List接口、Set接口、Map接口和Collection接口的关系如下:

(1)Collection接口是List接口和Set接口的父接口

(2)List接口允许存放重复的对象,按照对象的插入顺序排列,有ArrayList类和LinkedList类来实现。

(3)Set接口不允许存放重复的对象,按照自身内部的规则排列,有HashSet类和TreeSet类来实现,而又有LinkedHashSet类继承HashSet。

(4)Map接口以key-value的形式存放对象,其中key对象不可以重复,value可以,按照key自身内部的排序规则排列,有HashMap类和TreeMap类来实现。



一、Collection接口定义的方法

add(Objetc obj)    将指定的对象添加到该集合中

addAll(Collection<?> col)    将制定集合中的所有对象添加到该对象中

remove(Object obj)    将指定的对象从该集合中移除。返回值为boolean类型,存在指定对象返回true,否则返回false。

removeAll(Collection<?> col)    从该集合中移除同时包含在指定集合中的对象,相当于集合的减法,与retainAll()方法正好相反,返回值是boolean类型,存在符合移除条件的对象返回true,否则返回false。

retain(Collection<?> col)    仅保留该集合中同时包含在指定集合中的对象,相当于集合的交集,返回值是boolean类型,存在符合移除条件的对象返回true,否则返回false。

contains(Object obj)    用来查看在该集合中是否存在指定的对象。返回值是boolean类型,存在返回true后则返回false。

containsAll(Collection<?> col)    用来查看该集合中是否存在指定集合中的所有对象。返回值是boolean类型,如果存在返回true,否则返回false。

isEmpty()    用来查看集合是否为空。返回值为boolean类型,如果在集合中未存放任何对象返回true,否则返回false。

size()    用来获得该集合中存放的对象的个数。返回值是int类型,为集合中存放对象的个数。

clear()    移除该集合中的所有对象,清空该集合。

iterator()    用来序列化该集合的所有对象。返回值为Iterator<?>类型,通过返回的Iterator<?>类型实例可以遍历集合中的对象。

toArray()    用来获得一个包含所有对象的Object类型数组。

toArray(T[] t)    用来获得一个包含所有对象的指定类型的数组。

equals(Object obj)    用来查看指定的对象与该对象是否为同一个对象。返回值是boolean类型,如果是同一个对象返回true,否则返回false。

以上是Collection接口定义的常用方法和功能,实现Collection接口的类都有以上函数。



二、List集合

List集合为列表类型,主要特征是以线性方式存储对象。

List除了实现Collection接口的常用方法外,还因为自身特征,提供一些额外的方法。

add(int index, Object obj)    用来向集合的指定索引位置添加对象,其他对象的索引位置相对后移一位。索引位置从0开始

addAll(int index, Collection col)    用来向集合的指定索引位置添加指定集合中的所有对象。

remove(int index)    用来清除集合中指定索引位置的对象。

set(int index, Object obj)    用来将集合中指定索引位置的对象修改为指定的对象。

get(int index)    用来获得指定索引位置的对象。

indexOf(Object obj)    用来获得指定对象的索引位置,当存在多个时,返回第一个的索引位置,当不存在时返回-1。

lastIndexOf(Object obj)    用来获得指定对象的索引位置,当存在多个时,返回最后一个的索引位置,当不存在时返回-1。

listIterator()    用力爱获得一个包含所有对象的ListIterator类型实例。

listIterator(int index)    用来获得一个包含从索引位置到最后的ListIterator类型实例。

subList(int fromIndex, int toindex)    通过截取从起始索引位置fromIndex(包含)到终止索引位置toIndex(bubaohan1)的对象,重新生成一个List集合并返回。


PS:其中LinkedList类还提供几个专有的操作集合的方法,如下:

addFirst(Object obj)    将指定对象插入列表的开头。

addLast(Object obj)    将指定对象插入列表的结尾。

getFirts()    获得列表开头的对象。

getLast()    获得列表结尾的对象。

removeFirst()    移除列表开头的对象。

removeLast()    移除列表结尾的对象。


List小结:

(1)List集处理与位置相关的操作时效率较高。

(2)在查询或修改等不需要改变集合内容操作多时,选用ArrayList效率高。

(3)在增加删除等改变集合内容操作多时,选用LinkedList效率高。或者对头尾操作频繁时,也可选用LinkedList。



三、Set集合

Set集合为集类型,集市最简单的一种集合,存放于集中的对象不按特定方式排序,只是简单地把对象假如集合中。对集中存放的对象的访问和操作是通过对象的引用进行的,所以在集中不能存放重复对象。Set接口实现了Collection接口,所以Set接口拥有Collection接口提供的所有常用方法。如果想既保留HashSet类快速定位集合中对象的优点又让集合中的对象按插入的顺序保存,可以通过LinkedHashSet类来实现Set集合。


(1)HashSet类实现

用HashSet类实现的Set集合的优点是能够快速定位集合中的元素,且由于Set对象是无序的,遍历集合输出对象的顺序与向集合插入对象的顺序并不相同,

由于HashSet类实现的Set集合中的对象必须是唯一的,所以需要添加由HashSet类实现的Set集合中的对象,需要重新实现equals()方法,从而保证插入集合中对象的标识的唯一性。

由HashSet类实现的Set集合按照哈希码排序,根据对象的哈希码确定对象的存储位置,所以需要添加到由HahsSet类实现的Set集合中的对象,还需要重新实现hashCode()方法,从而保证插入集合中的对象能够合理地分布在集合中,以便于快速定位集合中的对象。

根据实际情况设计一个好的hashCode()和equals()方法能大大提高效率,否则hashCode()后得到的哈希码不够均匀或者equals()与实际情况发生冲突,会影响查询效率。如在Employee类中,同id不同人名的情况不允许发生,equals函数应检查存储对象的主码是否一致来判断对象是否一致。


(2)TreeSet类实现

TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,从而保证在便利集合时按照递增的顺序获得对象。

存入由TreeSet类实现的Set集合的对象时必须实现Comparable接口,其排列顺序有两种:

1、对象本身某些属性具有可比性,通过实现Comparable接口,并覆盖其compareTo()方法来实现。

2、对象本身的属性不具有可比性,如String类,或者具有可比性的属性不是想要的,那么可以通过实现Comparator接口并覆compare()方法来做到,其中Comparator接口可作为对象的内部类,也可以作为外部类并在构建TreeSet时实例化实现Comparator接口的类且作为参数传入TreeSet的构造函数。

TreeSet类实现的java.util.SortedSet接口增加的方法如下:

comparator()    获得对该集合采用的比较器。返回值为Comparator类型,如果未采用任何比较器则返回null。

first()    返回在集合中排序位于第一的对象

last()    返回在集合中排序位于最后的对象。

headSet(E toElement)    截取在集合中的排序位于对象toElement(不包含)之前的所有对象,重新生成一个Set集合并返回。

subSet(E fromElement, E toElement)    截取在集合中的排列位于对象fromElement(包含)和对象toElement(不包含)之间的所有对象,重新生成一个Set集合并返回。

tailSet(E fromElement)    截取在集合中的排序位于对象toElement(包含)之后的所有对象,重新生成一个Set集合并返回。


Set小结:

(1)HashSet适合寻找单个的对象,而TreeSet则在需要寻找一个范围的对象时较快。

(2)两个实现Set的类都需要存储对象额外地实现一些方法,如HashSet需要实现hashCode和equals两个,而TreeSet则需要实现Comparable接口(如果需要自定义比较器,Comparator也要实现)。



三、Map集合

Map集合为映射类型,映射与集和列表不同,映射中存储的对象都是成对(key-value)存在的,在检索对象时必须通过相应的键对象来获取值对象,要求键必须是唯一的,同时键对象还决定了存储对象在映射中的存储位置,是通过对键值的散列技术实现的。

Map接口定义的常用方法及功能:

put(K key, V value)    向集合中添加指定的键——值映射关系

putAll(Map<? extends K, ?extends V> t)    将指定集合中的所有键——值映射关系添加到该集合中。

containsKey(Object key)    如果存在指定键的映射关系,返回true,否则返回false。

containsValue(Objetc value)    如果存在指定值得映射关系,返回true,否则返回false。

get(Object key)    如果存在指定的键对象,返回与该键对象对应的值对象,否则返回null。

keySet()    将该集合中的所有键对象以Set集合的形式返回。

values()    将该集合中的所有值对象以Collection集合的形式返回。

remove(Object key)    如果存在指定的键对象,则移除该键对象的映射关系,并返回与该键对象对应的值对象,否则返回null。

clear()    移除集合中所有的映射关系。

isEmpty()    查看集合中是否包含键——值映射关系,包含返回true,否则返回false。

size()    查看集合中包含键——值映射关系的个数,返回值为int类型。

equals(Object obj)    用来查看指定的对象与该对象是否为同一个对象。返回值是boolean类型,如果为同一个对象返回true,否则返回false。


(1)HashMap实现

HashMap类实现的Map接口,允许以null作为键和值,但是键值不可重复,所以这样的键对象只有一个。

如果经常需要添加、删除和定位映射关系,用HashMap类实现Map集合效率较高。在遍历时,得到的映射关系是无序的。

在键对象的类中需要重现hashCode()方法,目的是能根据不同的实际情况得到较为分散的哈希码值。同时在键对象中还必须重写Object类中的equals()方法,否则默认的equals()方法比较两个对象的内容而不是对象的内容。


(2)TreeMap实现

TreeMap类不仅实现了Map接口,还实现了Map接口的子接口java.util.SortedMap。不允许键对象为null,因为集合中的映射关系是根据键对象按照一定顺序排列的。

如果需要进行有序的遍历输出,使用TreeMap类。


TreeMap类通过实现SortedMap接口得到的方法有:

comparator()    获得对该集合采用的比较器。返回值是Comparator类型,如果未采用任何比较器则返回null。

firstKey()    返回在集合中的排序位列第一位的键对象。

lastKey()    返回在集合中的排序位列最后一位的键对象。

headMap(K toKey)    截取在集合中的排序位与键对象toKey(不包含)之前的所有映射关系,重新生成一个SortedMap集合并返回。

subMap(K fromKey, K toKey)    截取在集合中的排序位于键对象fromKey(包含)和toKey(不包含)之间的所有映射关系,重新生成一个SortedMap集合并返回。

tailMap(K fromKey)    截取在集合中的排序位于键对象fromKey(包含)之后的所有映射关系,重新生成一个SortedMap集合并返回。



总结:

虽然看了3种常见集合类的操作或优缺点,但是毕竟没有太多的实例可以更好地理解,像这些基本的Hash或Tree的结构的性质与数据结构中说的也是一样的,所以暂时没啥好说的,等以后用得多有更多的心得体会再说吧。






0 0
原创粉丝点击