Collections工具类
Collections 是一个操作 Collection(Set、 List )和 Map 等集合的工具类
Collection和Collections的区别?
Collection是用来存储单列数据的集合接口,常用子接口有List和Set
Collections是操作Collection的工具类。
常用方法
排序操作:
- reverse(List): 反转 List 中元素的顺序
- shuffle(List): 对 List 集合元素进行随机排序
- sort(List): 根据元素的自然顺序对指定 List 集合元素按升序排序
- sort(List, Comparator): 根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
- swap(List, int, int): 将指定 list 集合中的 i 处元素和 j 处元素进行交换
查找和替换:
- Object max(Collection): 根据元素的自然顺序,返回给定集合中的最大元素
- Object max(Collection, Comparator): 根据 Comparator 指定的顺序,返回给定集合中的最大元素
- Object min(Collection)
- Object min(Collection, Comparator)
- int frequency(Collection, Object): 返回指定集合中指定元素的出现次数
- void copy(List dest,List src):将src中的内容复制到dest中
- boolean replaceAll(List list, Object oldVal, Object newVal): 使用新值替换List 对象的所有旧值
举例:
reverse反转方法
@Test public void test3() { // 测试reverse方法 List list = new ArrayList(); list.add(2121); list.add(-1); list.add(21); list.add(0); list.add(45); //反转 Collections.reverse(list); System.out.println(list);//[45, 0, 21, -1, 2121] }
sort方法
@Test public void test2() { // 测试sort方法 List list = new ArrayList(); list.add(2121); list.add(-1); list.add(21); list.add(0); list.add(45); //按升序排序 Collections.sort(list); System.out.println(list);//[-1, 0, 21, 45, 2121] }
逆序排序
int compareTo(T t)
方法说明
定义:比较此对象与指定对象的顺序
返回:负整数、零或正整数。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
@Test public void test1() { // 测试sort方法 List list = new ArrayList(); list.add(2121); list.add(-1); list.add(21); list.add(0); list.add(45); // 降序 Collections.sort(list, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { System.out.println(o2 - o1); return o2 - o1; // 此时o2-o1是大于0的 } }); System.out.println(list);//[-1, 0, 21, 45, 2121] }
对自定义对象的排序
方法一:通过实现Comprable的compareTo方法进行排序
// 实现Comparable接口 class User implements Comparable<User> { private String name; private Integer age; public User(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public int compareTo(User o) { //首先比较年龄,如果年龄相同,则比较名字 int flag = this.getAge().compareTo(o.getAge()); if (flag == 0) { return this.getName().compareTo(o.getName()); } else { return flag; } } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; }
测试方法
// 自定义对象的排序,比如对User对象按照年龄排序,再按照name排序 @Test public void testSort() { User f1 = new User("tony", 19); User f2 = new User("jack", 16); User f3 = new User("tom", 80); User f4 = new User("jbson", 44); User f5 = new User("jason", 44); User f6 = new User("tom", 12); List<User> list = new ArrayList<User>(); list.add(f1); list.add(f3); list.add(f4); list.add(f2); list.add(f5); list.add(f6); Collections.sort(list); for (User o : list) { System.out.println(o.getAge() + "-->" + o.getName()); } }
输出:
12-->tom
16-->jack
19-->tony
44-->jason
44-->jbson
80-->tom
copy方法
List dest = Arrays.asList(new Object[list.size()]);
@Test public void testCopy(){ List list = new ArrayList(); list.add(2121); list.add(-1); list.add(21); list.add(0); list.add(45); //错误写法:此时dest集合为长度为0,报错IndexOutOfBoundsException: Source does not fit in dest // List dest = new ArrayList(); // Collections.copy(dest,list); // System.out.println(dest.size()); // System.out.println(dest); // 正确写法:先造一个值为null,长度为list长度的集合。再拷贝 List dest = Arrays.asList(new Object[list.size()]); System.out.println(dest.size()); // 5 Collections.copy(dest,list); System.out.println(dest); }