• 前言
  • 创建实例化测试对象
  • 操作
  • 升序
  • 降序
  • 取最大max
  • 取最小值min
  • list取反reverse
  • list随机打乱shuffle
  • 替换list的一个元素为另一个元素replaceAll
  • 指定对象并返回一个List
  • 指定对象并返回一个Set
  • 互换list中指定2个位置的元素
  • 其他
  • list深度复制


前言

java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

创建、实例化测试对象

创建一个用于测试的用户对象,对象实现Comparable接口,同时通过对象id进行操作,代码如下:

public class UserInfoBean implements Comparable<UserInfoBean>
{
    private int id;

    private String name;

    private int age;

    public UserInfoBean(int id, String name, int age)
    {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public int getAge()
    {
        return age;
    }

    public void setAge(int age)
    {
        this.age = age;
    }

    public int compareTo(UserInfoBean userInfoBean)
    {
        // TODO Auto-generated method stub
        if (this.id < userInfoBean.id)
            return -1;
        else if (this.id > userInfoBean.id)
            return 1;
        else
            return 0;
    }

    @Override
    public String toString()
    {
        return "UserInfoBean [id=" + id + ", name=" + name + ", age=" + age + "]";
    }
}

操作

实例化一个list,并往list里面添加三个用户对象

List<UserInfoBean> userInfos = new ArrayList<UserInfoBean>();
userInfos.add(new UserInfoBean(2, "张三", 10));
userInfos.add(new UserInfoBean(1, "李四", 25));
userInfos.add(new UserInfoBean(3, "王五", 40));
for (int i = 0; i < userInfos.size(); i++)
{
    System.out.println(userInfos.get(i).toString());
}

打印日志如下:

UserInfoBean [id=2, name=张三, age=10] 
 UserInfoBean [id=1, name=李四, age=25] 
 UserInfoBean [id=3, name=王五, age=40]

因为UserInfoBean对象中实现的compareTo方法是围绕用户的id在进行操作,所以以下的操作将围绕id进行


升序

UserInfoBean中实现的compareTo如下

public int compareTo(UserInfoBean userInfoBean)
{
    // TODO Auto-generated method stub
    if (this.id < userInfoBean.id)
        return -1;
    else if (this.id > userInfoBean.id)
        return 1;
    else
        return 0;
}
// 升序
System.out.println("升序:");
Collections.sort(userInfos);
for (int i = 0; i < userInfos.size(); i++)
{
    System.out.println(userInfos.get(i).toString());
}

日志如下:
UserInfoBean [id=1, name=李四, age=25]
UserInfoBean [id=2, name=张三, age=10]
UserInfoBean [id=3, name=王五, age=40]


降序

reverseOrder() 方法用于获取一个比较有否就实现Comparable接口的对象的集合的自然顺序相反。

// 降序
Collections.sort(userInfos, Collections.reverseOrder());
for (int i = 0; i < userInfos.size(); i++)
{
    System.out.println(userInfos.get(i).toString());
}

日志如下:
UserInfoBean [id=3, name=王五, age=40]
UserInfoBean [id=2, name=张三, age=10]
UserInfoBean [id=1, name=李四, age=25]


取最大(max)

在list中取id最大一个对象

UserInfoBean userInfo_max = Collections.max(userInfos);
System.out.println(userInfo_max);

日志如下:
UserInfoBean [id=3, name=王五, age=40]


取最小值(min)

在list中取id最大一个对象

UserInfoBean userInfo_min = Collections.min(userInfos);
System.out.println(userInfo_min);

日志如下:
UserInfoBean [id=1, name=李四, age=25]


list取反(reverse)

将一个list的子元素按原有的顺序取反

Collections.reverse(userInfos);
for (int i = 0; i < userInfos.size(); i++)
{
    System.out.println(userInfos.get(i).toString());
}

原数据:
UserInfoBean [id=2, name=张三, age=10]
UserInfoBean [id=1, name=李四, age=25]
UserInfoBean [id=3, name=王五, age=40]

取反后数据:
UserInfoBean [id=3, name=王五, age=40]
UserInfoBean [id=1, name=李四, age=25]
UserInfoBean [id=2, name=张三, age=10]


list随机打乱(shuffle)

对一个list的元素进行随机打乱元素顺序

Collections.shuffle(userInfos);
for (int i = 0; i < userInfos.size(); i++)
{
    System.out.println(userInfos.get(i).toString());
}

源数据
UserInfoBean [id=2, name=张三, age=10]
UserInfoBean [id=1, name=李四, age=25]
UserInfoBean [id=3, name=王五, age=40]
UserInfoBean [id=4, name=赵六, age=80]

第一次运行:
UserInfoBean [id=3, name=王五, age=40]
UserInfoBean [id=2, name=张三, age=10]
UserInfoBean [id=4, name=赵六, age=80]
UserInfoBean [id=1, name=李四, age=25]

第二次运行:
UserInfoBean [id=1, name=李四, age=25]
UserInfoBean [id=4, name=赵六, age=80]
UserInfoBean [id=2, name=张三, age=10]
UserInfoBean [id=3, name=王五, age=40]

第三次运行:
UserInfoBean [id=3, name=王五, age=40]
UserInfoBean [id=4, name=赵六, age=80]
UserInfoBean [id=1, name=李四, age=25]
UserInfoBean [id=2, name=张三, age=10]


替换list的一个元素为另一个元素(replaceAll)

replaceAll(数据源list,要替换的旧数据,新数据)
将list中指定的一个元素替换为另一个元素

UserInfoBean user = new UserInfoBean(5, "钱八", 80);
Collections.replaceAll(userInfos, userInfos.get(0), user);
for (int i = 0; i < userInfos.size(); i++)
{
    System.out.println(userInfos.get(i).toString());
}

源数据:
UserInfoBean [id=2, name=张三, age=10]
UserInfoBean [id=1, name=李四, age=25]
UserInfoBean [id=3, name=王五, age=40]
UserInfoBean [id=4, name=赵六, age=80]

替换后的数据:
UserInfoBean [id=5, name=钱八, age=80]
UserInfoBean [id=1, name=李四, age=25]
UserInfoBean [id=3, name=王五, age=40]
UserInfoBean [id=4, name=赵六, age=80]


指定对象并返回一个List
List<UserInfoBean> userInfos2 = Collections.singletonList(new UserInfoBean(5, "钱八", 2));
for (int i = 0; i < userInfos2.size(); i++)
{
    System.out.println(userInfos2.get(i).toString());
}

日志如下:
UserInfoBean [id=5, name=钱八, age=2]


指定对象并返回一个Set
Set<UserInfoBean> userSet = Collections.singleton(new UserInfoBean(5, "钱八", 2));
List<UserInfoBean> userInfos2 = new ArrayList<UserInfoBean>(userSet);
for (int i = 0; i < userInfos2.size(); i++)
{
    System.out.println(userInfos2.get(0).toString());
}

日志如下:
UserInfoBean [id=5, name=钱八, age=2]


互换list中指定2个位置的元素

如下代码交换下标为0和2的2个元素

Collections.swap(userInfos, 0, 2);
for (int i = 0; i < userInfos.size(); i++)
{
    System.out.println(userInfos.get(i).toString());
}

源数据:
UserInfoBean [id=2, name=张三, age=10]
UserInfoBean [id=1, name=李四, age=25]
UserInfoBean [id=3, name=王五, age=40]
UserInfoBean [id=4, name=赵六, age=80]
交换后数据
UserInfoBean [id=3, name=王五, age=40]
UserInfoBean [id=1, name=李四, age=25]
UserInfoBean [id=2, name=张三, age=10]
UserInfoBean [id=4, name=赵六, age=80]


其他

list深度复制
public static <T> List<T> deepCopy(List<T> src) {
        try {
            ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(byteOut);
            out.writeObject(src);

            ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
            ObjectInputStream in = new ObjectInputStream(byteIn);
            @SuppressWarnings("unchecked")
            List<T> dest = (List<T>) in.readObject();
            return dest;
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }