自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 递归、搜索与回溯算法

当n==n时,要将A中n-1个盘子放到B上,第n个盘子放到C上,再将B上的盘子通过A放到C上即可。把n-1个盘子放到B上的过程与将A中n-1放到C上的过程相同,所以可以用递归来解决。当n==2时,要将A中最下面盘子上方的盘子放到B上,最下面盘子放到C上,再将B上的盘子通过A放到C即可;当n==3时,要将A中最下面盘子上方的盘子放到B上,最下面盘子放到C上,再将B上的盘子通过A放到C即可。大问题->相同类型的子问题 子问题->相同类型的子问题。

2023-08-12 21:09:51 231

原创 细谈动态规划

如果正序遍历,dp[1] = dp[1-weight[0]]+value[0],dp[2] = dp[2-weight[0]]+value[0],那么0物品就被放入了两次。b.当选取i物品时,dp[i-1][j-weight[i]]是不放i物品的最大价值,那么dp[i-1][j-weight[i]]+value[i]就是放i物品的最大价值;即dp[i][0]=1,dp[0][j]=1;a.当不选取i物品,那dp[i][j]直接可以由dp[i-1][j]得出,即dp[i][j] = dp[i-1][j];

2023-08-02 16:02:39 277

原创 细谈贪心算法

局部最优:删除上升或下降坡度中间的值,就得到了两个局部峰值;全局最优:保留整个序列中最多的局部峰值,就是最长序列。局部最优:前一个连续和与当前值的和小于当前值,说明当前连续和不合适了,应该立即放弃,重新更新连续和计算起点。局部最优:先用最小的饼干喂饱胃口小的孩子,充分利用每一个饼干的尺寸;全局最优:遍历数组结束后,选取最大连续和。局部最优:以最小的步数覆盖最大的范围。4.将局部最优解堆叠成全局最优解。3.求解每⼀个子问题的最优解。全局最优:所有局部最优的和。全局最优:覆盖最终范围。局部最优:当前值为正。

2023-07-31 16:18:16 241

原创 Java面试复习大纲

面向对象面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情,而不关注问题解决的具体过程。例如:在使用洗衣服的过程中:四个对象:人,衣服,洗衣粉,洗衣机洗衣服的过程:人将衣服放入洗衣机中,往洗衣机中倒入洗衣粉,启动洗衣机,洗衣机完成洗衣过程并且将衣服甩干。由上述过程可以看出:整个洗衣服的过程是以上四个对象之间交互所完成的,人不需要关注洗衣机具体如何工作的。这就是面向对象的思想。类和对象类是对一个实体进行的抽象描述。例如:定义一个学生类注意事项:一般一个文件当中只定义一个类;

2023-03-16 16:39:19 373

原创 博客系统SSM版

所以存储时要将盐值存储起来,这里将最终密码和盐值存储到一个字段中,因为最终密码和盐值都是32位的字符串,则设置一个64位的字段,前32位字符串为盐值,后32位字符串为最终密码来存储,将该字段存储到数据库中。先检查是否登录,如果已经登录,则像后端发送请求,查看是否发表过文章,如果已有发表文章,通过forEach函数将文章依次显示出来;如果未发表文章,显示暂无数据;如果未登录,显示用户未登录,即将跳转,后跳转到登录页面。先检查用户是否登录,如果已经登录,向后端发送请求,查询到用户信息后返回给前端,显示到页面;

2023-02-08 19:22:00 265

原创 从零开发搜索引擎

文档内容固定,分词结果也固定,完全可以在预处理阶段把标题和正文的分词好保持在raw_data.txt中,后续创建索引时直接加载分词结果即可,不需要重复进行分词。用户点击搜索框输入查询词之后点击搜索,将会在服务器中检索出所有与查询词相关的文档,并且将这些文档返回到页面上,用户点击搜索结果,就会跳转到文档的详细页面。每一行对应一个文档,有三列,这三列使用\3分割,包含文档的标题,这个文档的url(线上版本的url),正文(去掉html标签)。把相关程度越高的文档排的越前,相关程度越低的文档排的越后。

2022-12-20 21:28:43 976

原创 web自动化-Junit

