• 15.泛型、File文件


    package com.atguigu.java1;
    import org.junit.Test;
    import java.util.*;
    
    /*
    泛型的使用:
       1.jdk5.0新增的特性
    
       2.在集合中使用泛型:
       总结:①集合接口或集合类在jdk5.0都修改为带泛型的结构
            ②在实例化集合类时,可以指明泛型的类型
            ③指明完以后,在集合类或接口中凡是定义类或接口时,内部结构使用到类的泛型的位置,都指定为实例化时的泛型类型
            ④泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,用包装类替换
            ⑤实例化时,没有指明泛型的类型,默认为Object类型
     */
    public class GenericTest {
        //在集合中使用泛型之前的情况
        @Test
        public void test1(){
            ArrayList list = new ArrayList();
            //需求:存放学生的成绩
            list.add(78);
            list.add(68);
            list.add(89);
            list.add(88);
            //问题一:类型不安全
            list.add("Tom");
            for(Object obj :list){
                //问题二:强转时,可能出现ClassCastException
                int student = (int)obj;
                System.out.println(student);
            }
        }
        //在集合中使用泛型的情况
        @Test
        public void test2(){
            ArrayList<Integer> list = new ArrayList<Integer>();
            list.add(78);
            list.add(68);
            list.add(89);
            list.add(88);
            //list.add("Tom"); 编译时,就会进行类型检查,保证数据的安全
            for (Integer score :list) {
                //避免了强转操作
                int students = score;
                System.out.println(students);
            }
        }
        //在集合中使用泛型的情况--Map为例
        @Test
        public void test3(){
            HashMap<String, Integer> map = new HashMap<>();
            map.put("Tom",23);
            map.put("Jerry",24);
            //泛型的嵌套
            Set<Map.Entry<String, Integer>> entry = map.entrySet();
            Iterator<Map.Entry<String, Integer>> iterator = entry.iterator();
            while(iterator.hasNext()){
                Map.Entry<String, Integer> next = iterator.next();
                String key = next.getKey();
                Integer value = next.getValue();
                System.out.println(key + "-->"+value);//Tom-->23 Jerry-->24
            }
        }
    }
    package com.atguigu.java1;
    /*
      自定义泛型
      1.如何自定义泛型结构:泛型类、泛型接口、泛型方法
     */
    public class Order<T> {
        String orderName;
        int orderId;
        T orderT;
        public Order(){
    
        }
        public Order(String orderName,int orderId,T orderT){
            this.orderId = orderId;
            this.orderName = orderName;
            this.orderT = orderT;
        }
        public T getOrderT(){
            return orderT;
        }
        public void setOrderT(T orderT){
            this.orderT = orderT;
        }
    }
    package com.atguigu.java1;
    
    import org.junit.Test;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    /*
    自定义泛型、泛型类、泛型接口、泛型方法
     1/泛型方法:在方法中出现了泛型的结构,泛型参数与类的泛型参数无关(即,泛型方法所属的类是不是泛型都无关)
       public (static)<E> List<E> copyFromArrayToList(E[] arr){}
       泛型方法可以声明为静态的,泛型参数是在调用方法时确定的,而非在实例化类时,确认的
     */
    public class GenericTest1 {
        @Test
        public void test1(){
            Order order = new Order();
            //如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型的类型为Object类型
            //如果定义了类是带泛型的,建议在实例化时指明泛型的类型
            //如果子类在继承带泛型的父类时,指明了泛型的类型,则子类对象的实例化时,不在需要指明泛型
    
            order.setOrderT(123);
            order.setOrderT("abc");
            System.out.println(order.getOrderT());
    
            Order<String> order1 = new Order<>();
            order1.setOrderT("abcd");
        }
        /*
        泛型在继承方面的体现
           虽然类A是类B的父类,但是G<A>和G<B> 二者不具备子父类关系而是并列关系
    
           类A是类B的父类,A<G>是B<G>父类
         */
        @Test
        public void test2(){
            List<Object> list1 = null;
            List<String> list2 = null;
            //此时的list1和list2的类型不具有字符类关系 G<A>和G<B>
            //list1 = list2;
    
    
            //A<G>和B<G>
            List<String> list3 = null;
            ArrayList<String> list4 = null;
            list3 = list4;
        }
        /*
        通配符的使用
          通配符: ?
             A是类B的父类,但是G<A>和G<B>没有关系,二者公共的父类G<?>
    
          有限制条件的通配符
           ? extends A:
                 G<? extends A> 可以作为G<A>和G<B>的公共父类,其中B是A的子类
           ? super A:
                 G<? super A> 可以作为G<A>和G<B>的公共父类,其中B是A的父类
         */
        @Test
        public void test3(){
            List<Object> list1 = null;
            List<String> list2 = null;
    
            List<?> list = null;
    
            list = list1;
            list = list2;
    
            print(list1);
            print(list2);
    
            List<String> list3 = new ArrayList<>();
            list3.add("abc");
            list3.add("cc");
            list3.add("def");
            list = list3;
            //添加:对于List<?>就不能向其内部添加数据,出了添加null;允许读取数据,返回类型为object
            list.add(null);
            //list.add("DD");
            Object o = list.get(0);
            System.out.println(o);//abc
        }
        public void print(List<?> list){
            Iterator<?> iterator = list.iterator();
            while (iterator.hasNext()){
                Object next = iterator.next();
                System.out.println(next);
            }
        }
    
    }

     File

    package com.atguigu.java2;
    import org.junit.Test;
    import java.io.File;
    import java.io.IOException;
    /*
     File类的使用:
      1.File的一个对象就代表一个文件或文件目录(文件夹)
      2.File类声明在java.io包下
      3.File类中涉及到关于文件或文件目录的创建、删除、重命名,修改时间等方法,
        但并未涉及到写入或读取文件内容的操作,如果读取或写入文件内容,则需使用IO流
      4.File类的对象常作为参数传递到流的构造器中,指明读取或写入的“终点”
     */
    public class FileTest {
        /*
        1.如何创建File的实例 :调用构造器
           File(String filepath):指明文件路径 (使用相对或绝对路径)
           File(String parentpath,childpath): 指定文件目录
           File(File parentFile,String childpath):指定文件目录文件
    
        2.路径:
        相对路径: 相较于某个路径下,指明的路径
        绝对路径: 包含盘符在内的文件或文件目录的路径
    
        3.路径分隔符:
        window :\
        unix :/
    
         */
        @Test
        public void test1() {
            //构造器1
            //相对路径
            File file1 = new File("hello.txt");//相对于当前module
            //绝对文件
            File file2 = new File("D:\IntelliJ  IDEA 2020\workspace\JavaSenior\Day05");
            System.out.println(file1);//hello.txt
            System.out.println(file2);//D:IntelliJ  IDEA 2020workspaceJavaSeniorDay05
    
            //构造器2
            File file3 = new File("D:\IntelliJ  IDEA 2020\workspace", "JavaSenior");
            System.out.println(file3);//D:IntelliJ  IDEA 2020workspaceJavaSenior
    
            //构造器3
            File file4 = new File(file3, "hi.txt");
            System.out.println(file4);//D:IntelliJ  IDEA 2020workspaceJavaSeniorhi.txt
        }
    
        /*
        File的获取功能:
         public String getAbsolutePath():获取绝对路径
         public String getPath():获取路径
         public String getName():获取名称
         public String getParent():获取上一层文件目录。若无,返回null
         public long length(): 获取文件长度(即:字节数)
         public long lastMosified():获取最后一次的修改时间,毫秒值
         适用于文件目录
         public String[] list():获取指定目录下的所有文件或文件目录名称数组
         public File[] listFile():获取指定目录下的所有文件或文件目录的File数组
         */
        @Test
        public void test2() {
            File file = new File("D:\IntelliJ  IDEA 2020\workspace\JavaSenior");
            String[] list = file.list();
            for (String s : list) {
                System.out.println(s);//.idea Day01 Day02 Day03……
            }
    
            File[] files = file.listFiles();
            for (File f : files) {
                System.out.println(f);//D:IntelliJ  IDEA 2020workspaceJavaSenior.idea……
            }
        }
    
        /*
        File的重命名
        public boolean renameTo(File dest):把文件重命名为指定的文件路径
          比如file1.renameTo(file2): 使得返回true,则要求file1存在,并且file2不能存在
         */
        @Test
        public void test3() {
            File file1 = new File("hello2.txt");
            File file2 = new File("D:\IntelliJ  IDEA 2020\workspace\JavaSenior\hi2.txt");
            boolean renameTo = file1.renameTo(file2);//true
            System.out.println(renameTo);
            //原来Day05中的hello.txt 文件不见,D:IntelliJ  IDEA 2020workspaceJavaSenior 文件下有 hi.txt文件,内容为hello.txt中内容
        }
    
        /*
        file中常用功能:
        public boolean isDirectory():是否为文件目录
        public boolean idFile():是否为文件
        public boolean exists():是否存在:可先判断是否存在
        public boolean canRead():是否可读
        public boolean canWrite():是否可写
        public boolean isHidden():是否隐藏
         */
        /*
        真正内存硬盘上,File文件或文件目录的创建、删除
        public boolean createNewFile();创建文件,若文件存在,则不创建,返回false
        public boolean mkdir:创建文件目录,如果文件目录存在,则不创建,如果此文件目录的上层目录不存在,也不创建
        public boolean mkdirs:创建文件目录,如果上层文件目录不存在,一并创建
    
        public booelan detele():删除文件或文件夹,Java的删除不走回收站
         */
        @Test
        public void test4() throws IOException {
            File file = new File("hello.txt");//当前文件目录下创建文件
            if (!file.exists()) {
                file.createNewFile();
                System.out.println("创建成功");
            } else {
                file.delete();
                System.out.println("删除成功");
            }
        }
    }
    虽不能至,心向往之
  • 相关阅读:
    HTTP协议基础
    MySQL必知必会总结(二)
    MySQL必知必会总结(一)
    微信小程序开发总结
    从零开始搭建物联网平台(8):邮箱通知服务
    使用CDN优化首页加载速度
    Django+Vue前后端分离项目的部署
    Docker命令
    Django中间件执行流程和CSRF验证
    golang 快速排序及二分查找
  • 原文地址:https://www.cnblogs.com/sun1997/p/14729642.html
Copyright © 2020-2023  润新知