Java提供了一个操作Set、List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象实现同步控制等方法。这个类不需要创建对象,内部提供的都是静态方法。
一、排序操作
示例代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class SortDemo {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
System.out.println(list);
System.out.println("‐‐‐‐倒序 reverse‐‐‐");
Collections.reverse(list);// 倒序 5,4,3,2,1,
System.out.println(list);
System.out.println("‐‐‐随机顺序 shuffle‐‐‐");
Collections.shuffle(list);// 每次执行后的顺序都是随机排列的
System.out.println(list);
System.out.println("‐‐‐自然顺序排序 sort‐‐‐");
Collections.sort(list);// 自然顺序排序
System.out.println(list);
System.out.println("‐‐‐自定义排序 sort‐‐‐");
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// 从大到小
return o2 - 21;
}
});
System.out.println(list);
System.out.println("‐‐‐交换元素 swap‐‐‐");
Collections.swap(list, 0, 4);//索引从0开始,交换的是元素索引
System.out.println(list);
System.out.println("‐‐‐自然顺序排序 sort‐‐‐");
Collections.sort(list);// 自然顺序排序
System.out.println(list);
System.out.println("‐‐‐rotate(2)//正数往后移动,若负数往前移动‐‐‐");
Collections.rotate(list, 2);
System.out.println(list);
}
}
结果截图:
二、查找和替换操作
示例代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class SearchDemo {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(5);
list.add(-3);
list.add(-1);
list.add(0);
System.out.println(list);
System.out.println("=====max输出最大元素=====");
System.out.println(Collections.max(list));
System.out.println("=====min输出最小元素=====");
System.out.println(Collections.min(list));
System.out.println("=====replaceAll将集合中的0使用1来代替=====");
Collections.replaceAll(list , 0 , 1);
System.out.println(list);
System.out.println("=====frequency判断5在List集合中出现的次数=====");
System.out.println(Collections.frequency(list , 5));
System.out.println("=====sort对集合排序,从小到大=====");
Collections.sort(list);
System.out.println(list);
System.out.println("===binarySearch返回指定元素的索引,只有排序后的集合才可用二分法===");
System.out.println(Collections.binarySearch(list , 5));
List<Integer> list2=new ArrayList<>();
list2.add(-1);
list2.add(1);
System.out.println("===indexOfSubList查找子列表在列表中第一次出现的位置,没有返回‐1===");
System.out.println(Collections.indexOfSubList(list, list2));
System.out.println("===lastIndexOfSubList查找子列表在列表中最后一次出现的位置,没有返回‐1===");
System.out.println(Collections.lastIndexOfSubList(list , list2));
System.out.println("===fill用8填充list===");
Collections.fill(list, 8);
System.out.println(list);
}
}
结果截图:
三、同步控制
Collections类中提供了多个 synchronized…()方法,这些方法可以将指定集合包装成线 程同步(线程安全)的集合,从而可以解决多线程并发访问集合时的线程安全问题。
Java中常用的集合框架中的实现类 ArrayList、Linkedlist、 HashSet、TreeSet、 HashMap和TreeMap都是线程不安全的。如果有多个线程访问它们,而且有超过一个的线程试图修改它们,则存在线程安全的问题。 Collections提供了多个类方法可以把它们包装成线程同步的集合。
示例代码:
import java.util.ArrayList;
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 SynchronizedDemo {
public static void main(String[] args) {
List<String> list=Collections.synchronizedList(new ArrayList<String>());
Set<String> set=Collections.synchronizedSet(new HashSet<String>());
Map<Integer, String> map=Collections.synchronizedMap(new HashMap<Integer, String>());
}
}
Java集合总结
1、List,Set,Map是集合体系中最主要的三个接口。 其中list和set是继承自collection接口;Map也属于集合系统但是与collection接口不同;list是有序且允许元素重复,允许元素为null,ArrayList、LinkedList和Vector是三个主要的实现类 (1)、Vector、ArrayList都是以类似数组的形式存储在内存中,LinkedList则以链表的形式进行存储。 (2)、Vector线程安全的(同步),ArrayList、LinkedList线程不安全的(不同步)。 (3)、ArrayList、Vector适合查找,不适合指定位置的插入、删除操作; LinkedList适合指定位置插入、删除操作,不适合查找。 (4)、ArrayList在元素填满容器时会自动扩充容器大小的50%,而Vector则是 100%,因此ArrayList更节省空间。
2、set是无序,不允许元素重复;HashSet和TreeSet是两个实现类
(1)、HashSet基于HashMap实现,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的。(2)、TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。
3、Comparator和 Comparable的区别:
Comparator定义在类的外部,此时我们的类的结构不需要有任何变化,从小到大:o1-¬o2 从大到小:o2-¬o1。
Comparable定义在类的内部,耦合性较强;从小到大:this-¬o 从大到小:o¬-this。
PS:为了线程安全而提出,线程安全的就是同步的,不安全的就是不同步的,不同步的运行速度要比同步的快。
4、Collection 和 Collections的区别:
Collections是java.util下的类,是针对集合类的一个工具类,提供一系列静态方法,实现对集合的查找、排序、替换、线程安全化(将非同步的集合转换成同步的)等操作。
Collection是java.util下的接口,它是各种集合结构的父接口,继承于它的接口主要有Set和List,提供了关于集合的一些操作,如插入、删除、判断一个元素是否其成员、遍历等。