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);
        }
    }
}
相关推荐
计算机毕设指导67 分钟前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
Gu Gu Study8 分钟前
枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~
java·开发语言
Chris _data11 分钟前
二叉树oj题解析
java·数据结构
牙牙70516 分钟前
Centos7安装Jenkins脚本一键部署
java·servlet·jenkins
paopaokaka_luck24 分钟前
[371]基于springboot的高校实习管理系统
java·spring boot·后端
以后不吃煲仔饭36 分钟前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师37 分钟前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
The_Ticker43 分钟前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
大数据编程之光1 小时前
Flink Standalone集群模式安装部署全攻略
java·大数据·开发语言·面试·flink
爪哇学长1 小时前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法