Java入门9(HashSet,File文件类)

打印 上一主题 下一主题

主题 523|帖子 523|积分 1569

HashSet


  • jdk1.7之前,使用数组加链表的方式实现
  • jdk1.8之后,在链表长度大于8并且数组长度超过32的情况下,会转成红黑树结构
  • HashSet的本质是一个HashMap,它所有的value都是一致的,传入的参数作为key,因此HashSet中不允许重复数据
  • 存储的时候,键值对位于的数组位置,之和key的HashCode值有关,无法保证先插入的key的HashCode值一定比较小,因此无法保证存读有序
  1. Set<String> set = new HashSet<>();
  2. set.add("Robot01");
  3. set.add("Robot02");
  4. set.add("Robot03");
  5. // 1. 增强for循环遍历
  6. for (String s : set) {
  7.     System.out.println(s + "\t");
  8. }
  9. System.out.println();
  10. // 2. 迭代器遍历
  11. Iterator<String> iterator = set.iterator();
  12. while(iterator.hasNext()){
  13.     System.out.println(iterator.next() + "\t");
  14. }
复制代码
二叉树

<img alt="SVVQ$IY~6EGXO9BSC1GB" loading="lazy">
二叉树的节点类
  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. // 泛型继承,你提供的泛型类型一定是Comparable类的子类
  5. public class Node<V extends Comparable> {
  6.     private V value;
  7.     private Node<V> leftNode;
  8.     private Node<V> rightNode;
  9.     public void addNode(V value){
  10.         if (null == this.value){
  11.             // 当前节点没有值
  12.             this.value = value;
  13.         }else{
  14.             // 当前节点有值
  15.             if(this.value.compareTo(value)>=0){
  16.                 // 当前值小于节点值
  17.                 // 判断当前节点的左节点是否为空
  18.                 if(null == leftNode){
  19.                     // 左节点为空,新建新节点
  20.                     leftNode = new Node<>();
  21.                 }
  22.                 // 递归调用
  23.                 leftNode.addNode(value);
  24.             } else {
  25.                 // 当前值大于节点值
  26.                 // 判断当前节点的右节点是否为空
  27.                 if (null == rightNode){
  28.                     // 右节点为空,新建新节点
  29.                     rightNode = new Node<>();
  30.                 }
  31.                 rightNode.addNode(value);
  32.             }
  33.         }
  34.     }
  35. }
  36. // 测试类
  37. public class Application {
  38.     public static void main(String[] args) {
  39.         int[] randoms = {17,34,64,72,37,18,98,37,53,63};
  40.         // 创建根节点
  41.         Node<Integer> root = new Node<>();
  42.         for (int random : randoms) {
  43.             root.addNode(random);
  44.         }
  45.         System.out.println(root.getRightNode().getValue());
  46.     }
  47. }
复制代码
三种遍历方法(前序遍历,中序遍历,后序遍历)

​        以中序遍历为例
  1. // 中序遍历
  2. public List<V> inOrder(Node<V> root){
  3.     List<V> nodeList = new ArrayList<>();
  4.     if(null == root.value){
  5.         return nodeList;
  6.     }else{
  7.         if (null != root.leftNode){
  8.             nodeList.addAll(inOrder(root.leftNode));
  9.         }
  10.         nodeList.add(root.value);
  11.         if (null != root.rightNode){
  12.             nodeList.addAll(inOrder(root.rightNode));
  13.         }
  14.         return nodeList;
  15.     }
  16. }
复制代码
TreeMap和TreeSet


  • TreeMap中,所有的key是以红黑树进行存储的
  • 在使用TreeMap的时候,如果你key的类型实现了比较器接口,就可以自动排序
  • TreeSet和TreeMap方法几乎一致,只不过不再提供value的获取,所有方法获取的都是key
  • 两者相同,要么泛型对应的数据类型实现了Comparable接口,要么手动提供一个Comparator比较器对象,否则两者都不可以被实例化(类似于强制排序)
  1. public static void main(String[] args) {
  2.     TreeMap<String, String> treeMap = new TreeMap<>();
  3.     // 根据key的compareTo比较器确定的排序方法
  4.     for (int i = 0; i < 5; i++) {
  5.         treeMap.put("robot0" + i,"i");
  6.     }
  7.     // 返回第一个key(hashcode最小)
  8.     System.out.println(treeMap.firstKey());
  9.     // 返回第一个键值对(hashcode最小)
  10.     System.out.println(treeMap.firstEntry());
  11.     // 返回最后一个键值对(hashcode最大)
  12.     System.out.println(treeMap.lastEntry());
  13.     // 返回最后一个键值对(hashcode最大)
  14.     System.out.println(treeMap.lastKey());
  15.     // 如果匹配的key存在,默认取匹配key
  16.     System.out.println(treeMap.floorKey("robot01"));
  17.     // 如果匹配key存在,则取上一个key
  18.     System.out.println(treeMap.lowerKey("robot01"));
  19.     // 还有很多基于key的排序衍生出来的方法。。。。
  20. }
