栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java入门笔记(五)—— 泛型与Java的多列集合

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java入门笔记(五)—— 泛型与Java的多列集合

泛型与Java的多列集合 1.泛型的基本使用

​ 泛型是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 interface1 {
    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));
2.类型通配符

为了对泛型对应的类型作出一定的限制便出现了类型的通配符概念,其基本使用方法如下:

//通配符(可以设置成任意类型)
List arrList=new ArrayList();
//设置通配符上限
List arrList2=new ArrayList();
//设置通配符下限
List arrList3=new ArrayList();
//通配符在继承中的使用
List arrList4=new ArrayList();
 
3.可变参数 
//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(可变类型是不能实现的)。

补充说明一个知识点——集合静态方法中的不可变集合

//通常可变参数对应的不可变集合有如下三种写法,对应一个共同特点,一开始元素的个数是可变的,单数被初始化之后就不能再增加或者删除元素了,也就是还原了原始数组的那种形式。
List strList=List.of("Hangman","Lisi","Wangwu");
Set intList=Set.of(1,2,3);//给元素不能重复
List arrList=Arrays.asList(1.2,2.3,3.4);//set方法可以使用,其他的两个里面的数据是常量不能修改
4.Map集合

​ 同样是集合,相比于List集合而言,Map集合是一个多列集合,数据的存储采用的是键值对的形式存储(),并且其中的key唯一,如果存入的键值对中存在与之前相同的键,那么之后的value值将会替换之前相同key对应的value值,一个key最多对应一个value。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分支。

Collection strList=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形式记录所有的牌,洗牌利用的是Collections里面的shuffle方法,另外还有sort和reverse等方法;
(2)发牌:发的其实是mapKey;
(3)看牌:利用mapKey得到对应的牌value.
注意:本来洗牌也是一个难点,需要利用set的不重复实现,但是利用Collections里面的shuffle快速解决了。另外,对于牌的顺序问题,巧妙利用TreeSet解决了。其巧妙之处在于TreeSet能够进行自然排序,这种排序能够根据元素进入map映射的顺序自然排序,如果我们先利用3-2的顺序将这个牌写入映射,那么最后就能得到一个顺序牌堆了(补充说明一点,在写入的元素为两段的时候,就比如我们下面用的花色+牌,如果你把牌放在前面,那么花色就是首要排序依据,如果你把牌放在最前面那么牌就是首要排序依据)。
最后还是,贴上代码吧:

//展示拿到的牌(params:名字,手中的牌的mapKey,所有牌的 map映射)
public static void show(String username,Set strList,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

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号