Java集合工具类:Collections

Java提供了一个操作Set、List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象实现同步控制等方法。
一、排序操作
在这里插入图片描述

示例代码:
1.	import java.util.ArrayList;
2.	import java.util.Collections;
3.	import java.util.Comparator;
4.	import java.util.List;
5.	
6.	/**
7.	 * Collections 常用排序方法
8.	 * @author sxj
9.	 *
10.	 */
11.	public class SortDemo {
12.	    public static void main(String[] args) {
13.	
14.	        List<Integer>  list=new ArrayList<>();
15.	        list.add(1);
16.	        list.add(2);
17.	        list.add(3);
18.	        list.add(4);
19.	        list.add(5);
20.	        list.add(6);
21.	        list.add(7);
22.	        list.add(8);
23.	        list.add(9);
24.	
25.	        System.out.println("list-->"+list);
26.	        System.out.println("----倒序  reverse---");
27.	        Collections.reverse(list);//倒序  9,8,7,6,5,4,3,2,1,
28.	        System.out.println("list-->"+list);
29.	
30.	        System.out.println("---随机顺序  shuffle---");
31.	        Collections.shuffle(list);//每次执行后的顺序都是随机排列的
32.	        System.out.println("list-->"+list);
33.	
34.	        System.out.println("---自然顺序排序  sort---");
35.	        Collections.sort(list);//自然顺序排序
36.	        System.out.println("list-->"+list);
37.	
38.	        System.out.println("---自定义排序  sort---");
39.	        Collections.sort(list,new Comparator<Integer>() {
40.	
41.	            @Override
42.	            public int compare(Integer o1, Integer o2) {
43.	                //从大到小
44.	                return o2-21;
45.	            }
46.	        });
47.	        System.out.println("list-->"+list);
48.	
49.	        System.out.println("---交换元素  swap---");
50.	        Collections.swap(list,0,8);
51.	        System.out.println("list-->"+list);
52.	
53.	        System.out.println("---自然顺序排序  sort---");
54.	        Collections.sort(list);//自然顺序排序
55.	        System.out.println("list-->"+list);
56.	
57.	        System.out.println("---rotate(2)---");
58.	        Collections.rotate(list,2);
59.	        System.out.println("list-->"+list);
60.	
61.	        System.out.println("---rotate(-2)---");
62.	        Collections.rotate(list,-2);
63.	        System.out.println("list-->"+list);
64.	    }
65.	}

二、查找和替换操作
在这里插入图片描述

1.	import java.util.ArrayList;
2.	import java.util.Collections;
3.	import java.util.List;
4.	
5.	public class SearchDemo {
6.	    public static void main(String[] args)
7.	    {
8.	        List<Integer> list = new ArrayList<>();
9.	        list.add(5);
10.	        list.add(-10);
11.	        list.add(3);
12.	        list.add(9);
13.	        list.add(-1);
14.	        list.add(7);
15.	        list.add(0);
16.	        System.out.println(list);
17.	
18.	        System.out.println("-----max----");
19.	        System.out.println(Collections.max(list)); // 输出最大元素
20.	        System.out.println("-----min----");
21.	        System.out.println(Collections.min(list)); // 输出最小元素
22.	
23.	        System.out.println("-----replaceAll----");
24.	        Collections.replaceAll(list , 0 , 1); // 将nums中的0使用1来代替
25.	        System.out.println(list);
26.	
27.	        System.out.println("-----frequency----");
28.	        // 判断5在List集合中出现的次数
29.	        System.out.println(Collections.frequency(list , 5));
30.	
31.	        System.out.println("-----binarySearch----");
32.	        Collections.sort(list); // 对nums集合排序
33.	        System.out.println(list);
34.	        //只有排序后的List集合才可用二分法查询元素的索引
35.	        System.out.println(Collections.binarySearch(list , 5));
36.	
37.	        List<Integer> list2=new ArrayList<>();
38.	        list2.add(-1);
39.	        list2.add(1);
40.	        System.out.println("-----indexOfSubList----");
41.	        System.out.println(Collections.indexOfSubList(list, list2));//查找子列表在列表中第一次出现的位置,没有返回-1
42.	        System.out.println("-----lastIndexOfSubList----");
43.	        System.out.println(Collections.lastIndexOfSubList(list , list2));//查找子列表在列表中最后一次出现的位置,没有返回-1
44.	
45.	
46.	        System.out.println("-----fill----");
47.	        Collections.fill(list, 0);//用0填充list
48.	        System.out.println(list);
49.	    }
50.	} 

三、同步控制
Collections类中提供了多个 synchronized…()方法,这些方法可以将指定集合包装成线程同步(线程安全)的集合,从而可以解决多线程并发访问集合时的线程安全问题。
Java中常用的集合框架中的实现类 ArrayList、Linkedlist、 HashSet、TreeSet、 HashMap和TreeMap都是线程不安全的。如果有多个线程访问它们,而且有超过一个的线程试图修改它们,则存在线程安全的问题。 Collections提供了多个类方法可以把它们包装成线程同步的集合。

示例代码:
1.	import java.util.ArrayList;
2.	import java.util.Collections;
3.	import java.util.HashMap;
4.	import java.util.HashSet;
5.	import java.util.List;
6.	import java.util.Map;
7.	import java.util.Set;
8.	
9.	public class SynchronizedDemo {
10.	    public static void main(String[] args) {
11.	
12.	        List<String> list=Collections.synchronizedList(new ArrayList<String>());
13.	
14.	        Set<String> set=Collections.synchronizedSet(new HashSet<String>());
15.	
16.	        Map<Integer, String> map=Collections.synchronizedMap(new HashMap<Integer,String>());
17.	
18.	    }
19.	}

Java集合总结
• 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更节省空间
• set是无序,不允许元素重复;HashSet和TreeSet是两个实现类
(1)、HashSet 基于HashMap实现,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,
要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的
(2)、TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值
• Comparator 和 Comparable 的区别
Comparator 定义在 类的外部, 此时我们的类的结构不需要有任何变化,从小到大:o1-o2 从大到小:o2-o1
Comparable 定义在 类的内部,耦合性较强 从小到大 :this-o 从大到小:o-this

猜你喜欢

转载自blog.csdn.net/weixin_42530700/article/details/90634338