操作集合的工具类:Collections

Collections 是一个操作 Set、List 和 Map 等集合的工具类。Collections 中提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法

static void reverse(List list):反转指定List集合中的顺序;

static void shuffle(List list):对集合元素随机排序

static void sort(List list):自然升序排序

static vois swap(List list,int i, int j):将指定的List集合i处元素和j处元素进行交换;

static void rotate(List list, int distance):
若distance为正数,将list集合后的distance个元素移到前面; 当distance为负数,将list集合前的distance个元素移到后面;

static  int binarySearch(List list, Object key) 使用二分搜索法搜索指定列表,以获得指定对象。 调用之前 必须调用 Collections.sort(List list)(完成自然排序);

static Object max(Collection coll) 根据元素的自然顺序,返回给定 collection 的最大元素。   

static Object min(Collection coll) 根据元素的自然顺序,返回给定 collection 的最小元素。
 

static  void fill(List list, Object obj)  使用指定元素替换指定列表中的所有元素。

static int frequency(Collection c, Object o)  返回指定 collection 中等于指定对象的元素数。 

static int indexOfSubList(Listsource, List target) 返回指定源列表中第一次出现指定目标列表的起始位置;如果没有出现这样的列表,则返回 -1。 

static int lastIndexOfSubList(List source, List target)  返回指定源列表中最后一次出现指定目标列表的起始位置;如果没有出现这样的列表,则返回 -1。

static boolean  replaceAll(List list, Object oldVal, Object newVal)  使用另一个值替换列表中出现的所有某一指定值。



Collections是工具类,所有方法均为有用方法,且方法为static。有Sort方法用于给List排序。

Collections.Sort()分为两部分,一部分为排序规则;一部分为排序算法。规则用来判断对象;算法是考虑如何排序。

对于自定义对象,Sort不知道规则,所以无法比较。这种情况下一定要定义排序规则。方式有两种:

① java.lang下面有一个接口:Comparable(可比较的)

可以让自定义对象实现一个接口,这个接口只有一个方法comparableTo(Object o)

其规则是当前对象与o对象进行比较,其返回一个int值,系统根据此值来进行排序。

如 当前对象>o对象,则返回值>0;(可将返回值定义为1)

如 当前对象=o对象,则返回值=0;

如 当前对象<o对象,则返回值〈0。(可将返回值定义为-1)

我们通过返回值1和-1位置的调换来实现升序和降序排列的转换。

 public static <T extends Comparable<? super T>> void sort(List<T> list) {
Object[] a = list.toArray();
Arrays.sort(a);
ListIterator<T> i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set((T)a[j]);
}
}

② java.util下有一个Comparator(比较器)

它拥有compare(),用来比较两个方法。要生成比较器,则用Sort中Sort(List,List(Compate))。第二种方法更灵活,且在运行的时候不用编译。

public static <T> void sort(List<T> list, Comparator<? super T> c) {
Object[] a = list.toArray();
Arrays.sort(a, (Comparator)c);
ListIterator i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set(a[j]);
}
}

注意:要想实现comparTo()就必须在主方法中写上implement comparable.



  • 同步控制

Collections 类中提供了多个 synchronizedXxx() 方法,该方法可使将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题。

综合前面所有介绍过的,java中常用的集合框架中的实现类HashSet,TreeSet,ArrayList,ArrayDeque,LinkedList,HashMap,TreeMap都是线程不安全的。如果有多个线程访问他们,而且超过一个线程试图修改它们,则可能出现错误。下面代码演示了如何获取List,Set,Map的线程安全版本。

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set; public class Linkin
{
public static void main(String[] args)
{
//我表示比较蛋疼,ajax里面asynchronous是异步,这里的这个synchronized是同步,经常搞混。
Collection<String> c = Collections.synchronizedCollection(new ArrayList<String>());
List<String> list = Collections.synchronizedList(new ArrayList<String>());
Set<String> set = Collections.synchronizedSet(new HashSet<String>());
Map<String, String> map = Collections.synchronizedMap(new HashMap<String, String>());
}
}



设置不可变集合:只能访问集合元素,不能修改集合元素。也就是集合的“只读版本”。

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set; /**
*
* @version 1L
* @author LinkinPark
* @since 2014-11-12
* @motto 梦似烟花心似水,同学少年不言情
* @desc ^EMPTY_LIST EMPTY_SET EMPTY_MAP也都是空的集合
*/
public class Linkin
{
public static void main(String[] args)
{
//创建一个空的,不可改变的List对象
List<String> list = Collections.emptyList();
//List<String> list = Collections.EMPTY_LIST; 一样的,只不过这里没有检查泛型
//创建一个只有一个元素,且不可改变的Set对象
Set<String> set = Collections.singleton("LinkinPark...");
//创建一个普通的Map对象
Map<String, String> map = new HashMap<String, String>();
map.put("LinkinPark", "Binger");
//返回普通Map对象的不可变版本
map = Collections.unmodifiableMap(map);
//下面3行代码就要报错,还是集合里面那个最创建的错误:java.lang.UnsupportedOperationException
list.add("LinkinPark...");
set.add("LinkinPark");
map.put("这里要操作的", "huhu");
}
}











