Collections在java中的常见用法

1.工具类collections用于操作集合类,如List,Set,常用方法有:

1) 排序(Sort)

使用sort方法可以根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable接口。此列表内的所有元素都必须是使用指定比较器可相互比较的

double array[] = {112, 111, 23, 456, 231 };
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
Collections.sort(list);
for (int i = 0; i < array.length; i++) {
System.out.println(li.get(i));
}
//结果:112,111,23,456,231

2) 混排(Shuffling)

混排算法所做的正好与 sort 相反: 它打乱在一个 List 中可能有的任何排列的踪迹。也就是说,基于随机源的输入重排该List,这样的排列具有相同的可能性(假设随机源是公正的)。这个算法在实现一个碰运气的游戏中是非常有用的。例如,它可被用来混排代表一副牌的Card 对象的一个 List .另外,在生成测试案例时,它也是十分有用的。

Collections.Shuffling(list)
double array[] = {112, 111, 23, 456, 231 };
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
Collections.shuffle(list);
for (int i = 0; i < array.length; i++) {
System.out.println(li.get(i));
}
//结果:112,111,23,456,231
3) 反转(Reverse)

使用Reverse方法可以根据元素的自然顺序 对指定列表按降序进行排序。

Collections.reverse(list)
double array[] = {112, 111, 23, 456, 231 };
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
Collections. reverse (list);
for (int i = 0; i < array.length; i++) {
System.out.println(li.get(i));
}
//结果:231,456,23,111,112

4) 替换所有的元素(Fill)

使用指定元素替换指定列表中的所有元素。

String str[] = {"dd","aa","bb","cc","ee"};
for(int j=0;j
li.add(new String(str[j]));
}
Collections.fill(li,"aaa");
for (int i = 0; i < li.size(); i++) {
System.out.println("list[" + i + "]=" + li.get(i));

}
//结果:aaa,aaa,aaa,aaa,aaa

5) 拷贝(Copy)

用两个参数,一个目标 List 和一个源 List, 将源的元素拷贝到目标,并覆盖它的内容。目标 List至少与源一样长。如果它更长,则在目标 List 中的剩余元素不受影响。

Collections.copy(list,li): 后面一个参数是目标列表 ,前一个是源列表

double array[] = {112, 111, 23, 456, 231 };
List list = new ArrayList();
List li = new ArrayList();
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
double arr[] = {1131,333};
String str[] = {"dd","aa","bb","cc","ee"};
for(int j=0;j
li.add(new Double(arr[j]));
}
Collections.copy(list,li);
for (int i = 0; i
System.out.println("list[" + i + "]=" + list.get(i));
}
//结果:1131,333,23,456,231

6) 返回Collections中最小元素(min)

根据指定比较器产生的顺序,返回给定 collection 的最小元素。collection中的所有元素都必须是通过指定比较器可相互比较的

Collections.min(list)
double array[] = {112, 111, 23, 456, 231 };
List list = new ArrayList();
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
Collections.min(list);
for (int i = 0; i
System.out.println("list[" + i + "]=" + list.get(i));
}
//结果:23
7) 返回Collections中最大元素(max)

根据指定比较器产生的顺序,返回给定 collection 的最大元素。collection中的所有元素都必须是通过指定比较器可相互比较的

Collections.max(list)
double array[] = {112, 111, 23, 456, 231 };
List list = new ArrayList();
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
Collections.max(list);
for (int i = 0; i
System.out.println("list[" + i + "]=" + list.get(i));
}
//结果:456

8) lastIndexOfSubList

返回指定源列表中最后一次出现指定目标列表的起始位置,即按从后到前的顺序返回子List在父List中的索引位置。

int count = Collections.lastIndexOfSubList(list,li);
double array[] = {112, 111, 23, 456, 231 };
List list = new ArrayList();
List li = new ArrayList();
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
double arr[] = {111};
String str[] = {"dd","aa","bb","cc","ee"};
for(int j=0;j
li.add(new Double(arr[j]));
}
Int locations = Collections. lastIndexOfSubList(list,li);
System.out.println(“===”+ locations);
//结果 3

9) IndexOfSubList

返回指定源列表中第一次出现指定目标列表的起始位置

int count = Collections.indexOfSubList(list,li);
double array[] = {112, 111, 23, 456, 231 };
List list = new ArrayList();
List li = new ArrayList();
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
double arr[] = {111};
String str[] = {"dd","aa","bb","cc","ee"};
for(int j=0;j
li.add(new Double(arr[j]));
}
Int locations = Collections.indexOfSubList(list,li);
System.out.println(“===”+ locations);
//结果 1