在编写用例时要尽量保持用例的独立性,但是用例之间如果存在关联关系时,就需要手动的指定用例的执行顺序。(添加了@ParameterizedTest注解之后就不需要添加@Test注解,如果添加就会再执行一遍)Junit的默认执行顺序不确定,下列执行顺序是通过Junit提供的方法手动设置的执行顺序。@MethodSource(方法名) 不指定方法名时,会调用与它同名的静态方法。执行包下面所有的以Test命名的文件中的所有@Test注解的用例。@ValueSource(类型={参数1,参数2,……

2022-12-16 16:35:13 159

原创 web自动化--selenium

隐式等待:driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));在规定时间范围内,轮询等待元素出现之后就结束等待,如果在规定范围内,元素都没有出现,就会抛出noSuchElement()异常。随着功能的增加,版本越来越多,版本回归的压力越来越大,仅仅通过手工回归所有版本是不现实的,需要借助自动化回归。代码执行效率比较快,而前端页面渲染比较慢,可能代码已经执行到下一步,前端却还没有渲染完成,从而导致元素找不到。By.xpath();

2022-12-15 17:42:30 369

原创 黑盒白盒测试

灰盒测试没有白盒测试详细,完整,黑盒测试是覆盖产品功能范围最广的测试,所以灰盒测试是不能取代白盒测试和黑盒测试的,但是黑盒测试是可以取代灰盒测试的,但是不建议,需要消耗很大的代码,需要设计很多测试用例。其目的是通过检查软件内部的逻辑结构,对软件中的逻辑路径进行覆盖测试。常见白盒测试的方法:语句覆盖,判定覆盖,条件覆盖,判定条件覆盖,条件组合覆盖,路径覆盖。(也可以根据面试情况介绍白盒测试的逻辑覆盖法,基本路径法等,和黑盒测试的等价类等方法)常见的黑盒测试的方法:等价类,边界法,判定表等。

2022-11-29 23:12:39 252

原创 软件测试-测试用例

由上述测试用例可知,在测试过程中,如果遇到密码要求特别多的情况下,如果采用穷举法设计测试用例,显然是不科学的,太过于浪费时间,因此了解以下测试方法才能够有效率的进行测试。等价类划分法:正对需求输入范围分为若干个等价类,从其中一个等价类中取出一个测试用例,如果该测试用例通过,则说明该测试用例所在的等价类中所有的测试用例都通过。在遇到一个待测试问题时,凭借随机惯性思维,想出的答案一般都是有限的,要采用一定的顺序和条例,以更加全面的角度来构造测试用例。无效等价类:正对需求来说,没有意义的,不合理的输入数据集合。

2022-11-26 17:08:11 1213

原创 软件测试-bug详解

实际的结果:进入首页后,鼠标扫到圆形功能框位置时,有时功能框出现消失的情况,有时功能框变为白色,系统这个功能不太稳定,可能影响用户正常使用。造成系统崩溃,死机,死循环,导致数据库数据丢失,与数据库连接错误,主功能丧失,基本模块缺失等问题。如果修改状态的bug经过测试人员的回归测试验证后未通过,则需要重新打开bug,开发人员需要重新修改。系统主功能部分丧失,数据库保存调用错误,用户数据丢失,以及功能菜单不能使用但不影响其他功能的使用。新发现的bug,测试人员在测试过程中发现的bug,测试人员创建bug。

2022-11-23 23:07:44 1037

原创 软件测试开发-测试模型

瀑布模型中测试被后置,需要留足够的时间用于测试,如果到后期时间紧张,就会导致测试被充分,缺陷遗留给用户。同时风险遗留到后期,失去了及早纠正问题的机会,且瀑布模型不能很好的迎接变化。设用场景:需求固定的小型项目。

2022-11-23 21:36:57 197

原创 软件测试概念

在面对软件产品时,要想要利用该软件来盈利,就要对软件进行相应的测试,看看它目前的功能,界面,兼容性等符不符合当前用户的使用需求,只有满足了用户需求,才能产生消费,进而增加用户量,获得盈利。在生活中面对各种各样的产品例如衣服,家具等,都会根据它的各方面情况是否符合我们的要求来购买,对衣服来说包括材质,手感,洗涤方式等。充分理解用户的需求,参与需求文档的评审,以测试人员的角度对需求文档进行正确性和准确性两方面的检查。例如:市场分析:有没有足够的需求用户 投入和需求的占比等。相比之下,开发的专业度更高,广度小。

