首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

杨校老师课堂之基于File类的文件管理器

文件管理器具体功能要求如下: 用户输入指令1,代表“指定关键字检索文件”,此时需要用户输入检索的目录和关键字,系统在用户指定的目录下检索出文件名中包含关键字的文件,并将其绝对路径展示出来。...用户输入指令2,代表“指定后缀名检索文件”,此时需要用户输入检索的目录和后缀名(多个后缀名用逗号分隔),系统在用户指定的目录下检索出指定后缀名的文件,并将其绝对路径展示出来。...new Scanner(System.in); System.out.print("请输入要检索的目录位置:"); String path = sc.next();//控制台获取路径... list = FileUtils.listFiles(file, key); for (Object obj : list) { //将路径打印到控制台...list = FileUtils.listFiles(file, suffixArray); for (Object obj : list) { //将路径打印到控制台

27630

异步编程 - 07 基于JDK中的Future实现异步编程(下)_当Stream遇见CompletableFuture

比如下面的代码,我们person列表中过滤出年龄大于10岁的人,并且收集对应的name字段到list,然后统一印处理。在使用非Stream的情况下,我们会使用如下代码来实现。....收集映射后元素 nameList.stream().forEach(name -> System.out.println(name)); } 在上面的代码中我们首先从personList获取到流对象...上获取流调用forEach进行打印。...而collect操作是终端操作符,当在流上执行终端操作符时,流上施加的操作才会执行。 JDK8中对于Steam提供了很多操作符,只是简单的列出了filter、map、collect这几种方法。...小结 我们了解了CompletableFuture如何解决其缺点,以及CompletableFuture与JDK Stream是如何完美结合的,可知使用CompletableFuture实现异步编程属于声明式编程

26330
您找到你想要的搜索结果了吗?
是的
没有找到

JAVA中写时复制Copy-On-Write

因此,可以对原始容器进行并发地。其次,实现了操作与写操作的分离,操作发生在原始容器上,写操作发生在副本容器上。...数据一致性问题:操作的线程可能不会立即读取到新修改的数据,因为修改操作发生在副本上。但最终修改操作会完成更新容器,因此这是最终一致性。...因此,可以参考CopyOnWriteArrayList自己实现一个CopyOnWriteHashMap 主要是在写操作时,如何保证线程安全即可。...这样,当一个线程需要put一个新元素时,它先锁住当前CopyOnWriteMap对象,复制一个新HashMap,而其他的线程因为不需要加锁,则可继续访问原来的HashMap。...而ConcurrentHashMap并不是“复制”这个角度来应对多线程并发修改,而是引入了分段锁(JDK7);CAS、锁(JDK11)解决多线程并发修改的问题。

53230

Java多线程并发编程中并发容器第二篇之List的并发类讲解

如果想系统学习,凯哥(kaigejava)建议第一篇开始看。 本篇开始,我们就来讲解讲解Java的并发容器。大致思路:先介绍什么是并发容器。然后讲解list相关的、map相关的以及队列相关的。...正确的应该是100*1000.结果来看,arrayList丢数据了。 使用Vector执行后的效果: 编辑 ​ 执行vector时间为 : 98毫秒!...所以,CopyArrayList支持多写少的并发情况 CopyOnWriteArrayList的使用场景: 由于操作不加锁,增删改三个操作加锁的,因此适用于多写少的场景, 局限性:因为的时候不加锁的...,的效率和普通的arrayList是一样的。...所以可以说copyArrayList在读的时候不会出现arrayList取到脏数据的问题。

57210

leetcode-102. 二叉树的层序遍历

