上一篇已经比较详细的了解了java封装好了的算法,现在对算法做一个概况。
1>排序与混排
Collections类中的sort方法可以对实现了List接口的集合进行排序。
a>如果想按照降序对列表进行排序,可以使用一种非常方便的静态方法Collections.reverseOrder()。这个方法将返回一个比较器,比较器返回b.compareTo(a)。
例如:Collections.sort(staff,Collections.reverseOrder());
或者
Collections.sort(staff,Collections.reverseOrder(itemCompartor));
public static <T> Comparator<T> reverseOrder() { private static class ReverseComparator implements Comparator<Comparable<Object>>, Serializable { private static final long serialVersionUID = 7207038068494060240L; = new ReverseComparator(); public int compare(Comparable<Object> c1, Comparable<Object> c2) { private Object readResolve() { return reverseOrder(); } } return (Comparator<T>) ReverseComparator.REVERSE_ORDER; } /** * @serial include */ static final ReverseComparator REVERSE_ORDER return c2.compareTo(c1); }
Collections类有一个算法shuffle,其功能与排序正好相反,即随机地混排列表中元素的顺序。
a>如果列表没有实现RandomAccess接口,shuffle方法将元素复制到数组中,然后打乱数组元素的顺序,最后在将打乱顺序后的元素复制会列表。
2>二分查找
Collections类的binarySearch方法实现了这个算法。注意,集合必须是排好序的,否则将返回错误的答案。3>简单算法 具体细节查看api文档
注:只有采用随机访问,二分查找才有意义。如果必须利用迭代方式一次次地遍历链表的一半元素来找到中间位置的元素,二分查找就完全失去了优势。因此,如果为binarySearch算法提供一个链表,它将自动地变为线性查找。
4>编写自己的算法
a>在编写自己的算法时(实际上,是以集合为参数的任何方法),应该尽可能使用接口,而不是使用具体的实现。
例如:void fillMenu(ArrayList<String> items); 应该写成 void fillMenu(Collection<String> items);
注:那么为什么在Java类库不更多地使用呢,因为Java类库中许多的类库在集合类库之前创建的。
b>通过使用集合视图来优化算法
List<JMenuItem> getAllItems(JMenu menu) { List<JMenuItem> items = new ArrayList<>(); for (int i = 0; i < menu.getItemCount(); i++) items.add(menu.getItem(i)); return items; }List<JMenuItem> getAllItems(final JMenu menu) { return new AbstractList<JMenuItem>() { @Override public JMenuItem get(int i) { return menu.getItem(i); } @Override public int size() { return menu.getItemCount(); } }; }
五、遗留的集合
1>Hashtable类
Hashtable类与HashMap类的作用一样,实际上,它们拥有相同的接口。与Vector类的方法一样。Hashtable的方法也是同步的。如果对于同步性或遗留代码的兼容性没有任何要求,就应该使用HashMap。
2>枚举
遗留集合使用Enumeration接口对元素序列进行遍历,与Iterator接口类似。
3>属性映射表
属性映射表(property map)是一个类型非常特殊的映射表结构。它有下面3个特性:
a>键与值都是字符串。
b>表可以保存到一个文件中,也可以从文件中加载。
c>使用一个默认的辅助表。
实现属性映射表的Java平台类称为Properties。
属性映射表通常用于程序的特殊配置选项。
4>栈
从1.0开始,标准类库中就包含了Stack类,其中包含push方法和pop方法。但是Stack类扩展为Vector类,从理论角度看,Vector类并不太令人满意,它可以让栈使用不属于栈的insert和remove方法。
5>位集
Java平台的BitSet类用于存放一个位序列。如果需要高效地存放位序列就可以使用位集。由于位集将位包装在字节里,所以,使用位集要比使用Boolean对象的ArrayList更加高效。
总结
虽然以上5篇总结的都是转载的,但是我集合这一章我还是学到了很多的东西,有很多以前不知道或者不清楚的有了初步的认识,还会有下一次的学习,下一次学习的时候当我看到我转载的这些知识的时候,可能我会有新的收获。