浅谈java集合类型的相关操作

来源:互联网 发布:移动4g是什么网络 编辑:程序博客网 时间:2024/06/02 08:15

数据结构是大学计算机专业的一门很难的课程,相信很多计算机专业的学生都被诸如队列、链表、二叉树、霍夫曼算法等折磨过。但在java世界中对数据结构提供了现成的处理类,如Set、List、Map等,java程序员不必再纠缠数据结构的细节和复杂算法。以下就java集合类型的相关操作进行一些介绍和探讨。


一.集合内元素的顺序

在集合对象中List是有顺序的,但Map和Set没有顺序。如果我们在开发过程中,确实需要这两类集合进行排序,java也提供类相应的实现类。排序分为两种,一种是按照元素被添加的顺序进行排序,这类集合有LinkedHashSet和LinkedHashMap,这种很好理解;还有一种是通过开发排序算法实现排序,这一类有TreeSet和TreeMap。排序算法也有两种实现方式,一种是被插入集合的元素对象实现Comparable接口的compareTo方法,规则是如果a和b相等,则a.compareTo(b)返回0;如果a的顺序位于b前面,则返回负数,如果a位于b后,则返回正数.。另一种将一个Comparator对象传递给TreeSet类的构造器。Comparator接口声明了一个Compare方法,其逻辑与Comparable接口的compareTo方法一致。下面是一个例子,根据字符串降序排列:

class MyComparator implements Comparator{@Overridepublic int compare(Object o1, Object o2) {String s1 = (String)o1;String s2 = (String)o2;return s2.compareTo(s1);}}
二.优先级队列

优先级队列(Priority Queue)是一种能够在以任何顺序插入元素后,再按排序顺序读取这些元素的数据结构。实际上它并没有真的对内部所有元素进行排序,而只是当你调用add和remove方法是将最小元素移动到根,这样下次再调用remove方法时,返回当前队列中的最小元素。如果不想删除,只想查看当前根元素可以使用peek()方法。使用优先级队列的典型例子是任务调度。每个任务都有优先级,每当启动一个新任务时,总是优先级最高的任务被移出来执行。它的比较方式也是通过Comparable接口的compareTo方法。


三.数组转换为集合

Arrays类有一个静态的asList方法,可以将数组包装为List对象。

String[] s=new String[10];

List<String> list=Arrays.asList(s);

asList方法还有一个可变参数的重载,除可以传递数组外,还可以将各元素直接传给它。

List<String> names=Arrays.asList("张三","李四","王五"); 


四.子范围

如果你想List中取出第10到19个元素,可以通过subList方法,如:List list2=list1.subList(10,20); 20不包含在范围内,这与String的substring方法的情况一样。对于Set和Map类型根据其排序方式,可以使用subSet(from,to)、headSet(to)、tailSet(from)、subMap(from,to)、headMap(to)、tailMap(from)。


五.不可修改视图

如果你想使集合不可被修改,可以使用Collections的6种方法来获取该集合类的不可修改视图:unmodifiableCollection、unmodifiableList、unmodifiableSet、unmodifiableSortedSet、unmodifiableMap、unmodifiableSortedMap。


六.排序和查找

Collections类中的sort方法可对List进行排序,排序规则依然是通过Comparable接口的compareTo方法。Collections类还有一个算法是混排shuffle,它的作用正好与排序相反,它可以随机混排列表中各元素的顺序。

Collections类中的binarySearch方法实现了二分法查找,如果要查找某个元素,可以调用它。它的一个重载方法可以接受一个Comparator参数。


0 0