一道面试题:餐馆模拟

前阵子遇到一个面试题,当时没有做出来,后来断断续续的用了一周的时间做了出来,但感觉也不完全对,先来看看题目,稍后再讨论。

问题

模拟一个餐馆,三个厨师,二个服务员,厨师单独做菜,2分钟一个菜,服务员单独送菜10秒一个

分析

一看这问题就知道考查的点是多线程,生产者与消费者模型的模拟类问题,《Java编程思想》中有类似的例子,但是这个问题比书中的例子要复杂一些,因为厨师和服务员都有多个,所以要考虑到厨师与服务员的管理(资源管理),以及定单的队列,因为当厨师都在忙的时候,定单必须要放入队列中。另外的最难的地方就在于如何写测试以证明程序是正常工作,这是最难的地方。关键的点应该是:

  1. 厨师的管理:包括安排厨师去做菜,厨师做好菜后要通知服务员去送菜,当没有厨师时,或没有菜单时都要空闲等待
  2. 服务员的管理:安排服务员去送菜,当没有菜时或没有服务员时都要等待
  3. 定单的管理:当没有厨师去做菜时,要把定单放入队列里,等待厨师,这个可以让厨师管理者一同管理;同理当没有服务员时也要放入队列,这个可以由服务员管理者来管理
  4. 测试用例:用一定数量的定单数来验证程序是正确的。

测试

可以先想一些测试用例:

  1. 当只有一个定单时,很容易,应该是做菜时间加上送菜时间就好了,同时只用一个厨师和一个服务员
  2. 当有二个时,因为有三个厨师和二个服务员,二道菜应该同时完成,因为资源充足,没有等待
  3. 当有三个时,厨师不用等,但服务员要等,所以前二个同时完成,第三个要再等一个送菜时间
  4. 当有四个时,当厨师在做第四道菜时,第三个已经送完,所以第四个菜要多等一个做菜时间和送菜时间
  5. 第五个应该与第四个同时完成
  6. 第六个比第五个多等一个送菜时间
用这个图来表达会更清楚各个菜的完成时间:

菜单完成时序列图

实现

测试代码,也许这个测试代码应该重构,以去掉重复的,但是那样容易出错,这样虽然重复,但很直观。