10) Rotate

根据指定的距离循环移动指定列表中的元素

Collections.rotate(list,-1);

如果是负数,则正向移动,正数则方向移动

double array[] = {112, 111, 23, 456, 231 };
List list = new ArrayList();
for (int i = 0; i < array.length; i++) {
list.add(new Double(array[i]));
}
Collections.rotate(list,-1);
for (int i = 0; i
System.out.println("list[" + i + "]=" + list.get(i));
}
//结果:111,23,456,231,112

11)static int binarySearch(Listlist,Object key)

  使用二分搜索查找key对象的索引值,因为使用的二分查找,所以前提是必须有序。

12)static Object max(Collectioncoll)

  根据元素自然顺序,返回集合中的最大元素

13)static Object max(Collectioncoll,Compare comp)

  根据Comparator指定的顺序,返回给定集合中的最小元素

14)static Object min(Collectioncoll)

  根据元素自然顺序,返回集合中的最大元素

15)static Object min(Collectioncoll,Compare comp)

  根据Comparator指定的顺序,返回给定集合中的最小元素

16)static void fill(Listlist,Object obj)

  使用指定元素替换指定集合中的所有元素

17)static int frequency(Collectionc,Object o)

  返回指定元素在集合中出现在次数

18)static int indexOfSubList(Listsource, List target)

  返回子List对象在父List对象中第一次出现的位置索引; 如果父List中没有出现这样的子List,则返回-1

19)static intlastIndexOfSubList(List source,List target)

  返回子List对象在父List对象中最后一次出现的位置索引,如果父List中没有出现这样的子List,刚返回-1

20)static boolean replaceAll(Listlist,Object oldVal,Object newVal)

 使用一个新值newVal替换List对象所有旧值oldVal

21)synchronizedXXX(newXXX)

     Collections类为集合类们提供的同步控制方法

 

public class SynchronizedTest

{

      publicstatic void main(String[] args){

           Collection collection = Collections.synchronizedCollections(newArrayList());

           List list = Collections.synchronizedList(newArrayList());

           Set s = Collections.synchronizedSet(new HashSet());

           Map s = Collections.synchronizedMap(new HashMap()):

     }

}

22)emptyXXX()

  返回一个空的、不可变的集合对象,此处的集合既可以是List,也可以是Set,还可以是Map。

23)singletonXXX()

  返回一个只包含指定对象(只有一个或一项元素)的、不可变的集合对象,此处集合既可以是List,也可以是Set,还可以是Map。

