day19简略

本文详细介绍了Java中的Map接口及其HashMap实现,包括Map的特点、常用方法以及HashMap的底层数据结构。通过示例代码展示了Map的插入、删除、修改、遍历等操作,并演示了在Map中存储对象和File类的使用。Map接口存储键值对,键唯一,值可重复;HashMap是基于哈希表的数据结构,实现了快速查找。同时,文章还涉及File类的创建、删除、属性获取等方法。
摘要由CSDN通过智能技术生成

1.Map集合

Map接口和Collection接口的不同:
它们两个不存在继承关系,都是属于java.util包下面的平级关系
Map集合存储的元素都是成对出现的,Map元素的键是唯一的,值是可以重复。把这样的元素理解为:夫妻对
Collection集合存储的元素都是单独出现的,Collection接口下面的Set是元素唯一的, List集合中元素是可以重复的。
这样的单独出现的元素,可以理解为单身
Map集合的特点:
将键映射到值的对象、
key和value可以是任意的引用类型的数据
一个映射不能包含重复的键(map集合的key值不能重复)
每个键最多可以映射到一个值(每个键值对只有一个key值,一个value值)
同样的值可以对应多个不同的键(不同的键值对可以拥有相同的value值)

1.1Map常用的方法

put(K,V)增加一个键值对
remove(K)根据下标删除键值对
put(K, V)通过覆盖的方式对键值对进行修改
keySet()获取map集合中所有的键
values()获取map集合中所有的值
putAll(Map)再一个集合后面增加另外一个集合
entrySet()获取所有的键值对
size()获取元素个数
get()通过下标获取值
containsKey()判断指定键是否被集合包含
containsValues()判断值是否被集合包含
isEmpty()判断集合是否为空

package com.qfedu.a_map;
​
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
​
public class Demo1 {
    public static void main(String[] args) {
        //Map是一个接口,需要被实现,可以用HashMap
        //接口Map后有泛型修饰,左边是键值,右边是值,类型尤其数据数据类型决定
        Map<Integer , String> map = new HashMap<>();
        //Map下面有很多方法
        //增加数据元素
        map.put(1, "狗蛋");
        map.put(2, "张三");
        map.put(3, "李四");
        //元素已经被存入
        //{1=狗蛋, 2=张三, 3=李四}
        System.out.println(map);
        //map键值对中的值是可以重复的
        //{1=狗蛋, 2=张三, 3=李四, 4=狗蛋}
        map.put(4, "狗蛋");
        System.out.println(map);
        //map键值对中的键是不可以重复的,并且会覆盖原来的键值对
        //{1=翠花, 2=张三, 3=李四, 4=狗蛋}
        map.put(1, "翠花");
        System.out.println(map);
        //删除map中的键对值是通过删除下标键来进行的
        //返回值是被删除的元素
        //System.out.println(map.remove(1));//翠花
        //返回值是布尔类型的数据
        System.out.println(map.remove(1,"翠花"));//true
        //键值对的修改也是为put,即对键值对的覆盖
        map.put(2,"老六");
        System.out.println(map);//{2=老六, 3=李四, 4=狗蛋}
        //对键值对的查找有很多种写法
        //可以使用keySet()的方法,这是对键进行获取
        Set<Integer> set = map.keySet();
        //利用增强for循环进行遍历
        for (Integer integer : set) {
            System.out.println(integer);
        }
        //使用value()的方法获取键值对中所有的值
        Collection<String> values = map.values();
        //通过增强for进行遍历
        for (String value : values) {
            System.out.println(value);
        }
        //可以用putAll进行两个map集合的拼接
        Map<Integer , String> map1 = new HashMap<>();
        map1.put(4, "狗蛋");
        map1.put(5, "张三");
        map1.put(6, "李四");
        map.putAll(map1);
        System.out.println(map);//{2=老六, 3=李四, 4=狗蛋, 5=张三, 6=李四}
        //可以查询map集合所有数据,用entrySet进行
        Set<Map.Entry<Integer, String>> entries = map.entrySet();
        for (Map.Entry<Integer, String> entry : entries) {
            //遍历所有数据
            System.out.println(entry);
            //遍历所有键
            System.out.println(entry.getKey());
            //遍历所有值
            System.out.println(entry.getValue());
            System.out.println("-----------");
        }
​
    }
}
​

1.2可以再Map集合的value值中存入对象