queue.isEmpty()) { // 定义一个存放同一层级元素的集合 List level = new ArrayList<Integer...定义一个存放二叉树节点的队列,这个队列就像吃饭用的盆,去阿姨那里饭盛饭用的待会饭还是进自己的肚子里的,至于为什么是盆不是碗就不扯太远了。先把二叉树的根节点放进去队列,因为刚开始这一层级就一个根节点。...接下来义一个存放同一层级的所有元素集合,获取此时队列的长度,为什么要获取队列长度呢,重点来了,因为你还记得当初你把同一层级的所有元素加入了队列,至于是多少个这里要算清楚,因为女朋友还不是你的老婆所以还是要...获取到本层级的所有元素数量后,队列里取出来你之前放进去队列的元素,取多少个呢?你放进去多少就取多少,最多两个,因为这是二叉树。那怎么保证取的那几个就是我当初放进去的那几个?...取到值后,将其加入储存当前层级元素的集合中,判断该树节点下是否还有左右子节点,存在的话还是要加入队列,等待下层级遍历。

24930

ArrayList与CopyOnWriteArrayList常见操作与问题

ArrayList循环遍历删除元素的常见陷阱 在工作和学习中,经常碰到删除ArrayList里面的某个元素,看似一个很简单的问题,却很容易出bug。...今天就给大家说一下在ArrayList循环遍历删除元素的问题。...针对错误写法一,在遍历第一个字符串b时因为符合删除条件,所以将该元素数组中删除,并且将后一个元素移动(也就是第二个字符串b)至当前位置,导致下一次循环遍历时后一个字符串b并没有遍历到,所以无法删除。...CopyOnWrite的设计思想 如果简单的使用读写锁的话,在写锁被获取之后,读写线程被阻塞,只有当写锁被释放后读线程才有机会获取到锁从而读到最新的数据,站在读线程的角度来看,即线程任何时候都是获取到最新的数据...add 方法实现原理 再来看下如何进行添加数据的?

69410

看了CopyOnWriteArrayList后自己实现了一个CopyOnWriteHashMap

CopyOnWriteArrayList的实现 通过上面两个栗子我们可以发现CopyOnWriteArrayList是线程安全的,下面我们就来一起看看CopyOnWriteArrayList是如何实现线程安全的...如果这种多写少的场景采用 Vector,Collections包装的这些方式是不合理的,因为尽管多个线程同一个数据容器中读取数据,但是线程对数据容器的数据并不会发生发生修改,所以并不需要也加锁...CopyOnWrite缺点 CopyOnWriteArrayList虽然是一个线程安全版的ArrayList,但其每次修改数据时都会复制一份数据出来,所以CopyOnWriteArrayList只适用多写少或无锁场景...操作的线程可能不会立即读取到新修改的数据,因为修改操作发生在副本上。但最终修改操作会完成更新容器所以这是最终一致性。...感谢您的阅读,十分欢迎感谢您的关注。

63310

JUC系列(四) | 集合的线程安全问题

jdk11源码) public boolean add(E e) { modCount++; add(e, elementData, size); return true; } 我们该如何解决这个问题呢...我们"动态数组"和“线程安全”两个方面来看待: 动态数组机制 : 它内部有个“volatile 数组”(array)来保持数据。...] array; 通过“volatile 数组”来保存数据的 一个线程读取 volatile 数组时,总能看 到其它线程对该 volatile 变量最后的写入;就这样,通过 volatile 提供了“...取到的数据总是最新的”这个机制的保证。...HashMap、HashSet的解决方式可以用Hashtable解决,当然不局限于这一种哈,(还没看完) 三、自言自语 最近又开始了JUC的学习,感觉Java内容真的很多,但是为了能够走的更远,还是觉得应该需要牢一下基础

27230

看了CopyOnWriteArrayList后自己实现了一个CopyOnWriteHashMap

CopyOnWriteArrayList的实现 通过上面两个栗子我们可以发现CopyOnWriteArrayList是线程安全的,下面我们就来一起看看CopyOnWriteArrayList是如何实现线程安全的...如果这种多写少的场景采用 Vector,Collections包装的这些方式是不合理的,因为尽管多个线程同一个数据容器中读取数据,但是线程对数据容器的数据并不会发生发生修改,所以并不需要也加锁...CopyOnWrite缺点 CopyOnWriteArrayList虽然是一个线程安全版的ArrayList,但其每次修改数据时都会复制一份数据出来,所以CopyOnWriteArrayList只适用多写少或无锁场景...操作的线程可能不会立即读取到新修改的数据,因为修改操作发生在副本上。但最终修改操作会完成更新容器所以这是最终一致性。...感谢您的阅读,十分欢迎感谢您的关注。 [8888.png] 巨人肩膀摘苹果 http://ifeve.com/java-copy-on-write/

34240

第九天 面向对象-类,封装,对象,private,this【悟空教程】

1.1.1.2 特点 是一种更符合我们思考习惯的思想 可以将复杂的事情简单化 将我们执行者变成了指挥者 角色发生了转换 1.1.1.3 举例 买电脑 洗衣服 吃饭 1.1.1.4 面向对象特性...我们如何表示一个现实世界事物呢: 属性 就是该事物的描述信息 行为 就是该事物能够做什么 举例:学生事物 我们学习的Java语言最基本单位是类,所以我们就应该把事物用一个类来体现。...; 5.使用空调对象获取空调的品牌和价格印到控制台上; 6.使用空调对象调用开机方法; 7.使用空调对象调用定时关机方法,传递具体数据值,在控制台上可以看到的效果为:空调将在xxx分钟后自动关闭....,返回该等级(A,B,C) 在主方法中: 创建三个Student对象传入method(ArrayList stu)方法中 method方法内要求: 该方法内有对等级进行判断的方法,...模拟真实购物逻辑,以上述图片为需求原型,根据不同购物物品完成购物小票内容打印到控制台。

69360

死磕 Java集合之ArrayList源码分析

