JAVA程序开发学习日志—DAY13—2022/07/21

Map

        Map接口是和Collection同等级的根接口

1.特点

        - 存储的是(K-V)键值对

        - 无序

        - key唯一,Value可以重复

2.实现类

        - HashMap:底层  数组、链表、红黑树

        - LinkedHashMap:有序的map

        - TreeMap:排序的map

        - HashTable:和HashMap的区别为——HashTable线程安全。不常用

3.常用方法

//创建HashMap对象
        HashMap<String, Integer> map = new HashMap<>();

        System.out.println(map.size());//0
        //put(Key,Value)-->return Value;返回对应Key的Value,如果是新键,返回null,否则返回对应Value
        map.put("java", 12);
        map.put("c",13);
        map.put("php",14);
        map.put("c++",15);
        map.put("c++", 17);
        //键唯一,所以只有一个c++,但是Value即15被17被覆盖了
        System.out.println(map);//{c++=17, java=12, c=13, php=14}

        //isEmpty()
        System.out.println(map.isEmpty());//false

        //containsKey(Key)是否包含指定Key
        System.out.println(map.containsKey("c"));//true
        System.out.println(map.containsKey("JS"));//false

        //containsValue(Value)
        System.out.println(map.containsValue(12));//true

        //get(Key)--->return Value;
        System.out.println(map.get("java"));//12

        //putAll(map)-->void
        HashMap<String, Integer> map2 = new HashMap<>();
        map2.putAll(map);
        System.out.println(map2);//{php=14, c++=17, java=12, c=13}

        //clear()
        map2.clear();
        System.out.println(map2);//{}

        //keySet()-->return <Keys>返回Key的集合
        System.out.println(map.keySet());//[c++, java, c, php]

        //values()-->return <Values>返回Value的集合
        System.out.println(map.values());//[17, 12, 13, 14]

//        forEach()
//        map.forEach((Key,Value)->{
//            System.out.println("Key:"+Key+" Value:"+Value);
//            //Key:c++ Value:17
//            //Key:java Value:12
//            //Key:c Value:13
//            //Key:php Value:14
//        });
        map.forEach(new BiConsumer<String, Integer>() {
            @Override
            public void accept(String s, Integer integer) {
                System.out.println("Key:"+s+" Value:"+integer);
            }
        });

        //remove(Key)-->return Value返回对应的Value:根据Key删除
        System.out.println(map.remove("c"));//13
        System.out.println(map);//{c++=17, java=12, php=14}

        //remove(Key,Value)-->return boolean
        System.out.println(map.remove("c++", 17));//true
        System.out.println(map);//{java=12, php=14}

        //replace(Key, oldValue, newValue)-->return boolean;
        System.out.println(map.replace("java", 12, 10));//true
        System.out.println(map);//{java=10, php=14}

        //replace(Key, newValue)-->return oldValue;:根据Key设置新Value,返回旧Value
        System.out.println(map.replace("php", 90));//14
        System.out.println(map);//{java=10, php=90}

        //entrySet()
        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        for (Map.Entry<String,Integer> entry : entries) {
            System.out.println(entry);
            System.out.println(entry.getValue());
            System.out.println(entry.getKey());
        }
        //java=10
        //10
        //java
        //php=90
        //90
        //php

4.原理

        - 初始化

                1.构造方法中没有做任何的数组初始化

                2.负载因子:相当于一个阈值

                        - 默认:0.75f

                         - 元素的数量 xx.size()/capacity,是一个最优解,为了增强HashMap性能

                3.最大容量:默认2^30

                4.put的原理:HashMap的存储原理

                        - put方法会初始化位桶Node数组的初始大小,默认位16

                        - put方法存值时,会先计算Key的hashCode方法返回的int值,根据hash算法 确定当前元素key在位桶中的位置

                        - 如果该位置无元素,则直接放入数组中

                        - 如果该位置上有元素,则产生了hash冲突(哈希碰撞)

                        - 产生hash冲突后,根据key的equals方法判断key是否相等,如果相等,则将key所对应的v覆盖

                        - 如果key的equals方法不相等,则采用尾插法将元素插入链表的尾部

                        - 当链表长度大于等于7时,链表转为红黑树进行存储

                        - 当位桶Node数组大于指定容量(指结合负载因子所计算出来的容量)时,扩容

                        - 扩容为原容量的2倍

                建议为每个实体类都增加hashCode和Equals方法

