day32 泛型 数据结构 List

一、泛型

概述

JDK1.5同时推出了两个和集合相关的特性:增强for循环,泛型

泛型可以修饰泛型类中的属性,方法返回值,方法参数, 构造函数的参数

Java提供的泛型类/接口

  • Collection, List, Set,Iterator 等

自定义的泛型

public class Student <H,W>{}
自定义的泛型方法

public static <T> void showList(List<T> list){

//list.forEach(s-> System.out.println(s));

for (T t : list) {

System.out.println(t);

}

}

泛型的通配符

T: type(表示Java类型 类型)

E: Element(主要在List中使用 元素)

K: key(主要在Map集合中使用,表示键)

V: value(主要在Map集合中使用,表示值)

?: 表示不确定类型的Java类型

泛型的边界

  • 泛型的上界

    • 语法:? extends 类型

    • 位置:类上,方法参数

  • 泛型的下界

    • 语法:? super 类型

    • 位置: 方法参数

java 复制代码
/**
 * 泛型的上界和下界
 *
 * ? 是泛型的通配符,不知道用什么类型的时候用?
 * 泛型上界语法: ? extends 类
 * 泛型下界语法: ? super  类
 *
 */
public class GenericityTest {
    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>();
        List<String> list2 = new ArrayList<>();
        List<Number> list3 = new ArrayList<>();
        List<Object> list4 = new ArrayList<>();

        ShowCollection sc = new ShowCollection();
        sc.showList1(list1);
        //sc.showList1(list2); 编译不通过,因为String不是Number的子类
        sc.showList1(list3);
       // sc.showList1(list4);  编译不通过,Object不是 Number的子类

       // sc.showList2(list1);  //编译不通过,因为Integer不是Number的父类
      //  sc.showList2(list2);  //编译不通过,因为String不是Number的父类
        sc.showList2(list3);   //最小不能低于Number.此处是Number
        sc.showList2(list4);   //编译通过,Object是Number的父类
    }
}

class ShowCollection{
    //泛型的上界
    public  void showList1(List<? extends Number>list){}

    //泛型的下界
    public  void showList2(List<? super Number> list){}
}

二、数据结构

  1. 数据结构概述
  • 数据结构式计算机底层存储、组织数据的方式,是值数据与数据之间以什么样的方式排列在一起

  • 选择合适和数据结构可以带来更搞笑的运行或者存储效率

  1. 常见的数据结构
  • 栈

  • 队列

  • 链表

  • 数组

  • ...

  1. 栈数据结构的执行特点
  • 后进先出,先进后出

  • 入栈/压栈: 数据进入栈的过程

  • 出栈/弹栈:数据离开栈的过程

  1. 队列
  • 先进先出,后进后出

  • 入队列:数据从队列后端进入队列的过程

  • 出队列:数据从队列前端离开对列的过程

  1. 数组
  • 数组是一种查询快,增删慢的数据结构

  • 数组在内存中是一块连续的存储空间

  1. 链表
  • 链表中的元素在内存中是不连续存储的(游离),每个元素节点都包含数据值和下一个元素的地址

  • 链表查询慢,增删快,首尾操作极快

三、List

java 复制代码
java.util.List接口,通常称为:线性表
 * List继承自Collection,特点是可以存放重复的元素并且有序
 *
 * 常用的实现类
 * java.util.ArrayList:内部用数组实现,查询性能好
 * java.util.LinkedList:内部使用链表实现,增删性能好,首尾增删性能最好
 * 在对集合操作性能没有特殊要求的条件下通常使用ArrayList
 */
public class ListDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("one");
        list.add("two");
        list.add("three");
        list.add("four");
        list.add("five");

        /**
         *  E get(int index)  返回列表中指定位置的元素。
         */
        //获取集合中下标是3个元素
        System.out.println(list.get(3));
        //用for循环遍历集合
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

        /**
         *  E set(int index, E element)
         *           用指定元素替换列表中指定位置的元素(可选操作)。
         *           返回值是被替换掉的元素。
         */
        String str = list.set(1, "二");

        System.out.println(str);
        System.out.println(list);

        //反转集合
        for(int i=0;i<list.size()/2;i++){
            //获取i上的元素
            String e = list.get(i);
            String s = list.set(list.size()-1-i,e);
            list.set(i,s);
        }
        System.out.println(list);

        System.out.println("==============================");
        /**
         * Collections类中提供了静态方法
             static void reverse(List<?> list)
             反转指定列表中元素的顺序。
         */
        Collections.reverse(list);
        System.out.println(list);

    }
}

三点五、作业练习

java 复制代码
/**
 * 泛型:
 * 泛型只是在编译期有效,在编译之后程序会采取去繁星花的措施。将泛型相关的信息擦除
 *
 */
public class CollectionDemo3 {
    public static void main(String[] args) {
        List<String> strs = new ArrayList<>();

        List<Integer> ints = new ArrayList<>();

        Class aClass = strs.getClass();
        Class bClass = ints.getClass();
        System.out.println(aClass);
        System.out.println(bClass);


//        if(strs.equals(ints)){
//            System.out.println("类型一致");
//        }else{
//            System.out.println("类型不一致");
//        }

    }
}
java 复制代码
/**
 * 自定义泛型方法测试
 */
public class ShowListTest {
    public static void main(String[] args) {



        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        //ShowList.showInt(list);
       ShowList.showList(list);

        List<String> strs = new ArrayList<>();
        strs.add("一");
        strs.add("二");
        strs.add("三");
        strs.add("四");
        strs.add("五");
       ShowList.showList(strs);

        List<Teacher> teas = new ArrayList<>();
        teas.add(new Teacher("张老师",1500));
        teas.add(new Teacher("李老师",2500));
        teas.add(new Teacher("孙老师",9500));
        teas.add(new Teacher("赵老师",3500));
        ShowList.showList(teas);
    }


     public static <T>  void showList(List<T> list){
        //list.forEach(s-> System.out.println(s));
        for (T t : list) {
            System.out.println(t);
        }
    }
}
相关推荐
SL_staff3 分钟前
制造业订单交付崩盘?用四层协同框架重建交付可信度(技术实践)
java·产品·全栈
SL_staff1 小时前
打破风控迭代死循环:用决策编排重构业务与技术协作链路
java·产品·全栈
Mikko71 小时前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端
.Bryce.2 小时前
从零到一开发技术名词大全:从需求分析到 AI Agent 工程
java·网络·人工智能·agent·需求分析·agent评测
SL_staff2 小时前
JVS-APS的7个刚性约束设计:从无限产能幻觉到可执行排产的工程实践
java·spring cloud·全栈
代码山河3 小时前
基本类型转换:自动类型转换与强制类型转换
java·学习·架构·教程·面向对象·项目
Escalating_xu4 小时前
【Linux 网络编程】五种 I/O 模型与非阻塞 I/O:从“等数据”到正确处理 EAGAIN
java·linux·网络
程序猿乐锅5 小时前
万字详解Single-flight(单飞模式)
java·开发语言·分布式·后端·学习·single-flight
Java后端的Ai之路5 小时前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli
AntsData5 小时前
用 12K+ 条亚马逊评论信号,定位机械键盘下一版该改什么
java·大数据·计算机外设