复制代码
日期类(Calendar类)
  1. // Calendar 日历类,对日期时间做修改和调整(单例模式)
  2. // add 基于时间单位做日期的前后调整
  3. // set 基于时间单位做日期值的设置
  4. Calendar c = Calendar.getInstance();
  5. // 创建日期对象时,如果没有指定时间,默认使用当前时间
  6. Date now = c.getTime();
  7. System.out.println(c.getTime());
  8. // 获得下个月的今天
  9. // 参数值如果时正数,表示未来,如果为负数,表示过去
  10. c.add(Calendar.MONTH,1);
  11. System.out.println(c.getTime());
  12. // 重置日历时间
  13. c.setTime(now);
  14. // 获取上个月的第三天
  15. c.add(Calendar.MONTH,-1);
  16. // 如果set的是月份那么使用(0~11)来表示1~12月
  17. c.set(Calendar.DATE,3);
  18. System.out.println(c.getTime());
复制代码
文件类(File类)

​        Java中借助文件类的对象,来操作和访问磁盘中的真实文件,文件对象只是真实文件的映射,并不代表文件本身,文件是否存在并不影响对象的创建。
文件对象的三种创建方式


  • 基于文件再磁盘中的绝对路径来进行创建
  1. File f1 = new File("文件路径")
复制代码

  • 基于当前项目所在位置路径进行创建
  1. File f1 = new File("文件名")
复制代码

  • 基于另一个目录对象作为父目录,创建文件对象
  1. File f1 = new File(f1,"文件名")
复制代码
返回文件绝对路径
  1. System.out.println(f1.getAbsolutePath());
复制代码
文件类常用方法

1. 判断文件是否存在
  1. System.out.println(f1.exists());
复制代码
2.判断是否是文件夹
  1. System.out.println(f1.isDirectory());
复制代码
3.判断是否是文件
  1. System.out.println(f1.isFile());
复制代码
4.获取文件长度
  1. System.out.println(f2.length());
复制代码
5.文件最后修改时间
  1. System.out.println(f2.lastModified());
  2. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
  3. // 日期转字符串
  4. System.out.println(dateFormat.format(f2.lastModified()));
  5. // 字符串转日期,必须保证字符串日期格式与定义的format格式一致,且必须进行异常处理
  6. String str = "2023-05-20 13:59:47 871";
  7. try {
  8.     System.out.println(dateFormat.parse("2023-05-20 13:59:47 871"));
  9. } catch (ParseException e) {
  10.     e.printStackTrace();
  11. }System.out.println(f2.lastModified());
复制代码
6.设置文件最后修改时间
  1. String str = "2023-05-20 13:59:47 871";
  2. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
  3. try {
  4.     Date d = dateFormat.parse("2023-05-20 13:59:47 871");
  5.     file02.setLastModified(d.getTime());
  6. } catch (ParseException e) {
  7.     e.printStackTrace();
  8. }
复制代码
7.设置文件只读
  1. file02.setReadOnly();
复制代码
8. 重命名文件
  1. // 文件重命名,需要提供新的文件对象
  2. File file03 = new File(file01,"HAHAHAHAHA.txt");
  3. file02.renameTo(file03);
复制代码
9. 以字符串数组的形式返回当前目录下所有文件的文件名称
  1. // 以字符串数组的形式返回当前目录下所有文件的文件名称
  2. String[] fileList = file01.list();
  3. System.out.println(Arrays.asList(fileList));
复制代码
10. 以文件对象数组的方式,返回当前目录下所有文件所对应的文件对象
  1. // 以文件对象数组的方式,返回当前目录下所有文件所对应的文件对象
  2. File[] files = file01.listFiles();
  3. for (File file : files) {
  4.     System.out.println(file);
  5. }
复制代码
11.获取当前文件对象父目录的路径
  1. // 获取当前文件对象父目录的路径
  2. System.out.println(file02.getParent());
  3. // 获取当前文件对象父目录所对应的文件对象
  4. File parentFile = file02.getParentFile();
  5. System.out.println(parentFile.getAbsoluteFile());
复制代码
12.创建文件对象路径所对应的目录
  1. // 创建文件对象路径所对应的目录
  2. File file = new File("绝对路径");
  3. file.mkdirs();
复制代码
13.创建文件对象的路径所对应的文件
  1. // 创建文件对象的路径所对应的文件
  2. File file = new File("绝对路径");
  3. // 再创建文件之前,应该先判断文件的父目录是否存在
  4. // 如果存在,则直接创建,如果不存在则应该先创建父目录
  5. if (!file.getParentFile().exists()){
  6.     file.getParentFile().mkdirs();
  7. }
  8. try {
  9.     file.createNewFile();
  10. } catch (IOException e) {
  11.     throw new RuntimeException(e);
  12. }
复制代码
14.删除文件
  1. // 删除文件
  2. file02.delete();
  3. // 退出的时候再删除(用于临时文件)
  4. file02.deleteOnExit();
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表