linkin大话数据结构--Collections类的更多相关文章

  1. linkin大话数据结构--Collection和Iterator

    linkin大话数据结构--Collection和Iterator Java 集合就像一种容器,可以把多个对象的引用放入容器中.Java 集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系 ...

  2. linkin大话数据结构--Google commons工具类

    package tz.web.dao.bean; import java.util.Arrays; import java.util.Collection; import java.util.List ...

  3. linkin大话数据结构--List

    List:Collection子接口 List是有序的集合,集合中每个元素都有对应的顺序序列.List集合可使用重复元素,可以通过索引来访问指定位置的集合元素(顺序索引从0开始),List集合默认按元 ...

  4. linkin大话数据结构--泛型

    泛型(Generic) 什么是泛型? java5开始出现的一种对Java语言类型的一种拓展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数类型时指定的类型占位符,就好比方法的形式参数 ...

  5. linkin大话数据结构--apache commons工具类

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动. 一.Commons BeanUtils 说明:针对Bean的一个工具集.由于Bean往往是有一堆ge ...

  6. linkin大话数据结构--字符串,数组,list之间的互转

    在实际开发中,我们经常会用到字符串,字符数组,字符list,当然也会不可避免的进行这3者之间的互相转换. 在使用到Apache和Google下的common包,可以这样子实现: package tz. ...

  7. linkin大话数据结构--Queue

    链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必按顺序存储,所以插入和删除速度超 ...

  8. linkin大话数据结构--数组

    数组概述:如何正确理解数组?数组也是一种类型 数组是多个相同类型数据的组合,实现对这些数据的统一管理.数组属引用类型,数组型数据是对象(Object),数组中的每个元素相当于该对象的成员变量数组中的元 ...

  9. linkin大话数据结构--Map

    Map 映射关系,也有人称为字典,Map集合里存在两组值,一组是key,一组是value.Map里的key不允许重复.通过key总能找到唯一的value与之对应.Map里的key集存储方式和对应的Se ...

随机推荐

  1. hook 虚表

    PVOID* GetVtpl(PVOID lpThis, int nIndex){  return *(PVOID**)lpThis + nIndex;} PVOID HookVtpl(PVOID*  ...

  2. 修改MySQL 5.7.9版本的root密码方法以及一些新变化整理

    MySQL 5.7版本开始,增强密码验证机制,网上说安装的时候会在/root/.mysql_secret  文件中生成默认密码,这一点自 5.7.6版本以后也去掉了. 针对如果生成默认密码,网上有一个 ...

  3. css loading

    css /*loading*/ .loader { width: 100px; height: 101px; border: 8px solid; border-top-color: hsl(154, ...

  4. CSS3使用content属性来插入项目编号

    首先可以使用before选择器与after选择器的content属性在元素的前面或者后面插入文字和图像,这里我记录的是利用这个content属性来在项目前插入项目编号,同时可以利用content属性在 ...

  5. Hadoop(十)Hadoop IO之数据完整性

    前言 上一篇我分享了Hadoop的压缩和编解码器,在我们开发的过程中其实是经常会用到的,所以一定要去掌握.这一篇给大家介绍的是Hadoop的数据完整性! Hadoop用户在使用HDFS储存和处理数据不 ...

  6. [翻译].NET Shell Extensions - Shell Context Menus---.net 外壳扩展-右键菜单

    我自己的前言说明: 本文原作者为    Dave Kerr,原文链接为.NET Shell Extensions - Shell Context Menus:,我是在为了完成最新需求的时候查询资料的时 ...

  7. bzoj usaco 金组水题题解(2)

    续.....TAT这回不到50题编辑器就崩了.. 这里塞40道吧= = bzoj 1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害 比较经典的最小割?..然而 ...

  8. 【JAVA】hashcode() & equals()

    平时使用map时都是用JAVA原生的类型,所以很少关注到hashcode()和equals()的方法的内部实现.近期实现一个小工具,涉及到自己写的类的查找比对,又再次重温了相关的知识. 上简单示例代码 ...

  9. 2. Event编写

    Event作用: 存储事件数据. IEventBase K:是Actor的StateId的类型,可以是long.可以是string,Ray一般使用OGuid生成的字符串作为主键. 编写Event继承I ...

  10. AMD规范学习笔记

    背景 NodeJS的一套比较简洁 Moudles 规范, 使得在服务器端的模块化变得更加简单.很长一段时间,很多公司或者项目都有自己的一套模块化机制, 却未能形成一套统一的标准, NodeJS的Mou ...