public boolean remove(Object o) { if (o == null) { // 遍历整个数组,找到元素第一次出现的位置,并将其快速删除 for...O(1); (3)ArrayList添加元素到尾部极快,平均时间复杂度为O(1); (4)ArrayList添加元素到中间比较慢,因为要搬移元素,平均时间复杂度为O(n); (5)ArrayList尾部删除元素极快...,时间复杂度为O(1); (6)ArrayList从中间删除元素比较慢,因为要搬移元素,平均时间复杂度为O(n); (7)ArrayList支持求集,调用addAll(Collection c)方法即可...// 读入非transient非static属性(会读取size属性) s.defaultReadObject(); // 读入元素个数,没什么用,只是因为写出的时候写了size属性,的时候也要按顺序来...()和readObject()是为了自己控制序列化的方式,这两个方法必须声明为private,在java.io.ObjectStreamClass#getPrivateMethod()方法中通过反射获取到

45320

【Java_06】Scanner 类、Random 类、ArrayList 集合

格式:类名 对象名 = new 类名( 参数列表 ); 即:Scanner sc = new Scanner(System.in); 注:System.in系统输入指的是键盘输入...nextInt():以空格或者换行符为终点,返回整数(实际是获取的字符串,只是将其转为了整数)。 hasNext():判断输入流中是否还有数据,有则返回 true。...ArrayList 介绍 * ArrayList 是一个集合,数组是定长的,当我们要改变数组长度是需要创建新的数组,ArrayList不同他的长度是可以改变的。 2....练习 键盘键入10个数,将其放入集合中,生成一个随机数,以这个随机数作为索引删除在集合中代表的元素 import java.util.ArrayList; import java.util.Random...System.out.println("请输入10个数字,空格为分割,#结尾"); //持续键盘获取数字直至获取到非数字为止,并将获取到的以空格分割 while (sc.hasNextInt

43010

猫眼面经汇总

,1.7版本以及1.8版本的不同 ConcurrentHashMap源码解析(JDK1.8) arraylist默认大小,如何扩展的 ArrayList默认大小为10,扩容为原先数组大小的1.5倍,再判断新数组容量是否够用和长度是否大于最大值...,只在数据提交时检查是否违反了数据完整性(不能解决脏问题) 如何实现让一个线程等待其他线程完成后在执行 通过一个线程安全的全局变量来控制, 每个其他线程执行结束该全局变量减一, 该线程判断全局变量为0...但是,如果向量中包含负数,是否应该包含某个负数,期望旁边的正数会弥补它呢? * 例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(第0个开始,到第3个为止)。...> arrayList = new ArrayList(); //记录本层打印了多少个 int start = 0; //记录下层几个...arrayList.add(temp.val); start++; //每打印一个节点,就把此节点的下一层的左右节点加入队列,记录下一层要打印的个数

96330

16.IO之其他流

第一 打印流 一、概述: 该流提供了打印方法,可以将各种数据类型的数据都原样打印 原理将97先变成字符保持原样将数据打印到目的地 1、字节打印流:PrintStream 构造函数可以接收的参数类型:...// int by = read(); // write(by); // out.write(610);//只写最低8位, // out.print(97);//将97先变成字符保持原样将数据打印到目的地...二、如何合并多个文件: 1、创建集合,并将流对象添加进集合或者SequenceInputStream(InputStream s1,InputStream s2)加入两个输入流 2、创建Enumeration...接口,因为是两个不同的线程,覆盖run方法,注意,需要在内部处理异常,因为重写run方法 2、创建两个管道流,并用connect()方法将两个流连接 3、创建读写对象,传入两个线程内,start执行...bs = s.getBytes("GBK"); for (byte b : bs) { // Integer.toBinaryString将其转换为二进制

17720

16.IO之其他流

第一  打印流 一、概述: 该流提供了打印方法,可以将各种数据类型的数据都原样打印 原理将97先变成字符保持原样将数据打印到目的地 1、字节打印流:PrintStream  构造函数可以接收的参数类型:...// int by = read(); // write(by); // out.write(610);//只写最低8位, // out.print(97);//将97先变成字符保持原样将数据打印到目的地...二、如何合并多个文件: 1、创建集合,并将流对象添加进集合或者SequenceInputStream(InputStream s1,InputStream s2)加入两个输入流 2、创建Enumeration...接口,因为是两个不同的线程,覆盖run方法,注意,需要在内部处理异常,因为重写run方法 2、创建两个管道流,并用connect()方法将两个流连接 3、创建读写对象,传入两个线程内,start执行...bs = s.getBytes("GBK"); for (byte b : bs) { // Integer.toBinaryString将其转换为二进制

659140

同学,二叉树的各种遍历方式,我都帮你总结了,附有队列堆栈图解(巩固基础,强烈建议收藏)

看完此文leetcode至少解决八道题 掌握二叉树的前序、中序、后序遍历以及两种不同的实现方式:递归与非递归 非递归时遍历与层次遍历时,有详细的图解表示队列/栈中的元素是如何移动的,有助于理解代码的运行...叶子结点:也称为终端结点,没有子树的结点或者度为零的结点。 分支结点:也称为非终端结点,度不为零的结点称为非终端结点。 树的度:树中所有结点的度的最大值。...结点的层次:根结点开始,假设根结点为第1层,根结点的子节点为第2层,依此类推,如果某一个结点位于第L层,则其子节点位于第L+1层。 树的深度:也称为树的高度,树中所有结点的层次最大值称为树的深度。...二叉树非递归遍历 用到栈(FILO 先进后出的特性) 每段代码后,都有栈和其中元素的关系具体过程,建议静下心来慢慢看,有助于理解代码如何运行 前序遍历 class Solution { List...stack.empty()){ //栈弹出这个节点 TreeNode node = stack.pop(); //添加进列表中

4.3K30
领券