Collection和Collections虽然都和集合有关,但差别还是蛮大的,Collection是Java集合中所有单列集合的顶层接口,而Collections是关于集合的一个工具类,提供了很多对集合进行操作的方法。
1.Collection
Java中的单列集合都实现了Collection接口,因此它们作为实现类都重写了该接口的方法,而Collection作为Java集合的顶层接口,也就说明这个接口提供了集合最基本的方法,也是所有单列集合共有的方法。
下面列出一些常见的方法进行说明:
boolean add(E e) 添加元素
这是添加元素的方法,Collection是一个接口,本身不能实例化,但是可以引用实现了该接口的类变量,这样就可以进行添加元素的测试了。
Collection c = new ArrayList();
System.out.println(c.add("hello"));
System.out.println(c.add("world"));
因为是引用的ArrayList集合,很明显是可以添加成功的。
下面是一个清空集合的方法
void clear() 清空集合
调用该方法后,集合之中的所有元素都会被清空
下面这是一个判断是否存在某元素的方法
boolean contains(Object o) 包含元素
这个方法是用来判断该集合是否包含某个元素,是则返回true,否就返回false。
下面这个方法则是判断集合是否为空
boolean isEmpty() 判断集合是否为空
如果集合中没有元素,那么就是空的,该方法也就会返回true
下面的这个方法用来删除元素
boolean remove(Object o) 移除元素
删除集合中不需要的元素就可以使用这一个方法
下面这个方法则是用来说明集合中元素的个数
int size() 求集合的大小
集合的大小当然就是指的这个集合之中有多少个元素
下面这个方法用来将集合转化为数组
Object[] toArray() 转换为数组
将集合转化为数组也是遍历元素的一种方式,因为有时候像Set集合,没有索引,就很不好去进行修改,转化为数组之后因为有索引操作起来就会方便不少。
下面的就是迭代器方法
Iterator<E> iterator()
这也便是List和Set集合都有迭代器的原因,因为它们都实现了 Collection接口,所以就一定会实现这个迭代器方法。
2.Collections
Collections则是一个工具类,它提供了丰富的功能用来对集合进行操作
下面介绍一下它的几个方法
二分查找 binarySearch
列表复制 copy
列表填充 fill
列表反转 reverse
随机置换 shuffle
自然排序 sort
互换位置 swap
binarySearch(List list,T key)方法:使用二分查找来查找目标元素,不过集合中的元素必须是已经排过序的,如sort()方法,不然的话得到的结果是不准确的。
copy(List dest,List src):用来复制集合,将源集合(src)之中的元素复制到目标集合(dest)之中
fill(List list,T obj):使用obj元素填充list集合,原来集合中有多少个元素,填充之后集合中便会存在多少个obj元素
reverse(List list):反转集合中元素的顺序
shuffle(List list):会将集合中元素的位置进行随机置换,有点像获得随机数一样
sort(List
swap(List list,int i,int j):对集合中位置i和位置j的元素进行互换
3.集合的一些小应用
3.1 模拟斗地主中洗牌和发牌
ArrayList<String> arr = new ArrayList<String>();
String[] color = {"黑桃","红桃","梅花","方片"};
String[] number = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
for (int i = 0; i < color.length; i++) {
for (int j = 0; j < number.length; j++) {
arr.add(color[i]+number[j]);
}
}
arr.add("大王");
arr.add("小王");
System.out.println(arr);
Collections.shuffle(arr);
ArrayList<String> player = new ArrayList<String>();
ArrayList<String> player2 = new ArrayList<String>();
ArrayList<String> player3 = new ArrayList<String>();
for (int i = 0; i < arr.size()-3; i++) {
if(i%3==0){
player.add(arr.get(i));
}else if(i%3==1){
player2.add(arr.get(i));
}else if(i%3==2){
player3.add(arr.get(i));
}
}
System.out.println("选手1:"+player);
System.out.println("选手2:"+player2);
System.out.println("选手3:"+player3);
System.out.println("底牌:");
for (int i = arr.size()-3; i < arr.size(); i++) {
System.out.println(arr.get(i));
}
3.2 对集合中数据进行去重
List<String> list = new ArrayList<String>();
list.add("a");
list.add("a");
list.add("c");
list.add("c");
list.add("a");
list.add("d");
/*
* 先将List集合转为Set集合,由于Set集合是无序而且不能重复的,所以它会自动去重,然后
* 再将它转为List集合,但是没办法保证集合中元素的顺序
*/
public static void noRepeat(List<String> al) {
Set s = new HashSet<String>();
s.addAll(al);
al.clear();
al.addAll(s);
}
/*
* 如果一个对象在集合中第一次出现的位置和最后一次出现的位置不一致,则代表有多个,应该删除
*/
public static void noRepeat2(List<String> al) {
for (int i = 0; i < al.size(); i++) {
if(al.indexOf(al.get(i)) != al.lastIndexOf(al.get(i))){
al.remove(i);
i--;
}
}
}
public static void noRepeat3(List<String> al) {
for (int i = 0; i < al.size() - 1; i++) {
for (int j = i + 1; j < al.size(); j++) {
if (al.get(i).equals(al.get(j))) {
al.remove(j);
j--;
}
}
}
}
3.3 生成一个元素范围在min和max之间,长度为length的数组,并且要求数组中的元素不能够重复
/**
* @param min 设置生成随机数范围的最小值
* @param max 设置生成随机数范围的最小值
* @param length 设置生成数组的大小
* @return int[] 生成一个length长度的整形数组,数组中元素的取值范围在min和max之间
* @author Lau Cloud
*/
public static int[] getRandomArray(int min, int max, int length) {
int[] arr = new int[length];
ArrayList<Integer> list = new ArrayList<Integer>();
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
int num = min + r.nextInt(max - min + 1);
while (list.contains(num)) {
num = min + r.nextInt(max - min + 1);
}
arr[i] = num;
list.add(num);
}
return arr;
}
3.4 生成10个1到20之间不重复的整数
public static void method() {
ArrayList<Integer> arr = new ArrayList<Integer>();
Random r = new Random();
for (int i = 0; i < 10; i++) {
int number;
do{
number = (int) r.nextInt(20) + 1;;
}while (arr.contains(number));
arr.add(number);
System.out.println("第" + (i + 1) + "个数:" + number);
}
}
3.5 生成10个长度为10的不重复字符串,字符串的组成只能是小写字母、大写字母和数字
public static void method2() {
ArrayList<String> arr = new ArrayList<String>();
Random r = new Random();
String str = "abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWSYZ123456789";
char[] charArray = str.toCharArray();
for (int i = 0; i < 10; i++) {
StringBuilder sb = new StringBuilder();
do {
for (int j = 0; j < 10; j++) {
int k = r.nextInt(str.length());
sb.append(charArray[k]);
}
} while (arr.contains(sb));
arr.add(sb.toString());
System.out.println("第" + (i + 1) + "个字符串:" + sb.toString());
}
}
3.6 接受用户输入的一行字符串,保留字符串中不重复的字符
Scanner sc = new Scanner(System.in);
System.out.println("请输入一行字符:");
String str = sc.nextLine();
char[] charArray = str.toCharArray();
HashSet<Character> set = new HashSet<Character>();
for (int i = 0; i < charArray.length; i++) {
set.add(charArray[i]);
}
System.out.println(set);
3.7 计算一句话中每个单词出现的次数
ArrayList<String> arr = new ArrayList<String>();
HashMap<String, Integer> map = new HashMap<String, Integer>();
String str = "If you want to change your fate I think you must come to the dark horse to learn java";
String[] strArr = str.split(" ");
for (int i = 0; i < strArr.length; i++) {
arr.add(strArr[i]);
}
for (int i = 0; i < arr.size() - 1; i++) {
for (int j = i + 1; j < arr.size(); j++) {
if (arr.get(i).equals(arr.get(j))) {
arr.remove(j);
j--;
}
}
}
System.out.println(arr);
for (int i = 0; i < arr.size(); i++) {
map.put(arr.get(i), 0);
}
Set<Entry<String, Integer>> entrySet = map.entrySet();
for (Entry<String, Integer> entry : entrySet) {
String key = entry.getKey();
int count = 0;
for (int i = 0; i < strArr.length; i++) {
if (key.equals(strArr[i])) {
count++;
}
}
entry.setValue(count);
}
entrySet = map.entrySet();
for (Entry<String, Integer> entry : entrySet) {
String key = entry.getKey();
int value = entry.getValue();
System.out.println(key + "---" + value);
}
4.总结
对于集合,想掌握的话,感觉还是要多敲代码,使用的多了就会好很多,并且还会慢慢地去想如何将几个集合联合起来使用,发挥各自的优点,在解决问题时也要多想几种解决思路,也许对自己知识的掌握也会有豁然开朗的感觉。