2022-11-23 20:24:13 164

原创 Bean的作用域和生命周期

该作⽤域下的Bean在IoC容器中只存在⼀个实例:获取Bean,通过applicationContext.getBean等⽅法获取,及装配Bean,通过@Autowired注⼊,都是同⼀个对象。每次对该作⽤域下的Bean的请求都会创建新的实例:获取Bean,通过applicationContext.getBean等⽅法获取,及装配Bean,通过@Autowired注⼊都是新的对象实例。在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bean实例。只能在Spring WebSocket中使⽤。

2022-11-16 14:45:40 122

原创 Spring中存取Bean的注解

就引入了一个问题,在实际开发过程中,Tire类的构造函数不能确定,可能有颜色要求,长度要求等,所以一旦减少或增加,就需要改变之前的所有类中的代码。IoC:在构造每个类时,都不创建所依赖的对象,改用传递的方式,则只在Tire类·中构造对应的函数,达到了解耦的效果,所以如果要减少或者增加属性时,只需要修改Tire类即可。要想实现IoC,就得在相应类中注入所需要下一个类的对象,而不在本类中new该对象。依赖对象是在构造方法中执行的,而构造方法是在对象创建之初执行的,因此被注入的对象在使用之前,会被完全初始化。

2022-11-14 13:15:28 1218

原创 垃圾回收算法

将新创建的对象放到伊甸区,如果该对象活过了一轮GC就放入幸存区,进入幸存区的对象再经历了一轮GC后,又通过复制算法进入另一个幸存区中,如果经过多轮GC,该对象仍然存在,就说明该对象一时间不容易被销毁,就把它放入老年代中,进入老年代之后就通过标记整理算法进行处理。先通过可达性分析确定垃圾,就把垃圾直接释放掉,但是垃圾不是一个连续的内存空间,而new操作时,又要new出来一段连续的内存空间,就引起了内存碎片问题,造成了空间的浪费。(2) 如果是小的对象,引用次数过多,引用计数就会造成较大的空间开销。

2022-10-27 21:33:45 200

原创 类加载(必背八股文)

双亲指派模型就是在这个基础上展开的规则,如果要加载一个类,JVM首先调用这个类加载器进行加载,ApplicationClassLoader(底层员工)不会先扫描自己的目录,而是先找父类加载器,也就是ExtensionClassLoader(中层领导)也不会先扫描自己的目录,而是先找父类加载器,也就是BootStrapClassLoader(高管)此时它没有父类加载器,只能扫描自己。当真正进行类加载的过程中,就可以把字符串常量真正的放到内存中,把对应的内存地址替换刚才的占位符号。u4:四字节的无符号整数。

2022-10-27 20:14:13 155

原创 Cookie 和 Session 的工作流程

(1)浏览器存储服务器发送的数据时,就会在HTTP响应报文中header加入Set-Cookie。(2)浏览器给服务器返回数据时,此时发送的HTTP请求报文中header加入Cookie属性。Cookie以键值对形式存储数据,只能存字符串,并且按照域名分类储存。Cookie是浏览器给HTTP协议提供的一个持久化存储数据的方案。

2022-10-16 18:48:50 138

原创 HTML常用标签

1.注释标签2.标题标签3.段落标签4.换行标签5.格式化标签6.图片标签7.超链接标签8.表格标签9.列表标签10.表单标签11.无语义标签

2022-09-08 16:17:54 87

原创 细谈IP协议

路由器上进行路径规划的时候,不能保存所有的信息,每个路由器只能保存位置信息的一部分,例如,在我们到达一个新的未知地点且没有地图的情况下,只能采取问路的方式寻找目的地,每次问路就相当于一次“路由转发”,每个路由器保存的位置信息,也就是问路时每个人说出的一些位置信息就相当于“路由表”,所要去的目的地就是“目的IP”。4个服务类型:(1)最小延时,(2)最大吞吐量,(3)最高可靠性,(4)最小成本。现在的分法主要采用CIDR,引入了子网掩码来区分,左侧都是1,右侧都是0,标记为1的部分就是网络号。......

2022-08-13 17:02:14 689

原创 TCP协议的那些事儿

