JAVA中的泛型、file类、IO流

泛型

什么是:

  • 1、定义时通过一个标识,表示类型;
  • 2、Jdk5.0之后添加的

没有会造成的问题:

  • 1、类型不安全;

  • 2、强制转换比较繁琐;

  • 1、E: list中使用;用指定的类型去替换E;

  • 2、Map中使用;

public class GenericityTest {
    @org.junit.Test
    public void test1(){
        List list = new ArrayList();
        list.add(1);
        /* 类型不安全,转换异常 */
        list.add("a");
    }

    @Test
    public void test2(){
        ArrayList<Integer> integers = new ArrayList<>();

        integers.add(1);
        /* 指定类型后,只能添加Integer类型 */
    }

    @Test
    public void test3(){
        //HashMap<String, Integer> map = new HashMap<String, Integer>();
        HashMap<String, Integer> map = new HashMap<>(); //jdk7类型推断;

        map.put("Tom", 1);
        map.put("Jack", 2);

        Set<Map.Entry<String, Integer>> entries = map.entrySet();
//        var entries = map.entrySet(); //10 => 1.10 之后的版本;
        Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
        while (iterator.hasNext()){
            Map.Entry<String, Integer> entry = iterator.next();
            String key = entry.getKey();
            Integer value = entry.getValue();

            System.out.println(key + " === >" + value);
        }
    }
    @Test
    public void test4(){
        TreeSet<String> strs = new TreeSet<>();
    }
}
/** 
 * @Discrition 没有类型标识,不是泛型类;
 */
public class Son extends Person{
    public Son() {
    }

    public Son(Object o, int orderId) {
        super(o, orderId);
    }

    public Son(Object o) {
        super(o);
    }

}
/** 
 * @Discrition  没有不确定的类型,不是泛型类
 */
public class Son2 extends Person<String>{
}
/** 
 * @Discrition  继承父类的Type;延续类型;
 */
public class Son3<T> extends Person<T>{
    public void show(T t){
        System.out.println(t);
    }
}
/**
 * @Date 2023/8/8 10:47
 * @Discrition  类型不同的泛型类;
 *  父类被指定后,构造器中的父类类型也就确定了;
 */
public class Son4<E> extends Person<String> {
    E e;

    public Son4(E e) {
        this.e = e;
    }

    public Son4(String s, int orderId, E e) {
        super(s, orderId);
        this.e = e;
    }

    public Son4(String s, E e) {
        super(s);
        this.e = e;
    }
    /* 这个不是泛型方法 */
    public E getE() {
        return e;
    }
    /* 这个是泛型方法 */
    public <E> E method(E e){
        return null;
    }
    public <E> ArrayList<E> method2(E[] arr) {
        for(E e: arr){

        }
        return null;
    }
}

方法泛型

  • 1、自定义泛型类、接口
    • (1)格式:
      • ①Class A{}
      • ②Interface B{}
  • 2、自定义泛型方法;
    • (1)泛型指定时不可以使用基本数据类型,可以使用包装类
    • (2)指明泛型类型后,则在泛型类中。
    • (3)凡是使用泛型的位置,都需要替换为指定的泛型类型
  • 3、继承:
    • (1)继承后的子类如果,不添加泛型标识。则子类不是泛型类;
    • (2)子类继承泛型父类时,可以指定父类的类型;Son2.java;
  • 4、说明
    • (1)如果不指明类型,则默认为Object接收。但是不等价于Object;
    • (2)开发中,如果使用就一路用下去;
    • (3)静态方法中不能使用泛型;不能声明静态泛型属性;异常类不能带泛型;
    • (4)

Comparable接口,每个对象的比较方法都是实现的这个接口;

!!声明类

public class Person<T> {
    T t;    //不确定的类型;
    int i;
    Person(){

    }
    Person(T t, int orderId){

    }

    public Person(T t) {
        this.t = t;
    }

    public void setT(T t) {
        this.t = t;
    }