package com.effectivejava.threading.basics;import junit.framework.TestCase;public class ResturauntTest extends TestCase {private Resturaunt resturaunt;/** TODO:* time to cook: 200 ms* time to deliver: 50 ms* tolerance is 100 ms* If tolerance is less than 100, cases will fail.* These three parameters are important for these tests to pass, if you change time2cook or time2deliver,* cases would fail.*/private int tolerance = 100; // in mspublic ResturauntTest() {super("ResturauntTest");}@Overridepublic void setUp() {resturaunt = new Resturaunt("Hilton's Place");}@Overridepublic void tearDown() {resturaunt.closeDoor();}public void testOneOrder() throws InterruptedException {System.out.println("============ start testing one orders =============");final Order order[] = createOrders(1);int timeToWait = tolerance;timeToWait += CookManager.TIME_TO_COOK;timeToWait += WaitorManager.TIME_TO_DELIVER;Thread.sleep(timeToWait);assertTrue(order[0] + " should be ready", order[0].isReady());}public void testTwoOrders() throws InterruptedException {System.out.println("============ start testing two orders =============");final Order orders[] = createOrders(2);int timeToWait = tolerance;timeToWait += CookManager.TIME_TO_COOK;timeToWait += WaitorManager.TIME_TO_DELIVER;Thread.sleep(timeToWait);assertTrue(orders[0] + " hsould is ready", orders[0].isReady());assertTrue(orders[1] + " is ready", orders[1].isReady());}public void testThreeOrders() throws InterruptedException {System.out.println("============ start testing three orders =============");final Order orders[] = createOrders(3);int timeToWait = tolerance;timeToWait += CookManager.TIME_TO_COOK;timeToWait += WaitorManager.TIME_TO_DELIVER;Thread.sleep(timeToWait);assertTrue(orders[0] + " is ready", orders[0].isReady());assertTrue(orders[1] + " is ready", orders[1].isReady());timeToWait = tolerance;timeToWait += WaitorManager.TIME_TO_DELIVER;Thread.sleep(timeToWait);assertTrue(orders[2] + " is ready", orders[2].isReady());}public void testFourOrders() throws InterruptedException {System.out.println("============== start testing four orders ===============");final Order orders[] = createOrders(4);int timeToWait = tolerance;timeToWait += CookManager.TIME_TO_COOK;timeToWait += WaitorManager.TIME_TO_DELIVER;Thread.sleep(timeToWait);assertTrue(orders[0] + " should be ready", orders[0].isReady());assertTrue(orders[1] + " should be ready too", orders[1].isReady());timeToWait = tolerance;timeToWait += WaitorManager.TIME_TO_DELIVER;Thread.sleep(timeToWait);assertTrue(orders[2] + " should be ready now", orders[2].isReady());timeToWait = tolerance;timeToWait += CookManager.TIME_TO_COOK;Thread.sleep(timeToWait);assertTrue(orders[3] + " is ready yet", orders[3].isReady());}public void testFiveOrders() throws InterruptedException {System.out.println("======================start testing five orders=====================");final Order orders[] = createOrders(5);int timeToWait = tolerance;timeToWait += CookManager.TIME_TO_COOK;timeToWait += WaitorManager.TIME_TO_DELIVER;Thread.sleep(timeToWait);assertTrue(orders[0] + " should be ready", orders[0].isReady());assertTrue(orders[1] + " should be ready too", orders[1].isReady());timeToWait = tolerance;timeToWait += WaitorManager.TIME_TO_DELIVER;Thread.sleep(timeToWait);assertTrue(orders[2] + " should be ready now", orders[2].isReady());timeToWait = tolerance;timeToWait += CookManager.TIME_TO_COOK;Thread.sleep(timeToWait);assertTrue(orders[3] + " is ready yet", orders[3].isReady());assertTrue(orders[4] + " is ready", orders[4].isReady());}public void testSixOrders() throws InterruptedException {System.out.println("======================start testing six orders=====================");final Order orders[] = createOrders(6);int timeToWait = tolerance;timeToWait += CookManager.TIME_TO_COOK;timeToWait += WaitorManager.TIME_TO_DELIVER;Thread.sleep(timeToWait);assertTrue(orders[0] + " should be ready", orders[0].isReady());assertTrue(orders[1] + " should be ready too", orders[1].isReady());timeToWait = tolerance;timeToWait += WaitorManager.TIME_TO_DELIVER;Thread.sleep(timeToWait);assertTrue(orders[2] + " should be ready now", orders[2].isReady());timeToWait = tolerance;timeToWait += CookManager.TIME_TO_COOK;Thread.sleep(timeToWait);assertTrue(orders[3] + " is ready yet", orders[3].isReady());assertTrue(orders[4] + " is ready", orders[4].isReady());timeToWait = tolerance;timeToWait += WaitorManager.TIME_TO_DELIVER;Thread.sleep(timeToWait);assertTrue(orders[5] + " is ready", orders[5].isReady());}public void testSevenOrders() throws InterruptedException {System.out.println("======================start testing seven orders=====================");final Order orders[] = createOrders(7);int timeToWait = tolerance;timeToWait += CookManager.TIME_TO_COOK;timeToWait += WaitorManager.TIME_TO_DELIVER;Thread.sleep(timeToWait);assertTrue(orders[0] + " should be ready", orders[0].isReady());assertTrue(orders[1] + " should be ready too", orders[1].isReady());timeToWait = tolerance;timeToWait += WaitorManager.TIME_TO_DELIVER;Thread.sleep(timeToWait);assertTrue(orders[2] + " should be ready now", orders[2].isReady());timeToWait = tolerance;timeToWait += CookManager.TIME_TO_COOK;Thread.sleep(timeToWait);assertTrue(orders[3] + " is ready yet", orders[3].isReady());assertTrue(orders[4] + " is ready", orders[4].isReady());timeToWait = tolerance;timeToWait += WaitorManager.TIME_TO_DELIVER;Thread.sleep(timeToWait);assertTrue(orders[5] + " is ready", orders[5].isReady());timeToWait = tolerance;timeToWait += CookManager.TIME_TO_COOK;Thread.sleep(timeToWait);assertTrue(orders[6] + " is ready", orders[6].isReady());}public void testEightOrders() throws InterruptedException {System.out.println("======================start testing eight orders=====================");final Order orders[] = createOrders(8);int timeToWait = tolerance;timeToWait += CookManager.TIME_TO_COOK;timeToWait += WaitorManager.TIME_TO_DELIVER;Thread.sleep(timeToWait);assertTrue(orders[0] + " should be ready", orders[0].isReady());assertTrue(orders[1] + " should be ready too", orders[1].isReady());timeToWait = tolerance;timeToWait += WaitorManager.TIME_TO_DELIVER;Thread.sleep(timeToWait);assertTrue(orders[2] + " should be ready now", orders[2].isReady());timeToWait = tolerance;timeToWait += CookManager.TIME_TO_COOK;Thread.sleep(timeToWait);assertTrue(orders[3] + " is ready yet", orders[3].isReady());assertTrue(orders[4] + " is ready", orders[4].isReady());timeToWait = tolerance;timeToWait += WaitorManager.TIME_TO_DELIVER;Thread.sleep(timeToWait);assertTrue(orders[5] + " is ready", orders[5].isReady());timeToWait = tolerance;timeToWait += CookManager.TIME_TO_COOK;Thread.sleep(timeToWait);assertTrue(orders[6] + " is ready", orders[6].isReady());assertTrue(orders[7] + " is ready", orders[7].isReady());}private Order[] createOrders(int count) {Order orders[] = new Order[count];for (int i = 0; i < count; i++) {final Order o = new Order("Pizza " + "#" + i);resturaunt.submitOrder(o);assertFalse(o + " not ready", o.isReady());orders[i] = o;}return orders;}
}

