可变参数的应用
有时候在我们调用方法时,我们不能确定具体传入多少个数值,这个时候我们就能采用可变参数进行应用,格式为
public static int getSum(int...arg){ return 0; }
(注意,这是时候形参是会自动将输入的形参放入arg这个数组中,在方法的形参中只能写一个可变参数,如果有其他形参,可变参数得写在所有形参的最后面)
这个时候,我们在调用该方法的时候就能输入自定义个数据,而这些数据就会存储到arg数组中,如果我们后面需要调用,我们直接将值从数组中取出进行使用
例如我下面需要使用可变参数进行传递形参进行方法的实现,代码如下:
package com.itazhang.map03;
public class SumTest {
public static void main(String[] args) {
System.out.println(getSum(1, 2, 3, 5, 6, 7));
}
//int...a表示我可以传入自定义个数据,只要时int类型的就行,但是这个arg是个数组
//需要用时直接将该数据从该数组取出
public static int getSum(int...arg){
int sum = 0;
for (int i : arg) {
sum = sum +i;
}
return sum;
}
}
Collections工具类的使用
在Java中,Java自动帮我们写好了一些单列集合的工具类,方便我们调用方法操作单列集合,如我现在所写的Collections就是这样的一个工具类,里面有许多方法(注意:只能单列集合使用!)
addAll方法
addall方法能一次性批量的添加数据到指定的单列集合中,格式如下
Collections.addAll(目的单列集合,数据1,数据2.........),在目的单列集合后面,不管写多少数据都能自动添加到目的集合中。实现如下
List<String> l1 = new ArrayList<>();
Collections.addAll(l1,"aaa","bbb","ccc");
shuffle方法
shuffle方法能自动将指定单列集合打乱顺序,每次运行打乱顺序都不一样
//打乱集合数据
Collections.shuffle(l1);
System.out.println(l1);
下列为一个利用上诉方法的小练习,创建两个集合分别存储男生和女生并打乱顺序,从10个同学中抽取一个人,要求70%的概率抽到男同学,30%的概率抽到女同学,我们直接创建一个长度为10的只包含0和1数据的集合,其中7个1,3个0,我们再用shuffle方法打乱该集合,从中抽取一个数,这样就实现了70%和30%的概率问题,最后如果抽到的是1,我们从男生集合里面取出一个,如果抽到的是0,从女生集合里面取出一个,这样就完美的实现了概率问题。具体代码如下:
package com.itazhang.map03;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
public class TestDemo1 {
public static void main(String[] args) {
ArrayList<String> listman = new ArrayList<>();
Collections.addAll(listman,"张","王","李","孙","杨","刘");
Collections.shuffle(listman);
ArrayList<String> listgirl = new ArrayList<>();
Collections.addAll(listgirl,"女1","女2");
Collections.shuffle(listgirl);
ArrayList<Integer> list2 = new ArrayList<>();
Collections.addAll(list2,1,1,1,1,1,1,1,0,0,0);
Collections.shuffle(list2);
Random r = new Random();
int temp = r.nextInt(list2.size());
if(list2.get(temp) == 1){
System.out.println(listman.get(0));
}else if(list2.get(temp) == 0){
System.out.println(listgirl.get(0));
}
}
}
下列为一个小练习,要求在六个字符串中抽取,每次抽取的不一样,且抽取完后进行第二轮抽取
具体实现代码如下:
package com.itazhang.map03;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
public class ListTestDemo2 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"aaa","bbb","ccc","ddd","eee","fff");
int count = list.size();
Random r =new Random();
ArrayList<String> list2 = new ArrayList<>();
//开始点名,将点了名的从集合中删除,添加到另一个集合中
for (int i = 0; i < count; i++) {
int temp = r.nextInt(list.size());
String tempstr = list.remove(temp);
list2.add(tempstr);
System.out.println(tempstr);
}
System.out.println("第二轮点名开始");
for (int i = 0; i < count; i++) {
int temp = r.nextInt(list2.size());
String tempstr = list2.remove(temp);
System.out.println(tempstr);
}
}
}
集合的嵌套
有时候我们会存储一个键对应多个数据,这个时候map集合还能使用吗?答案是当然的,我们将键存入map集合中,对应的值我们用一个个单列集合存储起来,这样的话就能实现一个键对应一个集合,而一个集合里面存储着多个值
一个小案例,一个省对应着多个市,请用代码实现
package com.itazhang.map03;
import java.util.*;
public class Exercise1 {
public static void main(String[] args) {
Map<String, ArrayList<String>> m = new HashMap<>();
ArrayList<String> list1 = new ArrayList<>();
ArrayList<String> list2 = new ArrayList<>();
ArrayList<String> list3 = new ArrayList<>();
Collections.addAll(list1,"南京市","扬州市","苏州市");
Collections.addAll(list2,"武汉市","十堰市","宜昌市");
Collections.addAll(list3,"唐山市","保定市","石家庄市");
m.put("江苏省",list1);
m.put("湖北省",list2);
m.put("河北省",list3);
System.out.println(m);
}
}
不可变集合
我们有时不想让外面修改我们的一些集合里的数据,这个时候我们就能用不可变集合
不可变集合创建方法为
List<String> list = List.of("aaa", "bbb", "ccc", "ddd");
Set<String> set = Set.of("aaa", "bbb", "ccc", "ddd");
Map<String, String> map = Map.of("001", "beijin", "002", "tianjin", "003", "shanghai");
注意(在Map集合中会自动将两个数据作为一对键值对,前面的为键,后面的为值)
通过调用集合里的静态方法of来创建一个不可变集合,这个集合里的数据可以被查询,但是不能被修改和删除,这就是不可变集合所持有的特点。