Exception

        异常处理机制 ———— 如何处理异常

        1.抛

                方法的后面加throws 抛出异常抛出一个或多个。 测试时用,为了代码的整洁/可读性

        2.抓

                try{可能出现异常的代码} catch(抓取的异常对象){对异常处理的代码}

                try{} catch(){} finally{无论异常发生或者不发生都会执行的代码}

        3.处理异常,如果有多个异常可以直接处理起父类

        4.通过异常对象可以输出以下常用信息

                消息、原因、堆栈信息

        5.自定义异常

                 - 继承Exception类,重写其对应的方法

File

        表文件抽象路径名对象

 1.路径问题:

        1.绝对路径:从磁盘根目录开始

        *2.相对路径

        技巧:所有的相对路径如果忘了,从绝对路径开始依次删除前面的文件,直到测试结果值正确为止

        3.在main函数下,相对路径与父工程src平级,即与module平级

public class TestFile {
    public static void main(String[] args) {
        File file = new File("wyp");
        System.out.println(file);//不管有没有这个文件,都生成了对应的对象
        System.out.println(file.exists());//false

        //测试相对路径
        file = new File("src\\com\\hqyj\\map");
        System.out.println(file.exists());//true
        file = new File("src/com/hqyj/map");
        System.out.println(file.exists());//true
    }
}

2.常用方法

public class FileTest {
    public static void main(String[] args) throws IOException {
        File file = new File("E:/Shixun/huaqingWorkspace/Day_13_test_api/src/com/hqyj/homework/FT.java");

        //测试应用程序是否可以读取此抽象路径名表示的文件
        System.out.println(file.canRead());//true

        //测试此抽象路径名表示的文件或目录是否存在
        System.out.println(file.exists());//true

        //测试此抽象路径名表示的文件是否是一个标准文件
        System.out.println(file.isFile());//true

        //返回此抽象路径名表示的文件最后一次被修改的时间
        System.out.println(file.lastModified());//1970 年 1 月 1 日 0:00 以来的毫秒数

        //返回由此抽象路径名表示的文件或目录的名称
        System.out.println(file.getName());//FT.java

        //测试应用程序是否可以修改此抽象路径名表示的文件
        System.out.println(file.canWrite());//true

        //测试此抽象路径名表示的文件是否是一个目录
        System.out.println(file.isDirectory());//false

        //测试此抽象路径名指定的文件是否是一个隐藏文件
        System.out.println(file.isHidden());//false

        //返回由此抽象路径名表示的文件的长度
        System.out.println(file.length());//52

        //将此抽象路径名转换为一个路径名字符串。
        System.out.println(file.getPath());
        //E:\Shixun\huaqingWorkspace\Day_13_test_api\src\com\hqyj\homework\FT.java

        //当且仅当不存在具有此抽象路径名指定的名称的文件时,
        // 原子地创建由此抽象路径名指定的一个新的空文件
        file = new File("E:/Shixun/huaqingWorkspace/Day_13_test_api/src/com/hqyj/homework/s");
        System.out.println(file.createNewFile());//true
        System.out.println(file.getPath());
        //E:\Shixun\huaqingWorkspace\Day_13_test_api\src\com\hqyj\homework\s

        //删除此抽象路径名表示的文件或目录
        System.out.println(file.delete());//true
        System.out.println(file.exists());//false

        //创建此抽象路径名指定的目录
        file = new File("E:/Shixun/huaqingWorkspace/Day_13_test_api/src/com/hqyj/homework/mkdir_test");
        System.out.println(file.mkdir());//true
        System.out.println(file.getPath());
        //E:/Shixun/huaqingWorkspace/Day_13_test_api/src/com/hqyj/homework/mkdir_test

        //创建此抽象路径名指定的目录,包括创建必需但不存在的父目录
        file = new File("E:/Shixun/huaqingWorkspace/Day_13_test_api/src/com/hqyj/homework/mkdirs_test");
        System.out.println(file.mkdirs());//true
        System.out.println(file.getPath());
        //E:\Shixun\huaqingWorkspace\Day_13_test_api\src\com\hqyj\homework\mkdirs_test\child
    }
}

4.面试题

问:\\ 和 / 表示路径有什么区别?

答:兼容性问题。

\\ 是windows独有的

/ 在任何操作系统下都识别   建议使用 /

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值