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);
        }
    }
}
相关推荐
逸Y 仙X7 分钟前
文章二十七:ElasticSearch ES查询模板(Search Template)高效复用实战
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
二哈赛车手21 分钟前
新人笔记---Spring AI的Advisor以及其底层机制讲解(涉及源码),包含一些遇见的Spring AI的Advisor缺陷问题的解决方案
java·人工智能·spring boot·笔记·spring
AC赳赳老秦26 分钟前
接口测试自动化:用 OpenClaw 对接 Postman,实现批量回归测试、测试报告自动生成与推送
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
两年半的个人练习生^_^26 分钟前
Java日志框架和使用、日志记录规范
java·开发语言·开发规范
pq2171 小时前
最简单的理解synchronized锁升级
java
杨凯凡1 小时前
【032】排查入门:jstack、heap dump、Arthas 初识
java·开发语言·后端
pq2171 小时前
Spring FactoryBean源码解析
java·spring boot·spring
其实防守也摸鱼1 小时前
无线网络安全--实验 规避WLAN验证之发现隐藏的SSID
java·开发语言·网络·安全·web安全·智能路由器·无线网络安全
书源丶2 小时前
四十三、网络编程(下)——TCP 编程与 HTTP 入门
java·网络·tcp/ip·http
木井巳2 小时前
【递归算法】单词搜索
java·算法·leetcode·决策树·深度优先