    public void setI(int i) {
        this.i = i;
    }

    public T getT() {
        return t;
    }

    public int getI() {
        return i;
    }

    @Override
    public String toString() {
        return "Person{" +
                "t=" + t +
                ", i=" + i +
                '}';
    }
}

泛型方法:

  • 1、publi E method(E e) {}
  • 2、 泛型方法标识:用于在类型声明泛型;
  • 3、在方法调用时,指定类型;
  • 4、可以声明成静态的;因为是调用方法的时候才指定的类型;

场景:

  • 1、DAO类;数据库访问对象;
  • 2、内部封装了数据库内部表的增删改查操作;
  • 3、(增删改查)CRUD

数据库中的表设计ORM思想;

通配符的使用:

  • 1、符号:“?”
  • 2、GenericTest3.java
public class GenericTest3 {
    @Test
    public void test1() {
        /* 通配符,不限制格式 */
        List<?> list = null;
        List<String> list1 = null;
        List<Integer> list2 = null;
        list = list1;
        list = list2;
        /* 通配符 */
        method(list1);
        method(list2);
    }

    public void method(List<?> list) {

    }

    @Test
    public void test2() {
        /* 获取值 */
        List<?> list = null;
        List<String> list1 = new ArrayList<>();
        list1.add("aa");

        list = list1;
        /* 确定的类型,可以进行强转 */
        String str = (String) list.get(0);
        System.out.println(str);
        /* 使用Object替代?,不确定的类型肯定是Object的子类 */
        Object str2 = list.get(0);
        System.out.println(str2);

        /* 带通配符的不能写入,无法确定类型 */
        //list.add(""); //对于add(java.lang.String), 找不到合适的方法

        /* 有个特例null */
        list.add(null);
        // 对于引用类型,有一个共同的值 null;
    }

    /* 有限制条件的通配符的使用 */
    @Test
    public void test4(){
        /**
         * ? extends A;
         * 可以理解为小于等于;
         * ? 通配符只能标识A类或者A的子类;不能标识其父类;
         */
        List<? extends Person> list = null;

        List<Person> list1 = null;
        List<Son4> list2 = null;
        List<Object> list3 = null;

        list = list1;
        list = list2;
        //list = list3;
    }
    @Test
    public void test5(){
        /**
         * ? super A;
         * 可以理解为大于等于;
         * ? 通配符只能标识A类或者A的父类;不能标识其子类;
         */
        List<? super Person> list = null;

        List<Person> list1 = null;
        List<Son4> list2 = null;
        List<Object> list3 = null;

        list = list1;
        //list = list2;
        list = list3;
    }
    /* 测试通配符的读写 */
    @Test
    public void test6(){
        List<? extends Person> list = null;
        //(-∞, A] //没有下界,不能添加任何;
        List<Person> list1 = new ArrayList<>();
        list1.add(new Person());

        list = list1;
        /* 可以读取 */
        Person person = list.get(0);
        System.out.println(person);

        /* 写入数据 */
        list.add(null);
        //list.add(new Person<>());
        // 除了null之外不可以添加;
    }
    @Test
    public void test7(){
        List<? super Person> list = null;
        // [A, +∞) //有下界限;没有上界,子类都可以写入;
        List<Person> list1 = new ArrayList<>();
        list1.add(new Person());

        list = list1;
        /* 可以读取  */
        Object person = list.get(0);    //只能使用object来接收;
        System.out.println(person);

        /* 写入数据 */
        list.add(null);
        list.add(new Person<>());
        //list.add(new Object());     //
        list.add(new Son());
    }
}
  • 3、获取数据: test2;需要使用Object接收;
  • 4、写入数据: 通配符的不可以写入,(null除外)

泛型方法的标识,写在返回值类型的前面;(有可能返回值类型=也是泛型,不能搞混)

有限制条件的通配符:

  • 1、? Extends E ;相当于小于等于;?只能表示当前类,或者其子类通配符;
  • 2、? Super E ;相当于大于等于;只能表示其本类或者父类的通配符;
  • 3、GenericTest3.java中
  • 4、

