泛型是Java中比较常用的特性,主要是为了参数化类型,最终提高代码的复用性。可用在类、方法和接口三个地方,分别对应泛型类,泛型方法和泛型接口。最开始在arrList中使用的arrList =new ArrayList
//Generic类(也是泛型对应的英文单词) public class Generic{ T1 data1; T2 data2; public Generic(T1 data1, T2 data2) { this.data1 = data1; this.data2 = data2; } public void show(){ System.out.println("输出数:"+this.data1+","+this.data2); } } //demo测试类 public static void main(String[] args) { Generic str=new Generic<>("1",2); Generic s=new Generic<>(1.2, true); str.show(); s.show(); }
一般整个泛型还是用在基本类型上,应为如果是个对象,对象的属性不好统一,这种情况下还不如使用继承类,对于静态方法的实现:
//interface接口 public interface interface12.类型通配符{ public T getData(T t); } //实现泛型接口 public class Generic implements interface1 { public String getData(String str){ return str; } } //demo类中调用 Generic str=new Generic<>("test",2); System.out.println("测试泛型接口:"+str.getData(str.data1));
为了对泛型对应的类型作出一定的限制便出现了类型的通配符概念,其基本使用方法如下:
//通配符(可以设置成任意类型) List> arrList=new ArrayList3.可变参数(); //设置通配符上限 List extends Number> arrList2=new ArrayList (); //设置通配符下限 List super Number> arrList3=new ArrayList
//getSum接口 public interface getSum{ public T getResult(T ...params); } //在demo类里面实现getSum接口 public class demo implements getSum { public Integer getResult(Integer ...params){//构建可变参数 Integer sum=0; for(Integer item:params){ sum+=item; } return sum; } public static void main(String[] args) { demo d=new demo(); System.out.println("输出结果:"+d.getResult(1,2,4)); //这里其实涉及到一个自动装箱和拆箱处理,int类型的1将会自动装箱成Integer类型, //最后计算得到的Integer结果进行自动拆箱处理,将结果拆解成int。 } } //注:这种接口写法还是只能针对具体的一种类型,要是想用多种类型的话可能需要重载运算符,因为number+T(可变类型是不能实现的)。
补充说明一个知识点——集合静态方法中的不可变集合
//通常可变参数对应的不可变集合有如下三种写法,对应一个共同特点,一开始元素的个数是可变的,单数被初始化之后就不能再增加或者删除元素了,也就是还原了原始数组的那种形式。 List4.Map集合strList=List.of("Hangman","Lisi","Wangwu"); Set intList=Set.of(1,2,3);//给元素不能重复 List arrList=Arrays.asList(1.2,2.3,3.4);//set方法可以使用,其他的两个里面的数据是常量不能修改
同样是集合,相比于List集合而言,Map集合是一个多列集合,数据的存储采用的是键值对的形式存储(
public static void main(String[] args) {
Map mapList = new HashMap<>();//初始化map映射关系
Set keySet=mapList.keySet(); //获取映射Key集合
mapList.put(1, "唐三");//put(key,value)
mapList.put(2, "小舞");
mapList.put(3, "冥王");
System.out.println("通过key删除映射:" + mapList.remove(2));//返回被删除元素的key
System.out.println("检测是否含有某个key:"+mapList.containsKey(2));//检测是否含有某个key
System.out.println("检测是否含有某个value:"+mapList.containsValue("冥王"));//检测是否含有某个value
System.out.println("测试getOrDefault()方法:"+mapList.getOrDefault(2,"notFound"));
//getOrDefault(key,default),拿着key在map映射里面去查找value,找到了返回value,没有找到则返回default
}
下面简单说一下map映射遍历的几种方式:
(1)借助keySet集合来实现对整个映射的遍历
for(Integer item:keySet){
System.out.println("输出map映射字段:"+item+","+mapList.get(item));
}
(2)通过静态方法mapList.values()直接得到所有的值,但注意这里得使用Collection,不能使用想ArrayList的类型,应为value本身来源于map对象,ArrayList属于List分支。
CollectionstrList=mapList.values(); for (String item:strList){ System.out.print(item+" "); }
(3)利用map.entry方法直接得到每条map映射结果
Set> entryList= mapList.entrySet(); for(Map.Entry item:entryList){ System.out.println("输出map映射的值:"+item.getKey()+","+ item.getValue()); }
最后为了整合上述所学内容,模仿视频写了一个斗地主的场景模拟代码,先给出思路:
(1)构建牌堆:利用map
(2)发牌:发的其实是mapKey;
(3)看牌:利用mapKey得到对应的牌value.
注意:本来洗牌也是一个难点,需要利用set的不重复实现,但是利用Collections里面的shuffle快速解决了。另外,对于牌的顺序问题,巧妙利用TreeSet解决了。其巧妙之处在于TreeSet能够进行自然排序,这种排序能够根据元素进入map映射的顺序自然排序,如果我们先利用3-2的顺序将这个牌写入映射,那么最后就能得到一个顺序牌堆了(补充说明一点,在写入的元素为两段的时候,就比如我们下面用的花色+牌,如果你把牌放在前面,那么花色就是首要排序依据,如果你把牌放在最前面那么牌就是首要排序依据)。
最后还是,贴上代码吧:
//展示拿到的牌(params:名字,手中的牌的mapKey,所有牌的 map映射) public static void show(String username,SetstrList,Map pokerList){ System.out.print("输出"+username+"的牌:"); for(Integer item:strList){ System.out.print(" "+pokerList.get(item)); } System.out.println(); } //初始化牌(params:所有牌的key,所有牌的 map映射) public static void initPoker(List keyList,Map pokerList){ List arrList1 = Arrays.asList("红", "黑", "梅", "方"); List arrList2 = Arrays.asList("3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A","2"); int index=0; for(String item1:arrList2){ for(String item2:arrList1){ index++; pokerList.put(index,item2+item1); keyList.add(index); } } index++; pokerList.put(index,"小王"); keyList.add(index); index++; pokerList.put(index,"大王"); keyList.add(index); Collections.shuffle(keyList); } //main函数 public static void main(String[] args) { Map pokerList = new HashMap<>(); List keyList=new ArrayList<>(); initPoker(keyList,pokerList); TreeSet ZhangSan=new TreeSet<>(); TreeSet LiSi=new TreeSet<>(); TreeSet WangWu=new TreeSet<>(); for(int i=0;i



