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类下面的方法
boolean | createNewFile() | 创建指定文件 |
---|---|---|
boolean | mkDir() | 创建单个文件夹 |
boolean | mkDirs() | 创建多个文件夹 |
返回值类型 | 方法代码 | 功能 |
---|---|---|
boolean | delete() | 删除文件和文件夹 |
boolean | exists() | 判断文件或者文件夹是否存在 |
boolean | isHidden() | 判断文件是否为隐藏文件 |
String | listFiles() | 获取当前文件下面的所有文件 |
String | list() | 获取当前文件下面所有的文件名字 |
String | getName() | 获取文件或者文件夹的名字 |
String | getPath() | 获取当前对象的路径 |
long | lastModified() | 获取文件最后一次修改的时间 |
返回值类型 | 方法代码 | 功能 |
---|---|---|
boolean | isDirectory() | 判断文件夹是否存在 |
boolean | isFile() | 判断文件是否存在 |
boolean | isAbsolute() | 判断文件或者文件夹是绝对路径 |
String | getParent() | 当前文件对象的上一级的目录 |
boolean | renameTo(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(); } } } }