通配符读写能力

  • 1、测试通配符的读写 代码:GenericTest3, => test6/7;
  • 2、小技巧,直接往里写;让编译器给出提示;
  • 3、extends
    • (1)(-∞, A] //没有下界,不能添加任何;
    • (2)除了null之外不可以添加;
  • 4、super
    • (1)[A, +∞) //有下界限;没有上界,子类都可以写入;
public class GenericTest2 {
    @Test
    public void test1(){
        /* 多态 */
        Object obj = null;
        String str = "";
        obj = str;
        /* 多态 */
        Object[] obj2 = null;
        String[] str2 = null;
        obj2 = str2;


    }
    @Test
    public void test2(){
        ArrayList<Object> list = new ArrayList<>();
        ArrayList<String> str = new ArrayList<>();
        /* 泛型不可以 */
        //list = str;
    }
    @Test
    public void test3(){
        Person<String> str = null;
        Person<Integer> i = null;
        /* 泛型不可以 */
        //str = i;
    }
    @Test
    public void test4(){
        Person<String> str = null;
        Person<String> str2 = null;
        str = str2;
    }
}

File类

Java.io.file

Java.io.xxx;**

FILE

  • 1、文件或文件目录
  • 2、实例
    • (1) 绝对路径
      • ①// 可以使用双斜杠 “\” 或者反斜杠“/”;
      • ②File file1 = new File(“E:\E\javanote\test\project\file_io_2023815103542\src\main/hello.txt”);
    • (2)相对路径
    • (3)代码见FileTest.java;
public class FileTest {
    @Test
    public void test1(){
        /* 绝对路径 */
        // 可以使用双斜杠 \\ 或者反斜杠/
        File file1 = new File("E:\\E\\javanote\\test\\project\\file_io_2023815103542\\src\\main/hello.txt");
        System.out.println(file1.getAbsoluteFile());
        /* 相对路径,使用junit和mian指向的路径是不一样的 */
        File file2 = new File("src");   //指定的是文件目录;
        System.out.println(file2.getAbsoluteFile());
    }
    @Test
    public void test2(){
        /* 路径下创建子文件或子文件目录 */
        File file1 = new File("E:\\E\\javanote\\test\\project\\file_io_2023815103542\\src\\main", "hello2.txt");
        System.out.println(file1.getAbsoluteFile());
        /* 参数2可可以是一个文件或者一个目录 */
        File hello2 = new File("src\\main", "hello3");
        /* 可以根据一个file类或者路径创建子 */
        File hello4 = new File(hello2, "hello4");
    }
}
  • 3、方法
    • (1)见代码FileMethod.java
public class FileMethod1 {
    @Test
    public void test1(){
        /* 文件方法 */
        File file1 = new File("abc.txt");
        System.out.println(file1.getName());
        System.out.println(file1.getPath());
        System.out.println(file1.getAbsoluteFile());
        System.out.println(file1.getAbsolutePath());
        System.out.println(file1.getParent());
        System.out.println(file1.getAbsoluteFile().getParent());
        System.out.println(file1.length());
        System.out.println(file1.lastModified());
        /* 此时文件还不存在,手动在路径中创建文件后可见多属性 */
    }

    @Test
    public void test2(){
        /* 路径方式 */
        File file2 = new File("src");
        System.out.println(file2.getName());
        System.out.println(file2.getPath());
        System.out.println(file2.getAbsoluteFile());
        System.out.println(file2.getAbsolutePath());
        System.out.println(file2.getParent());
        System.out.println(file2.getAbsoluteFile().getParent());
        System.out.println(file2.length()); //文件目录的方法这个获取不到;
        System.out.println(file2.lastModified());
    }
    @Test
    public void test3(){
        /* 目录的下一级 */
        File file1 = new File("src");
        /* 下一级的目录 */
        String[] list = file1.list();
        for(String str: list) {
            System.out.println(str);
        }
        System.out.println("====");
        /* 下一级的文件 */
        File[] files = file1.listFiles();
        for (File file : files) {
            System.out.println(file);
        }

    }
    @Test
    public void test4(){
        /* 重命名 */
        File file1 = new File("abc.txt");
        File file2 = new File("abc2.txt");

        /* rename的条件:file1存在,file2不存在;file2所在的目录要存在 */
        boolean bool = file1.renameTo(file2);
        System.out.println(bool);
    }