流量控制本质上是对滑动窗口的制约,滑动窗口是窗口越大,发送效率越高,流量控制则是针对滑动窗口进行制约,如果发送效率>接收效率,再增加滑动窗口大小来提高发送效率,也不能提高整体的效率,反而会因为接收方丢包,触发更多超时重传,降低效率。在发送数据时,每次传输都需要等待ACK,收到ACK之后再发送新的数据,在滑动窗口的情况下,可以在被等待的前提下最多可以发送N条数据,此时的N就是滑动窗口的大小,N越大即同时发送的数据越多,传输的效率就越高,但是N的值也不是越大越好,传输效率是受发送效率和接收效率影响。...

2022-08-12 21:13:43 614

原创 “三次握手“ 和“四次挥手“

因为服务器B返回ACK是操作系统内核的行为,操作系统内核收到FIN后,就会立即返回ACK,而服务器B的FIN是用户代码的行为,用户在代码中调用socket.close()方法才会触发FIN,因此服务器B发送FIN和ACK之间会有不可忽视的时间间隔,所以不能合并。经过以上四次交互,就完成了 建立连接的过程,客户端和服务器互相分别给对方发送了一个syn,再互相发送了一个ack,但是中间两次交互可以合并位为一次,每次数据报文传输都要经历一系列的封装分用,分成两个报来发送代价太大,所以称为"三次握手"。......

2022-08-09 15:48:43 138

原创 网络中的基本概念

网络通信是一个很复杂的过程,如果使用一个协议解决所有的问题,那么这个协议会很复杂,因此就会协议拆分,将一个协议拆分成几个协议,但是进行协议拆分之后发现解决的问题都差不多,就又把这些协议分类,就是协议分层,每一层都有很多协议,这些协议解决的问题都差不多。例如客户在网上购物的过程,物理层就相当于运输这个货物的公路,数据链路层就相当于两个集散点之间的运输,网络层相当于物流公司规划的运输路径,传输层就考虑起点和终点,最终的应用层就是客户收到货物后的使用方法。(4)传输层:两个点之间的通信,不考虑路径规划。...

2022-08-08 18:08:54 483

原创 File类的用法和InputStream OutputStream

目录:1.File类的用法2.InputStream OutputStream一.File类的用法文件系统提供了一个File类来表示一个文件。1.文件相关操作构造文件(基于一个路径来构造)(以上parent,child,pathname 既可以是绝对路径,也可以是相对路径)文件的相关方法二.InputStream OutputStream文件内容操作:(1)打开文件;(2)关闭文件;(3)读文件;(4)写文件在读写文件之前务必要打开文件,读写文件完毕之后务必要关闭文件。读写文件的类:

2022-08-05 22:11:18 551

原创 死锁的那些事儿

如果所有的哲学家都想吃面条时,同时拿起左手的筷子,但是当他们要拿起右手的筷子时,拿不起来,所有哲学家都在阻塞等待,导致一直吃不到面条。约定在获取多把锁时按照从小到大的顺序,比如线程要拿到1,2两把锁时,先获取锁1再获取锁2。线程1获取锁A,线程2获取锁B,但是当线程1尝试获取锁B,线程2尝试获取锁A时就构成死锁。(3)请求和保持当线程1拿到锁A之后,就会一直保持获取锁A的状态,直到主动释放。死锁的必要条件(1)互斥使用线程1拿到锁A,其他线程无法获取A。1.一个线程一把锁(可重入锁)...

2022-08-01 19:23:58 72

原创 HashTable, HashMap, ConcurrentHashMap 之间的区别

使用HashTable,如果多线程操作两个元素,由于使用一个synchronized加锁就会产生竞争,但是我们知道这两元素在不同的哈希桶上,不相关,不会修改同一个变量,不存在竞争,所以此时用synchronized加锁,反而拖慢了进程的速度。(4)扩容化整为零,没有将整个扩容一次性完成,而是每次基本操作都扩容一部分,逐渐完成整个扩容。(如果在扩容途中进行查询操作,新表旧表要求哈,但是新增时,对新表进行操作)(1)把锁的粒度细化,每个哈希桶有一把锁(每个链表的头节点),降低了锁冲突。...

2022-08-01 18:28:16 580 2

原创 锁策略(CAS synchronized)

