当我们在使用Java,应该“优选容器而不是数组”。只有在证明性能成为问题,并且切换到数组对性能提高有所帮助时,你才应该使用数组。
排序必须根据对象的实际类型执行比较操作。一种自然的解决方案是为每种不同的类型各编写一个不同的排序方法,但是这样的代码难以被新的类型所复用。
程序设计的基本目标是:“将保持不变的事物与会发生改变的事物相分离”,而这里,不变的是通用的排序算法,变化的是各种对象相互比较的方式。因此,不是将进行比较的代码编写成不同的子程序,而是使用“策略设计模式”。通过使用策略,可以将“会发生变的代码”封装在单独的类中(策略对象),你可以将策略对象传递给总是相同的代码(算法),这些代码将使用策略来完成其算法。通过这种方式,你能够用不同的对象表示不同的比较方式(策略),然后将它们传递给相同的排序代码。
第一种:是实现java.lang.Comparable接口,是你的类具有“天生”的比较能力。 此接口很简单,只有compareTo()一个方法。此方法接受另一个Object为参数,如果当前对象小于参数则返回负值,如果相等返回零,如果当前对象大于参数则返回正值。
public int compareTo(CompType rv) { return (i < rv.i ? -1 : (1 == rv.i ? 0 : 1)); }第二种:可以创建一个实现了Comparator接口的单独类。这是策略设计模式的一个应用实例。这个类有compare()和equals()两个方。然而不一定要实现equals方法,除非有特殊的性能需要,因为无论合适创建一个类,都是间接继承自Object,而Object带有equals方法。所以只用需要默认的equals方法就可以满足接口的需求了。接口 Comparator<T>
int
compare(T o1, T o2)
比较用来排序的两个参数。boolean
equals(Object obj)
指示某个其他对象是否“等于”此 Comparator。
使用内置的排序方法,就可以对任意的基本类型数组排序。也可以对任意的对象数组进行排序,只要改对象实现了Comparable接口或者具有相关的Comparator。
类 Arrays
<T> void
sort(T[] a, Comparator<? super T> c)
根据指定比较器产生的顺序对指定对象数组进行排序。static
<T> void
sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c)
根据指定比较器产生的顺序对指定对象数组的指定范围进行排序。注意。String排序算法根据词典编排顺序排序,所以大写字母开头的词都放在前面输出,然后才是小写字母开头。如果想忽略大小写字母单词都放在一起排序,那么可以使用--
Arrays.sort(数组,String.CASE_INSENSITIVE_ORDER);
注意:Java标准类库的排序算法针对正排序的特殊类型进行了优化--针对基本类型设计“快速排序(QuickSort)”,以及针对对象设计的“稳定归并排序”。所以我们完全无需担心排序的性能,除非你可以证明排序部分的确是程序效率的瓶颈。
如果数组已经排序好了,就可以使用Arrays.binarySearch()执行快速查找。如果对未排序的数组使用binarySearch(),那么将产生不可预料的结果。
当然,如果数组包含重复的元素,则无法保证找到的是这些副本中的哪一个。Java的搜索算法确实不是专为包含重复元素的数组而设计的。
现在的Java版本对容器的支持得到了明显的改进,并且现在的容器除了性能之外的各个方面使得数组相形见绌。
有了额外的自动包装机制和泛型,在容器中持有基本类型就变得易如反掌了,而这也进一步促使你用容器替换数组。因为泛型可以产生类型安全的容器,因此数组面对这一变化,已经变得毫无优势了。
这些话题都表示:当你编程时,应该“优选容器而不是数组”。
原文地址:http://blog.csdn.net/biezhihua/article/details/37994267