    @Test
    public void test5(){
        /* 判断方法 */
//        File file1 = new File("abc2.txt");
        File file1 = new File("src");
        System.out.println(file1.exists());
        System.out.println(file1.isDirectory());
        System.out.println(file1.isFile());
        System.out.println(file1.canRead());
        System.out.println(file1.canExecute());
        System.out.println(file1.canWrite());
        System.out.println(file1.isHidden());
    }

    @Test
    public void test6() throws IOException {
        /* 创建删除文件 */
        // 删除不会进入回收站;
        // 删除目录,目录内必须为空;
        File file1 = new File("abcc.txt");
        if(!file1.exists()) {
            boolean iSSucceed = file1.createNewFile();
            if(iSSucceed){
                System.out.println("创建成功");
            } else {
                System.out.println("创建失败");
            }
        }else {
            System.out.println("文件已存在");

            boolean isDeleted = file1.delete();
            if(isDeleted){
                System.out.println("文件删除成功");
            }else {
                System.out.println("文件删除失败");
            }
        }
    }

    @Test
    public void test7(){
        /* 目录操作 */
        File file = new File("src\\test1"); //指定需要创建的目录
        File file2 = new File("src\\test2");



        boolean isSucceed = file.mkdir();
        System.out.println(isSucceed);
        /* mkdir 和 mkdirs 创建一层时一模一样 */
        boolean isSucceed2 = file2.mkdirs();
        System.out.println(isSucceed2);
    }

    @Test
    public void test8(){
        /* mkdirs 创建时会创建多层目录 */
        File file1 = new File("src\\test3\\test4");
        file1.mkdirs();
        File file2 = new File("src\\test2");
        file2.delete();
    }
}

File 类通常作为io流的端点存在;

IO流

  • 字节流:
    • 1、InputStream
    • 2、OutputStream
  • 字符流:
    • 1、Reader
    • 2、Write

需要了解的类,都是基于以上四个抽象基类;

使用

  • //涉及到的刘非常多,但是用法基本都是一样的;
  • FileWriter
  • 代码:FileWriterReader.java;
  • 一定要关闭操作;
  • (使用try-catch-finally确保一定会关闭)
import org.junit.Test;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * @Date 2023/8/15 14:35
 * @Discrition
 */
public class FileWriterReader {
    @Test
    public void test1() throws IOException {
        /* 创建文件对象 */
        File file = new File("reader.txt");
        /* 创建流 */
        FileReader reader1 = new FileReader(file);
        /* 读取的值是0-2的16次方 char类型*/
        int i = reader1.read();
        while (i > -1) {
            System.out.println(i);
            System.out.println((char) i);
            System.out.println("====");
            i = reader1.read();
        }
        reader1.close();

    }