synchronized特性1.开始时乐观锁,如果所冲突频繁,就转换为悲观锁了。2.即是轻量级锁,也是重量级锁。3.轻量级锁由自旋锁实现,重量级锁由挂起等待锁实现。ABA问题例如在银行存取款的情况,比较余额,余额相同时进行修改,但是余额可以变大可以变小,所以就引入了版本号,约定版本好只增不减来避免ABA问题。owner不为null时,说明当前锁正在被其他线程占用,继续循环。synchronized加锁过程1.未加锁。2.偏向锁(刚开始加锁,未产生竞争)。3.轻量级锁(产生了锁竞争)。...

2022-07-31 15:21:06 206

原创 volatile的作用

但是由于读内存比读CPU寄存器慢几千倍,几万倍,即当前的t1的操作主要慢在LOAD上,编译器发现每次LOAD的结果都一样,就直接进行优化,相当于只从内存中读取一次,然后后续直接从寄存器里进行反复TEST。则会导致一种特殊情况,编译器看到这个线程没做修改,所以就进行了优化,但是其他的线程对这个变量修改了!volatile操作相当于显式的禁止了编译器进行优化,是给这个对应这个变量加上了“内存屏障”(特殊的二进制指令),JVM因为有这个内存屏障的存在,每次都会重新读取整个内存的结果,而不是草率的进行优化。...

2022-07-27 16:50:23 150

原创 Java线程的几种状态

系统里面的线程已经执行完毕,销毁了,(相当于线程的run执行完了),但是Thread对象还在。5.TIMED_WAITING排队等待其他事情,由于线程中通过sleep()进入阻塞状态。4.WAITING排队等待其他事情,由于线程中调用了wait()进入阻塞状态。创建了Thread对象,但是还没有调用start方法。系统内核里还没有线程。2.RUNNABLE可工作的,又可以分为正在工作中和即将开始工作。3.BLOCKED排队正在等待锁,进入阻塞状态。1.NEW安排了工作,还没考试行动。......

2022-07-24 20:48:18 728

原创 Thread类的基本用法

创建实例不等于在操作系统内核中创建出了线程,只有调用了start()才是真正的创建出线程。(4)实现Runnable重写run()使用匿名内部类;(3)继承Thread重写run()使用匿名内部类;(5)使用lambda表达式;(2)实现Runnable重写run();(1)继承Thread重写run();一.线程创建start()......

2022-07-24 15:55:00 334

原创 进程和线程的区别与联系

一个线程是一个“执行流”,每个线程之间都可以按照顺序执行自己的代码,多个线程“同时”执行多份代码。4.多个进程同时执行时,如果一个进程崩溃,一般不会影响其他进程,而同一进程内的多个线程之间,如果一个线程崩溃,很可能使得整个进程崩溃。每个进程都有独立的虚拟地址空间,也有之间独立的文件描述符表,同一进程的多个线程之间则共用这一份虚拟地址空间和文件描述符表。3.进程是操作系统中资源分配的基本单位,线程是操作系统中调度执行的基本单位。2.进程之间的资源是独立的,线程之间的资源则是共享的。...

2022-07-21 16:40:11 19820

原创 操作系统进程调度

1.进程调度的基本概念。2.进程调度的四个关键属性。3.进程的隔离和通信。

2022-07-21 16:12:23 1611

原创 图书管理系统Java SE

还在为搞不定如何编写图书管理系统而焦头烂额的话,进来看看吧!

2022-04-15 21:52:25 320

原创 数组的定义与使用

1.什么是数组。数组是相同元素的一个集合。在内存中占有一段连续的空间。即:数组存放的元素类型相同,数组的空间是连在一起的,每个空间都有自己的编号即数组的下标。2.数组的创建。元素类型[] 数组名 = new 元素类型[数组长度];例如:int[] array = new int[100];double[] array =new double[100];3.数组的初始化。(1)动态初始化:可在创建数组时直接指定数组中元素的个数。(2)静态初始化:在创建数组时不具体

2022-03-22 22:35:32 300

原创 JDK,JRE,JVM之间的关系

JDK(Java Development Kit):Java开发工具包,提供给Java程序员使用。JRE(Java Runtime Environment):Java运行时环境,是使用Java语言编写程序运行的所需环境。JVM:Java虚拟机,运行Java代码。 JDK=JRE+开发工具集(比如:Javac) JRE=JVM+JavaSE标准类库注:由于以上JDK,JRE,JVM的作用,在运行Java程序前,必须先安装好JDK。...

2022-03-05 14:36:38 6495

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除