Java基础18--泛型--工具类--JDK1.5新特性(三)

2014-11-24 03:26:40 · 作者: · 浏览: 3
的数据结构。

看到array:就要想到数组,查询快,有角标。

看到Link:就要想到链表,增删快,想到add、get、remove方法。

看到hash:就要想到哈希表,唯一性,就要想到元素需要覆盖hashCode和equals方法。

看到tree:就要想到二叉树,想到需要排序,两个接口,Comparable,Comparator。

而且通常这些常用的集合容器都是不同步的。

18-10,工具类-Collections排序

1,java.util.Collections

此类完全由在Collection上进行操作或返回Collection的静态方法组成。

2,Collections是集合框架的工作类,里面的方法都是静态的。

static > voidsort(List list)

根据元素的自然排序,对指定列表进行升序排序,列表中的所有元素都必须实现Comparable接口,列表中的所有元素都必须是相互可以比较的,即类型必须相互匹配才行。

演示排序方法示例:

public static void demo_1() {
	List
  
    list = new ArrayList
   
    (); list.add("abcde"); list.add("cba"); list.add("aa"); list.add("zzz"); list.add("cba"); list.add("nbaa"); System.out.println(list); //排序 Collections.sort(list);//String实现了Comparable接口,具备可比性 System.out.println(list); } 
   
  

若要按照长度排序,可以通过sort(List list,Comparator c)带比较器的sort方法实现,这需要定义一个类,并实现Comparator接口,并实现里面的compare方法。例如:

public class ComparatorByLength implements Comarator
  
    {
	public int compare(String o1,String o2) {
		int temp = o1.length() - o2.length();
		return temp == 0   o1.compareTo(o2) : temp;
	}
}

  

然后调用方法Collections.sort(list,newComparatorByLength());即可。

18-11,折半&最值

1,static int binarySearch(List > list, T key)

这个方法是使用二进制搜索法来搜索指定列表,以获得指定对象,在进行此调用之前,必须根据列表元素的自然顺序对列表进行升序排序,其实就是二分查找法。

2,static int binarySearch(List list,T key,Comparator c)

与上面的方法的不同之处在于,用指定的比较器对集合中的元素进行升序排序。

3,折半:

public class Demo {
	public static void main(String[] args) {
		List
  
    list = new ArrayList
   
    (); list.add("abcde"); list.add("cba"); list.add("aa"); list.add("zzz"); list.add("cba"); list.add("nbaa"); //排序 Collections.sort(list); int index = Collections.binarySearch(list,"cba");//index是2 } } 
   
  

4,最大值

static T max(Collection coll)

根据元素的自然顺序,返回给定collection的最大元素,collection中的元素必须具备比较功能,该方法是依据Comparable比较的。

static T max(Collection coll,Comparator comp)

根据指定的比较器产生的顺序,返回给定collection的最大值。

例如:

String max = Collections.max(list,newComparatorByLength())

返回最长的字符串。

18-12,逆序&替换

1,static Comparator reverseOrder()

返回一个比较器,它强行反转实现Comparable接口那些对象collection上的自然顺序,他是根据Comparable比较的。

TreeSet ts = new TreeSet (Collections.reverseOrder(newComparatorByLength()))

这个方法强行反转比较器指定排序后的反转。

2,替换

public class Demo {
	public static void main(String[] args) {
		List
  
    list = new ArrayList
   
    (); list.add("abcde"); list.add("cba"); list.add("aa"); //将list集合中的"cba"替换成"nba" //原理:list.set(indexOf("cba"),"nba") Collections.replaceAll(list,"cba","nba"); } } 
   
  

18-13,其他方法,将非同步集合转成同步集合的方法

1,fill方法,可将集合中的所有的值都重新赋值(重新初始化)

public class Demo {
	public static void main(String[] args) {
		List
  
    list = new ArrayList
   
    (); list.add("abcde"); list.add("cba"); list.add("aa"); Collections.fill(list, "cc"); System.out.println(list);//[cc,cc,cc] 将所有元素初始化为cc } } 
   
  

2,Collections.shuffle(list);//将集合中的元素随机重新排列

3,static ArrayList list(Enumeration e)

返回一个数组列表,它按返回顺序包含指定枚举返回的元素,将枚举转换成ArrayList。

4,static Enumeration enumeration(Collection c)

将指定集合转成枚举。

5,static Enumeration synchronizedList(List list)

返回指定列表支持的(线程安全的)列表。

除此之外可以将Collection、Map、Set,等转成线程安全的。

实现原理:

List list = new ArrayList();//是非同步的

list = MyCollections.synList(list);//返回一个同步的list

给非同步的集合加锁:

//保证在添加时不能删除,删除时不能添加
class MyCollections {
	public static List synList(List list) {