需要一个Resturant类,它仅接收定单,然后委派给CookManager和WaitorManager去做事,自己并不做事

package com.effectivejava.threading.basics;/** From this demo, we learn the lesson that why TDD is so good in development practice.* Without TDD, you are not assured that your programs work correctly.* TDD can, at least, assure you that your programs work.*/
public class Resturaunt {private String name;private int cookLimit;private int waitorLimit;private CookManager cookManager;private WaitorManager waitorManager;public Resturaunt(String name) {this.name = name;cookLimit = 3;waitorLimit = 2;System.out.println("Resturation: " + name + " is open now, Welcome everyone!");cookManager = new CookManager(this, cookLimit);waitorManager = new WaitorManager(waitorLimit);}public void submitOrder(Order o) {cookManager.prepareFood(o);}/** There is a problem: waitor #1 always do more work than waitor #2.* Because food delivery is quick to finish, so when food is preparing, waitor #1 finishes its* delivery and back to queue. When food is prepared, it is waitor #1 to deliver because it is* on the head of the queue.* Solution:* When waitor or cook is about to deliver or cook, remove it from the queue and push it onto* the queue after it finishes.*/public void foodPrepared(Order o) {waitorManager.deliverFood(o);}public void closeDoor() {cookManager.knockOff();waitorManager.knockOff();System.out.println("Resturant: " + name + " is closed now, welcome to come tomorrow!");}
}