package com.qfedu.a_map;
​
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
​
class Person{
    String name;
    int age;
​
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class Demo2 {
    //map集合中也可以存入对象
    //同样也被泛型限制数据类型,且泛型为存入的对象
    public static void main(String[] args) {
        Map<Integer , Person> map = new HashMap<>();
        map.put(1, new Person("狗蛋" , 18));
        map.put(2, new Person("蛋蛋" , 14));
        map.put(3, new Person("修购" , 25));
        map.put(4, new Person("皮蛋" , 34));
        System.out.println(map);
        //获取map集合键的便利的数据
        for (Integer integer : map.keySet()) {
            System.out.println(integer);
        }
        //获取map集合值得遍历的数据
        for (Person value : map.values()) {
            System.out.println(value.age);
            System.out.println(value.name);
            System.out.println("-----------");
        }
        //可调用键值对的所有数据的方法是entrySet
        Set<Map.Entry<Integer, Person>> entries = map.entrySet();
        //使用增强for循环对键值对进行遍历
        for (Map.Entry<Integer, Person> entry : entries) {
            System.out.println(entry);
        }
        //查询map集合中元素的个数
        //使用size()方法
        System.out.println(map.size());//4
        //判断这个集合里面的数据是否为空
        //使用isEmpty,返回值为boolean类型
        System.out.println(map.isEmpty());//false
        //判读这个集合中是否含有这个键
        //containsKey()
        System.out.println(map.containsKey(2));//true
        //判读这个集合中是否含有这个值
        //containsValue()
        //String name = map.get(1).name;
        //System.out.println(map.containsValue("狗蛋,18"));
        //可通过指定键获取指定value值
        System.out.println(map.get(2));//Person{name='蛋蛋', age=14}
        //通过指定键删除指定键值对
        //使用remove(),返回的是被删除的键值对
        System.out.println(map.remove(1));//Person{name='狗蛋', age=18}
        System.out.println(map);//{2=Person{name='蛋蛋', age=14}, 3=Person{name='修购', age=25}, 4=Person{name='皮蛋', age=34}}
    }
}
​

1.3Map集合解析

Map集合和Collection集合没有任何关系。Collection集合是以单个方式存储元素的,而Map集合是以键值对的方式存储元素,所有Map集合的Key是无序不可重复的,key和value都是引用数据类型,存的都是内存的地址。

Map集合的实现类主要为HashMap、HashTable。子接口有一个SortedMap,SortedMap有一个TreeMap实现类。

1.4HashMap的源码

1.底层数据结构

HashMap的底层数据结构是和哈希表。

数组在查询方面效率很高,随机增删效率很低。单向链表在随机增删方面效率很高,在查询方面效率很低。

哈希表是数组和单向链表的结合体,将以上优势融合在一起。 2.Node结点

HashMap实际上就是Node类型的一个数组,Node是一个静态内部类,Node结点由哈希值、key、value和指向下一个结点的内存地址这四部分组成。

哈希值是HashCode()方法的执行结果,哈希值通过哈希函数(哈希算法)转换成数组的下标。

2.File类

在 Java 中,File 类是 java.io 包中唯一代表磁盘文件本身的对象,也就是说,如果希望在程序中操作文件和目录,则都可以通过 File 类来完成。File 类定义了一些方法来操作文件,如新建、删除、重命名文件和目录等。

File 类不能访问文件内容本身,如果需要访问文件内容本身,则需要使用输入/输出流。

2.1File类的构造方法

File(String pathname)

通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。

File(String parent, String child)

从父路径名字符串和子路径名字符串创建新的 File实例。

package com.qfedu.a_map;
​
import java.io.File;
​
public class Demo4 {
    public static void main(String[] args) {
        //这个代码当前储存的目录
        File file = new File("./");
        System.out.println(file);
        //当前代码的绝对路径
        File file1 = new File("D:/vkd/aaa");
        //打印的即为准确的路径
        System.out.println(file1);//D:\vkd\aaa
​
    }
}

2.2File类下面的方法

booleancreateNewFile()创建指定文件
booleanmkDir()创建单个文件夹
booleanmkDirs()创建多个文件夹
返回值类型方法代码功能
booleandelete()删除文件和文件夹
booleanexists()判断文件或者文件夹是否存在
booleanisHidden()判断文件是否为隐藏文件
StringlistFiles()获取当前文件下面的所有文件
Stringlist()获取当前文件下面所有的文件名字
StringgetName()获取文件或者文件夹的名字
StringgetPath()获取当前对象的路径
longlastModified()获取文件最后一次修改的时间
返回值类型方法代码功能
booleanisDirectory()判断文件夹是否存在
booleanisFile()判断文件是否存在
booleanisAbsolute()判断文件或者文件夹是绝对路径
StringgetParent()当前文件对象的上一级的目录
booleanrenameTo(File dest):将当前File对象所指向的路径 修改为 指定File所指向的路径
package com.qfedu.a_map;
​
import java.io.File;
import java.io.IOException;
​
public class Demo3 {
    public static void main(String[] args) throws IOException {
        //创建指定文件,可用createNewFile
        File file = new File("D:/vkd/aaa.txt");
        System.out.println(file.createNewFile());
        //创建单个文件夹,可用mkdir
        File file1 = new File("D:/vkd/aaa");
        System.out.println(file1.mkdir());
        //创建多个文件夹,可以用mkdirs
        File file2 = new File("D:/vkd/bbb/ccc");
        System.out.println(file2.mkdirs());
    }
}
​
package com.qfedu.a_map;
​
import java.io.File;
import java.util.Scanner;
​
public class Demo5 {
    public static void main(String[] args) {
        //首先构造一个File对象,进行导包
        //括号里面为文件或文件夹位置
        File file = new File("D:/vkd/aaa");
        //boolean delete();立即删除文件,
        System.out.println(file.delete());
        //判断文件或者文件夹是否存在
        System.out.println(file.exists());//false
        File file1 = new File("D:/vkd/bbb/ccc");
        //deleteOnExit()是一种无返回值的方法,是程序退出后才会删除
        file1.deleteOnExit();
        //程序不退出则不会执行
        new Scanner(System.in).nextInt();
    }
}
​
package com.qfedu.a_map;
​
import java.io.File;
​
public class Demo6 {
    public static void main(String[] args) {
        File file = new File("D:/vdk/bbb");
        //判断文件是否存在
        //isFile(),返回值是boolean类型
        System.out.println(file.isFile());//false
        File file1 = new File("D:/vkd/aaa.txt");//true
        System.out.println(file1.isFile());
        //判断文件夹是否存在
        //isDirectory()返回值是boolean
        File file2 = new File("D:/vkd/bbb");
        System.out.println(file2.isDirectory());//true
        //判断文件或者文件夹是否为绝对路径
        System.out.println(file.isAbsolute());//true
        //首先将文件进行隐藏
        File file3 = new File("D:/Users/张海涛");
        System.out.println(file3.isHidden());//true
        //exists();判断文件或者文件夹是否存在
        System.out.println(file1.exists());//true
​
    }
}
​
package com.qfedu.a_map;
​
import java.io.File;
​
public class Demo7 {
    public static void main(String[] args) {
        File file = new File("D:/Users/张海涛");
        //获取文件或者文件夹的名字
        // getName()
        System.out.println(file.getName());//张海涛
        //获取当前对象的路径
        //getPath()
        System.out.println(file.getPath());//D:\Users\张海涛
        //获取当前文件对象的上一级的目录
        //String getParent();
        System.out.println(file.getParent());//D:\Users
    }
}
package com.qfedu.a_map;
​
import java.io.File;
​
public class Demo8 {
    public static void main(String[] args) {
        //文件占用的字符节数
        //window10以后跟元素个数是三倍关系
        File file = new File("D:/Users/aaa/1.txt");
        //length()//我命由我不由天!!!!
        System.out.println(file.length());//33
        //获取当前文件最后一次修改的时间
        //long lastModified()单位是毫秒
        System.out.println(file.lastModified());//1659700047781
        //获取当前文件夹下面的所有的文件
        //File[]   listFiles()
        File file1 = new File("D:/x64");
        //打出来的为地址,但可以用增强for循环遍历出来
        //用一个数据类型的对象来接,并进行遍历
        File[] files = file1.listFiles();
        for (File file2 : files) {
            System.out.println(file2);
        }
        //也可以将文件名字遍历出来
        // list();
        String[] list = file1.list();
        for (String s : list) {
            System.out.println(s);
        }
    }
}
​
package com.qfedu.a_map;
​
import java.io.File;
​
public class Demo9 {
    public static void main(String[] args) {
        File file = new File("D:/aaa");
        test(file);
    }
    public  static void test(File file){
        //D:\aaa\bbb
        //D:\aaa\bbb\2.txt
        //D:\aaa\bbb\ccc
        //D:\aaa\bbb\ccc\ddd
        //D:\aaa\bbb\ccc\ddd\3.txt
        //D:\aaa\bbb\ccc\fff
        //用数组接一下
        File[] files = file.listFiles();
        //进行增强for循环遍历
        //采用递归方式
        for (File file1 : files) {
            System.out.println(file1);
            if (file1.isDirectory()){   //判断是否为文件夹
                    test(file1);
                } else {
                   file1.delete();
                }
            }
        }
​
    }
​
​
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值