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
一、排序操作
示例代码:
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