接下来是CookManager:它要负责调度厨师们来工作,给他们分配任务,并管理定单,当没厨师时或没定单时都要空闲等待,同时还要监听,当菜做完后通知WaitorManager来送菜。因为厨师只由CookManager来管理,并不直接与外界沟通,所以Cook类可以做为CookManager的内部类
package com.effectivejava.threading.basics;import java.util.ArrayList;
import java.util.List;public class CookManager implements Runnable {public static final int TIME_TO_COOK = 200;private boolean knockedOff;private List<Cook> availableCooks;private Resturaunt resturaunt;private int cookLimit;private List<Order> ordersToPrepare;public CookManager(Resturaunt r, int cl) {knockedOff = false;resturaunt = r;cookLimit = cl;availableCooks = new ArrayList<Cook>(cookLimit);availableCooks.add(new Cook("Cook #1", this));availableCooks.add(new Cook("Cook #2", this));availableCooks.add(new Cook("Cook #3", this));ordersToPrepare = new ArrayList<Order>();new Thread(this).start();}public void prepareFood(Order o) {synchronized (ordersToPrepare) {ordersToPrepare.add(o);ordersToPrepare.notify();}}public void foodPrepared(Cook shef, Order o) {synchronized (availableCooks) {availableCooks.add(shef);availableCooks.notify();}resturaunt.foodPrepared(o);}public void run() {System.out.println("Cook manager start working...");while (!knockedOff) {synchronized (ordersToPrepare) {while (ordersToPrepare.size() < 1) {try {ordersToPrepare.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("OrdersToPrepare: " + ordersToPrepare);Cook shef = null;for (Cook cook : availableCooks) {if (!cook.isCooking()) {cook.prepareFood(ordersToPrepare.remove(0));shef = cook;break;}}synchronized (availableCooks) {availableCooks.remove(shef);}}synchronized (availableCooks) {while (availableCooks.size() < 1) {try {availableCooks.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}System.out.println("Cook manager knocked off");}public void knockOff() {for (Cook c : availableCooks) {c.knockOff();}knockedOff = true;}private class Cook implements Runnable {private String name;private boolean knockedOff;private Order order;private CookManager manager;public Cook(String n, CookManager m) {name = n;manager = m;order = null;new Thread(this).start();}public void prepareFood(Order o) {synchronized (this) {System.out.println(this + "Start Cooking " + o);order = o;notify();}}public void run() {while (!knockedOff) {synchronized (this) {while (order == null) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}}System.out.println(this + "Cooking " + order);try {Thread.sleep(CookManager.TIME_TO_COOK);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(this + "Food " + order + " is cooked, ready to deliver");final Order o = order;synchronized (this) {order = null;}manager.foodPrepared(this, o);}}public void knockOff() {knockedOff = true;;}public boolean isCooking() {return order != null;}@Overridepublic String toString() {return name + " ";}}
}

WaitorManager也是一样,管理待送的菜和调度Waitor
package com.effectivejava.threading.basics;import java.util.ArrayList;
import java.util.List;public class WaitorManager implements Runnable {public static final int TIME_TO_DELIVER = 50;private boolean knockedOff;private int waitorLimit;private List<Waitor> availableWaitors;private List<Order> ordersToDeliver;public WaitorManager(int wl) {knockedOff = false;waitorLimit = wl;availableWaitors = new ArrayList<Waitor>(waitorLimit);availableWaitors.add(new Waitor("Waitor #1", this));availableWaitors.add(new Waitor("Waitor #2", this));ordersToDeliver = new ArrayList<Order>();new Thread(this).start();}public void deliverFood(Order o) {synchronized (ordersToDeliver) {ordersToDeliver.add(o);ordersToDeliver.notify();}}public void foodDelivered(Waitor w) {synchronized (availableWaitors) {availableWaitors.add(w);availableWaitors.notify();}}public void run() {System.out.println("Waitor manager start working...");while (!knockedOff) {synchronized (ordersToDeliver) {while (ordersToDeliver.size() < 1) {try {ordersToDeliver.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("ordertodeliver: " + ordersToDeliver);Waitor w = null;for (Waitor waitor : availableWaitors) {if (!waitor.isDelivering()) {waitor.deliverFood(ordersToDeliver.remove(0));w = waitor;break;}}synchronized (availableWaitors) {availableWaitors.remove(w);}}synchronized (availableWaitors) {while (availableWaitors.size() < 1) {try {availableWaitors.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}System.out.println("Waitor manager knocked off");}public void knockOff() {for (Waitor w : availableWaitors) {w.knockOff();}knockedOff = true;}private class Waitor implements Runnable {private String name;private Order order;private boolean knockedOff;private WaitorManager manager;public Waitor(String n, WaitorManager m) {name = n;order = null;manager = m;new Thread(this).start();}public void deliverFood(Order o) {synchronized (this) {System.out.println(this + "Start delivering " + o);order = o;notify();}}public void run() {while (!knockedOff) {synchronized (this) {while (order == null) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}}System.out.println(this + " delivering " + order);try {Thread.sleep(WaitorManager.TIME_TO_DELIVER);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(this + "Food " + order + " is delivered, food is ready");synchronized (this) {order.ready();order = null;}manager.foodDelivered(this);}}public void knockOff() {knockedOff = true;}public boolean isDelivering() {synchronized (this) {return order != null;}}@Overridepublic String toString() {return name + " ";}}
}

最后是数据类型Order类,仅是一个数据
package com.effectivejava.threading.basics;public class Order {private boolean ready;private String name;public Order(String n) {name = n;ready = false;}public boolean isReady() {return ready;}public void ready() {ready = true;}@Overridepublic String toString() {return name;}
}

总结

这个问题说难不难,但是要想写的正确真不是一件容易的事,也不可能在一二个小时内解决,前前后后花了我近一周的时间才能写到现在的程度,但现在我还不敢保证正确。当然,也许牛人或者高手能很快就解决,所说明我还需要更多的努力。但至少可以证明一点:有关多线程的问题很难编写和调试。对于这个例子来说,虽然预期一和二同时完成,但很难确定它们的顺序,因为线程的运行是不确定的。对于这个例子如果把tolerance改小一个些,或者把TIME_TO_COOK,TIME_TO_DELIVER改大一些,就会有Case失败。

拓展

1. N个厨师,M个服务员,基于我的程序来改,一点不难,还是难在测试上面,如何保证它是正确的。
2. 服务员还有收拾桌子的任务
3. 厨师做菜的时间不固定,服务员送的时间也不固定,这样才更加真实。
真实的生活是很难模拟的,但是一个套优秀的系统和管理方式确实能大大的提高效率,就好比一些小餐馆一旦人过多了,即使只一会儿,也会让餐馆陷入混乱:菜上的慢,客人等的急,没人收拾桌子,菜做错和送错等;但是对于大餐馆来说却总能应付的来,即使是像婚庆或者酒会。
水平浅,真心希望能有牛人来实现一个版本让我参考。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/350965.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

AI模拟面试官项目实战 | 项目概述

&#x1f3af;摘要 看完本文&#xff0c;你可能有如下收获&#xff1a; 了解该项目的预览效果、了解技术栈、系统设计以及教程食用指南 ⭐️⭐️该收获仅供参考&#xff0c;真实收获以实物为准&#x1f607;&#x1f607; ☀️系统概述 【AI模拟面试官】是一个模拟线上面试的…

软件测试面试题【2021模拟面试整理版(含答案)】

点击上方蓝色“程序员一凡”&#xff0c;选择“设为星标” 主页点击“领取资料”获取整理好的学习资源 一、问题预测 \1. 让简单介绍下自己&#xff08;每次面试开场&#xff09; \2. 让说下自己会的内容 \3. 看了哪些书籍&#xff08;有问到&#xff09; \4. 了解过哪些技…

Java程序员模拟面试,解析面试困扰和建议

模拟面试&#xff0c;相信大多数程序员都没有经历过&#xff0c;甚至还有从来没听说针对面试的辅导或者模拟面试啥的&#xff0c;所有的面试经验都来源于网上写的一些文章&#xff0c;然后再在面试的时候通过各种碰壁去揣测面试官在想啥。 前言 前几天组织了一次模拟面试直播&…

模拟面试题一

一、选择题 1、python不支持的数据类型有 A、charB、intC、floatD、list 1 参考答案&#xff1a;A 参考答案 2、打印输出结果&#xff1a;x "foo"y 2print(x y)A.foo B.foofoo C.foo2 D.2 E.An exception is thrown 1 D &#xff1a;一个是字符串&#…

前端面试题总结:模拟面试

1&#xff0c;问&#xff1a;请先自我介绍&#xff1f; 答&#xff1a;略 二&#xff0c;技术知识题 1&#xff0c;问&#xff1a;看你简历有项目经历&#xff0c;那在你之前的项目中&#xff0c;用到的技术栈有哪些&#xff1f; 答&#xff1a;主要使用过vue和微信小程序&…

模拟面试题回顾

模拟面试题回顾 1.servlet里面有哪些关键的方法&#xff1f; 讲到它的方法&#xff0c;就不可避免地去了解servlet的运行过程(也可以说是生命周期)&#xff0c;如下图所示&#xff1a; 它的四个过程&#xff1a; ​ (1).当客户端第一次发送请求后&#xff0c;由容器&#xf…

java-模拟面试

讲一下快速排序算法 通过一次排序将数列分为两部分&#xff0c;一部分比另一部分数字都小 时间复杂度O(nlogn) 空间复杂度O(1) 先确定一个中间比较值&#xff0c;确定一个左指针&#xff08;从头开始&#xff09;&#xff0c;右指针&#xff08;从尾部开始&#xff09; while循…

如何模拟面试?

我是艾木&#xff1a; 1.从学生到职场 当初毕业找工资的场景&#xff0c;至今还记忆犹新。 当时的自己还是学生的身份&#xff0c;正处于找工作的浪潮中&#xff0c;当时的校园招聘如火如荼&#xff0c;工作岗位也琳琅满目。一时间仿佛置身于百货商场之中&#xff0c;每个人都在…

微信小程序 | 基于ChatGPT实现模拟面试小程序

Pre:效果预览 ① 选择职位进行面试 ② 根据岗位职责进行回答 一、需求背景 这两年IT互联网行业进入寒冬期,降本增效、互联网毕业、暂停校招岗位的招聘,各类裁员、缩招的情况层出不穷!对于这个市场来说,在经历了互联网资本的疯狂时代,现在各大需要的时候更多能实实在在挣…

ChatGPT专业应用:模拟求职面试

正文共 663 字&#xff0c;阅读大约需要 3分钟 应届毕业生求职面试必备&#xff0c;您将在3分钟后获得以下超能力&#xff1a; 1.专属面试导师 2.掌握高频面试题回答要点 Beezy评级&#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 …

Python入门教程+项目实战-13.2节-集合的操作方法

目录 13.2.1 集合的常用操作方法 13.2.2 集合的查找 13.2.3 集合的添加 13.2.4 集合的删除 13.2.4 集合运算 13.2.5 知识要点 13.2.6 系统学习python 13.2.1 集合的常用操作方法 集合类型是一种抽象数据类型&#xff0c;抽象数据类型定义了数据类型的操作方法&#xff…

谈谈互联网广告拍卖机制的发展:从GSP到DeepAuction

广告作为各互联网公司收入的大头&#xff0c;其拍卖机制设计因此也是关乎营收最为核心的方面。所谓的广告拍卖机制设计是指如何将有限的广告位分配给合适的广告&#xff0c;从而达到客户、平台以及用户三方的价值最优。 当前的广告拍卖被建模为暗拍的形式&#xff0c;即N个广告…

音乐人解密:究竟是如何一步一步成为音乐人的?

音乐人解密&#xff1a;究竟是如何一步一步成为音乐人的&#xff1f; 音乐是人类伟大的产物&#xff0c;近些年来越来越多的人都开始尝试学习音乐&#xff0c;成为一名音乐人。而艺术高考等途径也为许多想要学习音乐、成为职业歌手或者编曲师的人群提供了途径。然而想要成为一名…

C++学习之旅 - 指针

文章目录 指针的基本概念指针的定义与使用指针占用的内存空间空指针野指针cont修饰指针指针&数组访问数组中第一个元素(访问&指针)如何访问数组中的第二个字节 指针和函数 指针的基本概念 指针的作用: 可以通过指针间接访问内存 内存编号是从0开始记录的&#xff0c;一…

linux find命令格式及find命令详解

本文详细介绍了linux find命令格式及find命令案例&#xff0c;希望对您的学习有所帮助。1、find命令的一般形式为&#xff1b; find pathname -options [-print -exec -ok ...]2、find命令的参数&#xff1b; pathname: find命令所查找的目录路径。例如用.来表示当前目录&#…

app渗透-常见问题及绕过

app渗透-常见问题及绕过 6.app常见问题和绕过前言6.1反代理操作前言6.1.1判断6.1.2实例演示-探探6.1.3绕过1-r0capture6.1.4绕过2-proxifier6.1.5绕过3-小黄鸟 6.2证书校验前言6.2.1判断6.2.2浏览器校验和解决6.2.3桡过证书单项校验-xp框架6.2.3绕过证书双向校验 6.app常见问题…

findIndex的使用

1. findIndex:没有符合条件的元素返回-1 2. 当findIndex符合元素的条件时会返回元素的索引位置 eg:权限管理中查找item中的每一项对数据中存在的某项固定存在的值进行对比。 代码&#xff1a;

Linux下使用find命令查找文件

0、find 命令&#xff0c;查找目录下以2022开头的文件 find / -name "2022*" 1、find 命令&#xff0c;查找类型为文件并且文件名称以2022开头的文件 find . -type f -name "2022*" 2、find命令统计查找出来的文件总数量 find . -type f -name "…

Linux find命令详解

基础打印操作 find命令默认接的命令是-print&#xff0c;它默认以\n将找到的文件分隔。可以使用-print0来使用\0分隔&#xff0c;这样就不会分行了。但是一定要注意&#xff0c;-print0针对的是\n转\0&#xff0c;如果查找的文件名本身就含有空格&#xff0c;则find后-print0仍…

find()和findIndex()函数详解

今天我在拿数组中的存在的某一项索引时&#xff0c;我用了filter()&#xff0c;结果折腾了半天还是没求出索引&#xff0c;结果询问同事&#xff0c;他说你直接用findIndex()就可以了&#xff0c;一语点醒梦中人&#xff0c;可能平时ES6的这些函数用的少&#xff0c;根本就想不…