• java高级编程day23【谷】


    java高级编程day23

    泛型

    泛型的类和接口

    泛型保证了类型转化安全

    1.jdk5.0中新增的特有属性

    2.集合中使用泛型:

    总结:

    ① 集合接口或集合类在jdk5.0时都可以修改为带泛型的结构

    ② 在实例化集合类时,可以指明集体的泛型接口

    ③指明完之后,在集合类或接口中凡是定义类和接口时,内部结构(比如:方法、构造器、属性等)使用到类的位置,都指定为实例化的泛型类型

    ④ 注意点:泛型的类型必须是类,不能时基本数据类型。需要用到基本数据类型的位置,拿包装类替换

    ⑤如果实例化时,没有指定泛型的类型,默认类型就是java.lang.Object类型

    如果继承的父类为泛型,但是子类没有设定泛型的指定类型那么也为Object类型

    只有都为创建时这样:public A extend B这样子类也为泛型

    如果在继承父类时,确定了父类的泛型,那么子类的泛型就是父类指定的泛型类型

    泛型不同的引用不能相互赋值

    静态方法中不能使用类的泛型

    异常类是不能有泛型类的

    想要创建T泛型类型的数组

    不能直接创建,因为T是形参当我赋值后才会生效

    正确创建方法:T[] arr = (T[]) new Object[10];

    泛型可以部分保留

    泛型的方法

    在方法中出行了泛型结构,泛型参数与类的泛型参数没有任何关系

    泛型方法所属的泛型类是不是泛型类都没有关系

    泛型方法可以声明为静态方法,原因:泛型参数是在调用方法是确定的,并非类的实例化时确定的

    泛型在继承方面的使用

    类A是类B的父类,G和G不具备子父类关系,属性并列关系

    补充:A与B就存在字符类关系,体现在var泛型类可以证明

    通配符的使用

    通配符:?

    类A是类B的父类,G和G,二者没有关系(并列关系),二者共同的父类为G

    添加(写入):对于List就不能向其内部添加数据

    特例:可以添加null

    获取(读取):允许读取数据,读取数据的类型为Object类型

    有限制条件的通配符的使用

    ? extend Person

    类要小于等于Person类,也就是说,是Person类本身或者Person类的子类

    可以取值类型只能为Person类,或Person的父类,不能将Person的子类取值

    不赋值,因为父类无法给子类赋值,无法确定类是多小的子类

    ? super Person

    类要大于等于Person类,也就是说,是Person类本身或者Person类的父类

    可以取值,因为不知道父类多大,所以类型只能为Object类

    可以赋值将Person和子类都可以

    练习

    定义个泛型类DAO,在其中定义一个Map成员变量,Map的键 String类型,值为T类型。
    分别创建以下方法:
    public void save(String id,T entity):
    保存T类型的对象到Map成员变量中
    public T get(String id):从map中获取id对应的对象
    public void update(String id,T entity):替换map中key为id的内容改为entity对象
    public Listlist():返回map中存放的所有T对象
    public void delete(String id):删除指定id对象

    定义一个User类:
    该类包含:private成员变量(int类型)id,age;(String型)name。
    定义一个测试类:
    创建DAO类的对象,分别调用其save、get、update、Iist、delete方法来操作User对象

    DAO类

    public class DAO<T> {
        private Map<String, T> map;
    
        public DAO() {
            this.map = new HashMap<>();
        }
    
        public void save(String id, T entity) {
            map.put(id, entity);
        }
    
        public T get(String id) {
            return map.get(id);
        }
    
        public void update(String id, T entity) {
            if(map.containsKey(id)) {
                map.put(id, entity);
            }
        }
    
        public List<T> list() {
            List<T> list = new ArrayList<>();
            Iterator<String> iterator = map.keySet().iterator();
            while (iterator.hasNext()) {
                String next = iterator.next();
                T t = map.get(next);
                list.add(t);
            }
            return list;
        }
    
        public void delete(String id) {
            map.remove(id);
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (!(o instanceof DAO)) return false;
            DAO<?> dao = (DAO<?>) o;
            return Objects.equals(map, dao.map);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(map);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    User类

    public class User {
        private int id;
        private String name;
    
        public User(int id, String name) {
            this.id = id;
            this.name = name;
        }
    
        public User() {
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    UserTest类

    public class UserTest {
        public static void main(String[] args) {
            DAO<User> userDAO = new DAO<>();
            userDAO.save("1001",new User(1,"有道高"));
            userDAO.save("1002",new User(2,"有高道"));
            userDAO.save("1003",new User(3,"高有道"));
            userDAO.save("1004",new User(4,"有高高道"));
            List<User> list = userDAO.list();
            System.out.println(list);
            System.out.println("--------------");
            User user = userDAO.get("1001");
            System.out.println(user);
            System.out.println();
            userDAO.update("1002",new User(2,"刘晶晶"));
            userDAO.delete("1004");
            System.out.println(userDAO.list());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    IO流

    File类的使用

    1.File类的一个对象,代表一个文件或一个文件目录(文件夹)

    2.File类声明在java.io包下

    3.File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。
    4.后续File的对象常会作为参数传递到流的构造器中,指明读取或写入的"终点".

    如何创建File类的实例

    File(String filePath)

    File(String parentPath,String childPath)

    File(File parentFile,String childPath)

    绝对路径

    包含盘符在内的文件目录的路径

    想对路径

    相较于某个路径下,指明的路径

    路径分隔符

    windows和DOS:\\

    UNIX:/

    常用方法

    获取

    public String getAbsolutePath():获取绝对路径
    public string getPath():获取路径
    public string getName():获取名称
    public String getParent():获取上层文件目录路径。若无,返回null
    public Long Length():获取文件长度(即:字节数)。不能获取目录的长度。
    public Long LastModified():获取最后-次的修改时,毫秒值
    public string[] list():获取指定目录下的所有文件或者文件目录的名称数组
    public File[] listFiles():获取指定目录下的所有文件或者文件目录的File数组

    public boolean renameTo(File dest):把文件重命名为指定的文件路径
    比如:file1.renameTo(file2)为例:
    要想保证返回true,需要于file1在硬盘中是存在的,且file2不能在硬盘中存在。

    判断

    public boolean isDirectory():判断是否是文件目灵
    public boolean isFile():判断是否是文件
    public boolean exists():判断是否存在
    public boolean canRead():判断是否可读
    public boolean canwrite():判断是否可写
    public boolean isHidden():判断是否隐藏

    创建

    创建硬盘中对应的文件或文件目录
    public boolean createNewFile():创建文件。若文件存在,刚不创建,返回false
    pablic boolean mkdir():创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不会创建
    public boolean mkdirs():创建文件目录。如果此文件目录存在,就不创建了。如果上层文件目录不存在,会将上层目录一同创建

    删除

    删除磁盘中的文件或文件目录
    public boolean delete():删除文件或者文件夹
    删除注意事项:
    Java中的删除不走回收站。

    练习

    1.利用File构造器,new一个文件目录file
    1)在其中创建多个文件和目录
    2)编写方法,实现删除file中指定文件的操作
    2.判断指定目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
    3.遍历指定目录所有文件名称,包括子文件目录中的文件。
    拓展1:并计算指定目录占用空间的大小
    拓展2:删除指定文件目录及其下的所有文件

  • 相关阅读:
    【踩坑专栏】 Could not write JSON: No serializer found for class
    [附源码]Python计算机毕业设计Django茂名特产销售商城网站
    Docker Compose使用
    LOCK接口
    一个人 三个月 干了二十万
    【重温基础算法】内部排序之堆排序法
    PHP转Go,框架选什么?
    B+ 树的简单认识
    DAY06_瑞吉外卖——用户地址簿功能&菜品展示&购物车&下单
    凌特杯,第二届,数字音频传输。simulink matlab
  • 原文地址:https://blog.csdn.net/m0_47711130/article/details/126130836