- 博客(111)
- 收藏
- 关注
原创 KMP算法
很久之前就学习了KMP算法 , 也在网上查阅了许多的资料 , 但是一直对KMP算法的代码不甚熟悉 . 如果单纯靠背诵代码 , 而不理解其本质 , 是舍本逐末 . 所以今天力求用简短之篇幅讲解KMP算法 , 一是回顾知识 , 二来希望能让本文的读者有一点启发 .
2023-04-15 19:13:53 621 1
原创 软件测试---JUnit
注意 : 当使用参数化时 , 不能添加@Test注解 , 这是因为该注解不支持带参数的方法!首先 , 官方并没有明确说明用例的默认执行顺序 , 我们可以通过order注解来进行排序 .目的 : 尽可能通过一个用例 , 多组参数的方法来模拟用户行为 .用于判断测试的执行结果和测试人员的预期是否一致 .下一篇将会介绍博客系统UI自动化测试!
2023-03-25 16:54:20 561
原创 软件测试---自动化
自动化可以有效减少人力的消耗 , 同时提高测试的质量和效率 . 例如在回归测试中 , 随着版本越来越多 , 版本回归的压力也越来越大 , 仅仅通过人工测试来回归所以版本显然是不现实的 , 所以我们需要借助自动化测试 .
2023-03-25 15:13:33 1195 2
原创 线程池的底层工作原理
3.如果此时线程池中的线程数量大于等于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolize,建新的线程来处理被添加的任务。6.当线程池中的线程数量大于corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。1.如果此时线程池中的线程数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
2023-03-06 18:01:48 331
原创 软件测试---测试分类
可靠性(Availability)即可用性,是指系统正常运行的能力或者程度,一般用正常向用户提供软件服务的时间占总时间的百分比表示。
2023-03-03 17:27:32 728
原创 软件测试---用例篇
测试用例的概念 : 测试用例(Test Case)是为了实施测试而向被测试的系统提供的一组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等要素 .好的测试用例是一个不熟悉业务的人也能依据用例来很快的进行测试 .如何评价测试用例设计的好坏呢?
2023-03-02 19:42:28 2090
原创 Tomcat中为什么要使用自定义类加载器?
一个Tomcat,不管内部部署了多少应用,Tomcat启动之后就是一个Java进程,也就是一个JVM,所以如果Tomcat中只存在一个类加载器,比如默认的AppClassLoader,那么就只能加载一个com.data.User类,这是有问题的 .一个Tomcat中可以部署多个应用,而每个应用中都存在很多类,并且各个应用中的类是独立的,全类名是可以相同的,比如一个博客系统中可能存在com.data.User类,一个库存系统中可能也存在com.data.User类 .
2023-03-02 16:49:16 467
原创 Java内部类
一般情况下,类和类之间是互相独立的,内部类的意思是打破这种独立,让一个类成为另外一个类的内部成员,和成员变量、成员方法同等级别。Q : 为什么要使用内部类?A : 采用内部类这种技术,可以隐藏细节和内部结构,封装性更好,让程序的结构更加合理。
2023-02-28 09:08:55 121
原创 Redis相关面试题
缓存穿透是指查询数据库和缓存都无数据,因为数据库查询无数据,出于容错考虑,不会将结果保存到缓存中,因此每次请求都会去查询数据库,这种情况就叫做缓存穿透 .缓存穿透执行流程如下图所示 :红色路线就是缓存穿透的结果 . 缓存根本没起到作用 , 好像被穿透了一样,每次都会去访问数据库 .如何解决缓存穿透问题呢?本质上就是要防止用户查不到数据!有以下几种方案 .缓存击穿指的是某个热点缓存,在某一时刻恰好失效了,然后此时刚好有大量的并发请求,此时这些请求将会给数据库造成巨大的压力,这种情况就叫做缓存击穿。
2023-02-27 20:40:51 347
原创 Java项目---博客系统
之前笔者已经使用Servlet结合MySQL实现了第一版的个人博客。框架升级:SSM版本,即(Spring + SpringMVC + MyBatis) ,结合MySQL、Redis以及JQuery。密码升级:明文存储/md5存储—>加盐处理。用户登录状态持久化升级:将session持久化到Redis/MySQL。功能升级:实现分页功能。使用拦截器升级用户登录验证。
2023-02-27 18:03:04 645
原创 Java数据结构与算法第十一课---反射、枚举以及lambda表达式
Class类代表类的实体,在运行的Java应用程序中表示类和接口 .Java文件被编译后,生成了.class文件,JVM此时就要去解读.class文件 .class也被JVM解析为一个对象,这个对象就是 java.lang.Class .这样当程序在运行时,每个java文件就最终变成了Class类对象的一个实例。我们通过Java的反射机制应用到这个实例,就可以去获得甚至去添加 , 改变这个类的属性和动作,使得这个类成为一个动态的类 .枚举是在JDK1.5以后引入的。
2023-02-23 16:58:51 461
原创 Enum枚举类没有values()方法,却可以在枚举类中使用,为什么?
这是由于java编译器在对enum关键字进行处理时,实际上是将enum转换成为了java.lang.Enum类的一个子类来完成,而这个子类中含有values()静态方法。如图,通过javap反编译TestEnum枚举类,可以看到编译器在对enum处理时,实际上是转换成了Enum的一个子类来实现的,里面可以看到有values()静态方法的声明。里面并没有values()静态方法,而在我们使用enum类时,却可以通过java编译器的提示得到values()静态方法,这是为什么呢?
2023-02-22 21:37:09 487
原创 JavaEE初阶---TCP/IP协议
" , 也就是自己制定一些规则 , 约定好客户端和服务器按照什么样的格式来传输数据 .领导下发一个任务 , 从任务下发到任务完成后提交 , 大致需要经历这些步骤 :我们在上一节中所写的"回显服务器" , 就隐含了应用层协议的约定 , 每个请求都以 \n 结尾 , 每个响应 , 也都以 \n 结尾 . 这是一个非常简单的约定 . 那么约定应用层协议 , 应该从哪些方面入手呢?以在淘宝店铺购买衣服为例 .1.考虑清楚 , 交互过程要传递的信息有哪些 .2.考虑清楚 , 这些信息的组织格式!
2023-02-14 23:17:06 360
原创 从浏览器输入URL开始 , 到最终看到页面 , 中间都发生了哪些事情 ?
上述过程是客户端给服务器发送请求的过程 . 后面服务器还要根据请求计算响应 , 把响应按照类似的流程转发给客户端 , 具体就取决于业务代码了!4.数据链路层的角度:以太网数据帧, mac地址, mac在转发过程中如何变化 , MTU , MTU影响到的IP分包。3.网络层的角度:网络数据报转发过程.一跳一跳的方式来转发.(路由表,路由表匹配规则,下一跳相关内容)6.总结:发送的过程中,涉及到从上到下 , 封装;2).传输数据(确认应答,超时重传,滑动窗口,流量控制,拥塞控制……2).构造HTTP请求。
2023-02-14 23:17:04 179
原创 详解子网技术
出于对网络管理、性能和安全方面的考虑,许多单位把较大规模的单一网络划分为多个彼此独立的物理网络,并使用路由器将它们连接起来。子网划分技术能够使一类网络地址横跨几个物理网络,这些物理网络统称为子网。
2023-02-14 18:13:56 1370 2
原创 多线程相关面试题
全称 Compare and swap, 即 “比较并交换”. 相当于通过一个原子的操作, 同时完成 “读取内存, 比较是否相等, 修改内存” 这三个步骤. 本质上需要 CPU 指令的支撑.如果发现当前版本号和之前读到的版本号一致, 就真正执行修改操作, 并让版本号自增;如果发现当前版本号比之前读到的版本号大, (说明已经修改过了!) 就认为操作失败.给要修改的数据引入版本号. 在 CAS 比较数据当前值和旧值的同时, 也要比较版本号是否符合预期.
2023-02-12 12:57:47 347
原创 锁机制面试题
如果获取锁失败, 立即再尝试获取锁, 无限循环, 直到获取到锁为止. 第一次获取锁失败, 第二次的尝试会在极短的时间内到来. 一旦锁被其他线程释放, 就能第一时间获取到锁.优点: 没有放弃 CPU 资源 , 一旦锁被释放就能第一时间获取到锁 , 更高效 . 在锁持有时间比较短的场景下非常有用.缺点: 如果锁的持有时间较长 , 就会浪费 CPU 资源 .读写锁就是把读操作和写操作分别进行加锁.读锁和读锁之间不互斥.写锁和写锁之间互斥.写锁和读锁之间互斥.
2023-02-12 12:56:49 372
原创 面向对象和面向过程的区别?
把代码中的有关联关系的内容放到一起 , 维护代码的时候容易找!强制将操作的变量和对应的函数放到了一起(同一个大括号内) . 容易找!面向过程 : 变量和函数之间的结构是松散的 , 即使函数在操作变量 , 但是仍然可以把这两部分代码放的很远.封装 , 继承 , 多态 都是后来发现的 , 高内聚之后 ,又额外带来的一些好处!面向对象最核心的特征就是"类和对象" →保证了代码的。面向对象 : 其实就是。
2023-02-12 12:46:54 77
原创 谈谈ArrayList和LinkedList的区别?
理论上 , 链表插入元素的时间复杂应该是O(1) , 因为只需要改变节点的前后指向即可 . 但是java标准库在设计LinkedList时出现了问题 , 导致没有发挥出链表的优势 . 在进行add(int index,E element)时 , 需要先遍历找到待插入的位置 , 然后将新节点插入进去 . 由于遍历找位置和插入是一个整体 , 这就导致LinkedList在插入元素时 , 时间复杂度是O(N) .7.综上所述 , ArrayList的优势是支持随机访问 , 且查找元素比较快;
2023-02-12 12:43:28 784
原创 Java是编译性语言还是解释型语言 ?
一种朴素的判定方式:如果翻译器部分较为简单,我们说这个语言是“解释的”,反之如果翻译器部分很复杂,我们就说这个语言是“编译的” .事实上这两者之间的界限是模糊的,因为“简单”和“复杂”都具有主观性 . “解释型”和“编译型”并不是一个清晰的描述 . 故强行将某种具有混合形式的语言划入两者之一是不当的。如果翻译器对程序进行了彻底的分析而非某种机械的变换,而且生成的中间程序与源程序之间没有很强的相似性,我们就认为这个语言是编译的 . 彻底的分析和非平凡的变换,是编译方式的标志性特征 .
2023-01-20 18:23:15 1314
原创 软件测试---概念篇
满足用户期望或正式规定文档(合同、标准、规范)所具有的条件和权能,包含用户需求和软件需求.用户需求为什么不可以直接作为测试/开发工作的依据呢?因为用户需求未必是合理的 . 我看过一个段子 , 有用户提出这样一个需求 : 能不能根据周围环境的颜色变化 , 动态地改变手机屏幕的颜色?这好吗?这不好!当然 , 如果用户需求是合理的 , 并且有开发的必要 , 那么产品经理就会将用户需求转变为软件需求文档 .
2023-01-10 16:39:05 1226
原创 JavaEE初阶---多线程(面试常用)
是操作系统/硬件,给JVM提供的一种更轻量的原子操作的机制.全称Compare and swap,字面意思:"比较并交换",是CPU提供的一个特殊指令 .一个CAS包含以下操作步骤 :假设内存中的原数据是V, 旧的预期值是A,需要修改的新值是B.比较A与V是否相等;如果比较相等 , 将B写入V;(交换)返回操作是否成功.注意:这一系列操作都是由一个CPU指令来完成的.想到个死锁的例子,健康码(没码进不去,进不去修不了,修不了没码,没码进不去).
2023-01-10 14:21:35 624
原创 谈谈HashMap,HashTable,ConcurrentHashMap之间的区别?
HashMap,HashTable,ConcurrentHashMap之间的区别?
2023-01-10 10:41:22 113
原创 简述 synchronized 和 ReentrantLock 之间的区别?
synchronized 和 ReentrantLock 都是 Java 中提供的可重入锁。可重入锁:什么是 “可重入”,可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。
2023-01-09 10:33:27 894
原创 JavaEE高阶---Spring事务和事务传播机制
Spring事务传播机制定义了多个包含了事务的方法,相互调用时,事务是如何在这些方法间进行传递的。本课内容到此结束!
2023-01-07 15:40:25 818
原创 JavaEE高阶---Spring AOP
关于Spring AOP,我们了解了:添加 AOP 框架⽀持。定义切面和切点。定义通知。Spring AOP 是通过动态代理的方式,在运行期将 AOP 代码织⼊到程序中的,它的实现⽅式有两种:JDK Proxy 和 CGLIB。
2023-01-05 18:18:14 1175
原创 JavaEE高阶---MyBatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的动作 . MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通 式 Java 对象)为数据库中的记录 .
2023-01-05 15:53:37 603
原创 javaEE高阶---SpringBoot单元测试
单元测试(unit testing),是指对软件中的最小可测试单元进程检查和验证的过程就叫单元测试。单元测试是开发者编写的⼀小段代码,用于检验被测代码的⼀个很小的、很明确的(代码)功能是否正确。执行单元测试就是为了证明某段代码的执行结果是否符合我们的预期。如果测试结果符合我们的预期,称之为测试通过,否则就是测试未通过(或者叫测试失败)。
2022-12-30 22:32:51 374
转载 TCP 协议的三次握手与四次挥手过程详解
尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。本文将分别讲解经典的TCP协议建立连接(所谓的“3次握手”)和断开连接(所谓的“4次挥手”)的过程。
2022-12-30 16:44:32 4053
原创 进程与线程的区别和联系是什么?
进程:进程是操作系统中一个最基本也是最重要的概念,然而对于进程的概念,学界并没有明确的定义,或者说进程这一概念尚未完全统一。行为的一个规则叫做程序,程序在处理机上执行时锁发生的活动称为进程。进程是这样的计算部分,它可以与别的进程并发执行。顺序进程(有时称为任务)是一个程序与其数据集一道顺序通过处理机的执行所发生的活动。一个进程是一系列逐一执行的操作,而操作的确切含义有赖于我们以何种详尽程度来描述进程、(Brinch.Hansen)
2022-12-30 09:38:20 470
原创 JavaEE初阶---多线程(初阶)
总结线程安全五大问题:1.系统随机调度/抢占式执行——万恶之源,无能为力;2.多个线程同时修改一个变量——部分规避;3.修改操作不是原子的——加锁可以改善 synchronized;4.内存可见性——由于编译器/JVM/操作系统误判,非正常优化了;5.指令重排序——使用volatile可以防止编译器进行指令重排序 .咱们先来说说 , 为什么要有线程池 . 进程本身已经能做到并发编程了 , 为啥还要有线程?进程太重量了 . 创建和销毁成本都比较高(需要申请释放资源).
2022-12-29 16:47:58 655
原创 算法---DFS和BFS
转载自 :简介: 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等,也频繁出现在高频面试题中。
2022-12-12 16:10:48 1530
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人