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);
        }
    }
}
相关推荐
JAVA面经实录91744 分钟前
MyBatis学习体系
java·mybatis
java1234_小锋1 小时前
在 Spring AI 中如何实现函数调用(Function Calling)?请说明其基本原理和应用场景。
java·人工智能·spring
小马爱打代码1 小时前
Spring源码 第九篇:Spring 5 源码深度拆解 - Spring 事件驱动模型
java·后端·spring
ForgeAI码匠2 小时前
ForgeAdmin|Spring Boot 3 后台框架的自动配置设计:少写配置,多做组合
java·spring boot·后端
tongluowan0072 小时前
Redisson的参数及工作原理
java·redis·lua·分布式锁
仙俊红3 小时前
Integer\int对比,equals()\hashcode面试
java·面试·职场和发展
WiChP3 小时前
【V0.1B10】从零开始的2D游戏引擎开发之路
java·数据库·游戏引擎
云烟成雨TD3 小时前
Spring AI Alibaba 1.x 系列【60】检查点机制原理与全流程剖析
java·人工智能·spring
ForgeAI码匠3 小时前
Maven 多模块项目如何避免越写越乱?Forge Admin 的模块边界实践
java·人工智能·开源·maven
z落落3 小时前
C# 数组 最终完整版全套笔记(一维+多维+交错+引用类型+对象数组)
java·笔记·c#