    @Test
    public void test2() {
        /* 最好这样处理 */
        FileReader reader = null;
        try {
            /* 创建文件对象 */
            File file = new File("reader.txt");
            /* 创建流 */
            reader = new FileReader(file);
            /* 读取的值是0-2的16次方 */
            int i = reader.read();
            while (i > -1) {
                System.out.println(i);
                System.out.println((char) i);
                System.out.println("====");
                i = reader.read();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Test
    public void test3(){
        FileWriter writer = null;
        try {
            /* 写入流 */
            File file = new File("outPut.txt");
            /* 文件不在会自动生成文件,存在则覆盖之前的文件 */
//            writer = new FileWriter(file, false);
//            writer = new FileWriter(file); //默认就是false;

            /* 文件不在会自动生成文件,在现有的文件中追加内容 */
            writer = new FileWriter(file, true);

            writer.write(123);
            writer.write(12);
            writer.write("\n");
            writer.write("abc");
            writer.write("ab");
            writer.write("\n");
            writer.write("阿斯蒂芬");
            writer.write("\n");
            writer.write("阿斯蒂芬");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/602711.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

月薪从 6k 到 30k,我做对了这3点

本文首发于公众号 极客枫哥 &#xff0c;日更分享各种好玩的软件、编程知识和个人成长故事 大家好啊&#xff5e;我是枫哥。今天跟大家聊一聊我的个人工作经历。 我是 2014 年来的上海&#xff0c;来到上海后第一份工作做的是 java 开发&#xff0c;转正后的工资是 6000。 这…

中国 Copilot 能在笔记本电脑上起飞吗?

AI PC 是 PC 的下一个进化体&#xff1f; 中国能打造出自己的 AI 研发助手吗&#xff1f; 企业如何构建 AI 竞争力&#xff1f; AI 时代&#xff0c;个体如何避免被取代&#xff1f; 如果你也有此困惑&#xff0c;那就锁定这场直播吧&#xff01; 视频号搜索【极狐GitLab】预约…

Leecode42:接雨水

第一反应是按照高低这个思路来求解&#xff0c;因为可以把盛雨水的容器想成是从左往右的&#xff0c;遇到一个沟就存一点雨水。 这个思路 看了下题解&#xff0c;发现自己的思路其实没问题&#xff0c;确实是按照最高最低来求&#xff0c;但是这个地方太复杂了求的&#xff0c…

【spark】win10 pyspark3.5.1 安装超级简单

下载地址&#xff1a;https://spark.apache.org/downloads.html 下载完成&#xff1a; 复制文件到自己的路径下&#xff0c;路径最好不要有中文、空格&#xff1b; 解压tgz文件&#xff1a; 修改环境变量&#xff1a; 创建SPARK_HOME&#xff1a; D:\software_download\spar…

STM32F103学习笔记 | 报错界面及解决方案 | 1.keil5中文注释的横竖(正与斜)问题

文章目录 一、报错界面二、解决方案参考文献 一、报错界面 二、解决方案 打开设置 在打开的设置选项卡中&#xff0c;图中Font显示的是这个软件当前设置的字体&#xff0c;可以看到字体是仿宋&#xff0c;这就是问题出现的原因&#xff0c;将之改成没有的字体就行了。 可以看…

黑马点评项目总结

登录 基于session登录 短信验证码登录 配置登录拦截器 向 Spring MVC 框架中添加拦截器&#xff0c;LoginInterceptor 是一个自定义的拦截器&#xff0c;用于拦截用户的登录请求。 excludePathPatterns这一句是设置拦截器需要放行的请求路径列表。 "/user/code", …

【Linux】常用基本指令

目录 食用说明 用户管理 whoami/who clear tree 目录结构和路径 pwd ls 文件 隐藏文件 常用选项 cd 家目录、根目录、绝对路径和相对路径 touch 常用选项 mkdir rmdir/rm man cp mv cat nano echo 输出重定向 > 输入重定向 < more/less head/…

选修选课|基于Springboot+vue的大学生选修选课系统的设计与实现(源码+数据库+文档)

大学生选修选课系统 目录 基于Springboot&#xff0b;vue的大学生选修选课系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1用户信息管理 2 课程信息管理 3排课信息管理 4公告信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题…

【数据库原理及应用】期末复习汇总高校期末真题试卷06

试卷 一、选择题 1&#xff0e; ________是长期存储在计算机内的有组织,可共享的数据集合. A.数据库管理系统 B.数据库系统 C.数据库 D.文件组织 1&#xff0e; 有12个实体类型&#xff0c;并且它们之间存在15个不同的二元联系&#xff0c;其中4个是1:1联系类型&#xff0c;5…

二、双fifo流水线操作——verilog练习与设计

文章目录 一、案例分析二、fifo_ctrl模块设计2.1 波形设计&#xff1a;2.2 代码实现2.2.1 fifo_ctrl2.2.2 顶层文件top_fifo_ctrl&#xff08;rx和tx模块省略&#xff09;2.2.3 仿真文件tb_fifo_ctrl 2.3波形仿真 一、案例分析 案例要求&#xff1a;写一个 fifo 控制器&#x…

直播产品实习生实习体验报告,笔灵AI生成模版分享

实习体验报告&#xff1a;直播产品实习生 如果有不同的岗位需要写的话可以去笔灵生成一下 网址&#xff1a;https://ibiling.cn/scene/inex?fromcsdnsx 一、实习背景我是XXX&#xff0c;作为一名直播产品实习生&#xff0c;我在XX公司进行了为期X个月的实习。在这段时间里&…

Bumblebee X系列用于高精度机器人应用的新型立体视觉产品

Bumblebee X是最新的GigE驱动立体成像解决方案&#xff0c;为机器人引导和拾取应用带来高精度和低延迟。 近日&#xff0c;51camera的合作伙伴Teledyne FLIR IIS推出一款用于高精度机器人应用的新型立体视觉产品Bumblebee X系列。 Bumblebee X产品图 BumblebeeX系列&#xff…

使用C++ __builtin_expect优化程序性能后,程序体积不改变原因

结论 使用__builtin_expect优化程序性能&#xff0c;开启-O3的情况下&#xff0c;确实程序的体积可能不改变&#xff0c;但是还是会产生优化效果。 测试代码 不使用__builtin_expect #include <iostream>void fun(int a, int b) {// 不使用__builtin_expectif (a <…

poisson分布及其stata实现

1. 概念 泊松回归&#xff08;Poisson regression&#xff09;是用来为计数资料和列联表建模的一种回归分析。泊松回归假设反应变量Y是泊松分布&#xff0c;并假设它期望值的对数可被未知参数的线性组合建模。泊松回归模型有时&#xff08;特别是当用作列联表模型时&#xff0…

libcity笔记:详细流程(以DeepMove为例)

0 前置操作 这边我选择了gowalla的前1000条数据做例子&#xff1a; 0.1 生成样例dyna import pandas as pd geopd.read_csv(/home_nfs/liushuai/Bigscity-LibCity/raw_data/gowalla_test/gowalla.dyna)geo_tstgeo.iloc[:1000,:] geo_tst geo_tst.to_csv(/home_nfs/liushuai/…

电脑小工具总结(下载哔哩哔哩视频等)

哔哩哔哩视频下载器 https://www.jijidown.com/

HFSS-day3-HFSS的工作界面

工作界面也称为用户界面&#xff0c;是HFSS软件使用者的工作环境:了解、熟悉这个工作环境是掌握HFSS软件使用的第一步 HFSS工作环境介绍 1.HFSS工作界面简单的组成说明2.工作界面中各个工作窗口功能主菜单工具栏项目管理窗口属性窗口信息管理窗口进程窗口三维模型窗口 3.HFSS主…

【ITK配准】第七期 尺度(Metric)- 均方Metric

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享ITK中的均方Metric,即itk::MeanSquaresImageToImageMetricv4,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力…

学完 C++ 基本语法后,您就可以开始学习 Qt 了。

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Qt的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;这些基本语法包括变量、类型、循环、判断、指针…

【编译器识别】2024深圳杯C题24页参考论文+1-3小问完整解题代码

一、问题研究 【编译器识别】2024深圳杯C题24页参考论文1-3小问完整解题代码https://www.jdmm.cc/file/2710545/ 为了回答这些问题&#xff0c;我们需要进行一系列的编译实验、分析编译结果&#xff0c;并构建判别函数。以下是对这些问题的初步分析和可能的方法&#xff1a; …
最新文章