24)unmodificableXXX()

  指定返回集合对象的不可变视图,此处的集合既可以是Lsit,也可以是Set,Map

 


  1. package com.cxy.collection;    
  2. import java.util.ArrayList;  
  3. import java.util.Arrays;  
  4. import java.util.Collections;  
  5. import java.util.HashMap;  
  6. import java.util.HashSet;  
  7. import java.util.List;  
  8. import java.util.Map;  
  9. import java.util.Set;  
  10. import java.util.TreeSet;  
  11.   
  12. /** 
  13.  * @author cxy 
  14.  */  
  15. public class CollectionsTest  
  16. {  
  17.     public static void main(String[] args)  
  18.     {  
  19.         List l=new ArrayList();  
  20.         l.add(100);  
  21.         l.add(-66);  
  22.         l.add(0);  
  23.         l.add(88);  
  24.           
  25.         System.out.println("list:"+l);  
  26.           
  27.         Collections.reverse(l);  
  28.         System.out.println("反转后的list:"+l);  
  29.           
  30.         Collections.shuffle(l);  //随机排序,洗牌  
  31.         System.out.println("乱序后的list:"+l);  
  32.           
  33.         Collections.swap(l, 13);  
  34.         System.out.println("互换序号是1,3元素后的list:"+l);  
  35.           
  36.         Collections.sort(l);  //这里是个自然排序,更多排序内容请参见本博客中的《JAVA应用 之 排序》  
  37.         System.out.println("排序后的list:"+l);  
  38.           
  39.         Collections.binarySearch(l, 88); //二分查找,必须保证list处于有序状态,查询成功返回序号,查不到返回负数  
  40.   
  41.         System.out.println("list中最小的元素是:"+Collections.min(l));  
  42.         System.out.println("list中最大的元素是:"+Collections.max(l));  
  43.         //上面两个方法 是自然排序,当然您可以自己实现一个Comparator的实现类作为第二个参数,具体见《JAVA应用 之 排序》  
  44.           
  45.         l.add(88);  
  46.         //88(第二个参数)在list(第一个参数)出现过多少次  
  47.         System.out.println("88在list中出现了:"+Collections.frequency(l, 88)+"次");  
  48.           
  49.         Collections.replaceAll(l, 8866); //将88用66去替代  
  50.         System.out.println("替代后的list:"+l);  
  51.           
  52.         Collections.fill(l, 66); //使用66(第二个参数)替换list中的所有元素。  
  53.         System.out.println("list所有元素都被替换成为66:"+l);  
  54.           
  55.         //下面写法的意思是创建一个l这么大的l1,不这么写会报异常,因为copy的时候不会自动扩容  
  56.         List l1=new ArrayList(Arrays.asList(new Object[l.size()]));  
  57.         Collections.copy(l1, l);  
  58.         System.out.println("拷贝l的l1:"+l1);  
  59.         System.out.println("l和l1是否相等?"+l.equals(l1));  
  60.         System.out.println("l和l1是否是一个引用?"+ (l==l1));  
  61.         l1=l;  
  62.         System.out.println("l和l1是否相等?"+l.equals(l1));  
  63.         System.out.println("l和l1是否是一个引用?"+ (l==l1));  
  64.         l1=new ArrayList(l); //这个是一个浅拷贝,l和l1的引用虽然不同,但是l和l1内部的元素引用还是一样的  
  65.         System.out.println("l和l1是否相等?"+l.equals(l1));  
  66.         System.out.println("l和l1是否是一个引用?"+ (l==l1));  
  67.         //上面的问题有些复杂 以后形成一个专题讲解  
  68.           
  69.         //创建一个类型安全的集合,下面的意思是这个集合只能是再添加Integer类型数据  
  70.         l.add("abc");  //现在还没事~  
  71.         try  
  72.         {  
  73.             Collections.checkedList(l, Integer.class).add("abc");  
  74.         }catch(Exception e)  
  75.         {  
  76.             System.out.println("类型安全操作后,当你再试图添加非Integer类型数据时 发生了异常");  
  77.         }  
  78.         System.out.println("======================");  
  79.           
  80.         /* 注意常用的这些集合(HashSet、HashMap、ArrayList、TreeMap、TreeSet、LinkedList等), 
  81.          * 都不是线程安全的,如果您的程序是在多线程环境下 并且有可能会同时修改同一个集合,那么 
  82.          * 您就需要使用Collections.synchronizedXxx 方法来保证线程安全 
  83.          */  
  84.         List sl=Collections.synchronizedList(new ArrayList());  
  85.         Map sm=Collections.synchronizedMap(new HashMap());  
  86.         Set ss=Collections.synchronizedSet(new HashSet());  
  87.         Set sts=Collections.synchronizedSortedSet(new TreeSet());  
  88.           
  89.         /* 不可变集合(空集合、指定元素集合、不可变状态) 
  90.          * 1.使用Collections.emptyXxx 方法来创建一个不可变化的空集合 
  91.          * 2.空不可变集合的意义:不会因为赋值null那样带来不可预期的异常,个人理解就是初始化的最佳实践。 
  92.         * 3.指定元素集合:返回一个只包含指定元素的集合,同时也是不可变化的集合 
  93.          *   应用:创建一个不可变化的特殊对象集合,例如:管理员集合,这样这个管理员对象就可以拥有一些集合的方法了 
  94.          *       例如:我判断一些这个用户对象是否是管理员(adminList.contains(user)) 
  95.          * 4.不可变状态:获得这个集合的不可变试图(只读) 
  96.          * 3.这里之用list举例,其他集合类似 
  97.         */  
  98.         List<String> el=Collections.emptyList();  
  99.         System.out.println(el.isEmpty());  
  100.   
  101.         try  
  102.         {  
  103.             el.add("1");  //如果试图改变它 那么就会抛出UnsupportedOperationException异常  
  104.         }catch(Exception e)  
  105.         {  
  106.             System.out.println("UnsupportedOperationException");  
  107.         }  
  108.         List<String> el1=null;  //通常我们可能习惯这样定义一个list  
  109.         try  
  110.         {  
  111.             el1.contains("abc");  //可能在某个地方我们不小心的这样用了(假设这个存在于一个低概率发生的地方)  
  112.         }catch(Exception e)  
  113.         {  
  114.             System.out.println("null异常");  
  115.       }   
  116.         List<String> singletonL=Collections.singletonList("abcd");  
  117.         System.out.println(singletonL);  
  118.           
  119.         //通过下面的方式就能得到一个不可变化的(只读)集合(视图的感觉,官方其实也是这么介绍的)  
  120.         List<String> listView=Collections.unmodifiableList(l);  
  121.     }  
  122. }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值