- 博客(71)
- 收藏
- 关注
原创 博客系统测试报告
因为驱动的测试是要在最后一个测试类完成之后进行释放的,如果是使用@AfterAll注解,那么每次修改测试类的时候都会需要挪动驱动释放的位置,所以直接新建一个类作为驱动释放,此时只需要在测试套件中放到最后就行。6)因为列表页等的测试是需要在登录成功后才能抵达的,所以在进行登录页面测试的最后一步应该是登录成功的状态,这样子是为了确保列表页等能够正确进入测试。内容不建议获取,因为是动态的。② 注意:在保存现场截图的时候命名是按时间来进行文件夹的划分,然后图片的名称要体现出测试类的类名,方便进行问题的追溯。
2024-05-28 18:46:53
750
原创 System.currentTimeMillis()用法以及计算方式
System.currentTimeMillis()的作用是返回当前的计算机时间,格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。比如在做项目时,需要统计下gc。
2024-03-07 18:35:01
858
原创 Bean 的六种作用域总结
什么是Bean的作用域?Bean的作用域指的是指 Bean 在 Spring 框架中的某种行为模式⽐如单例作⽤域: 表⽰ Bean 在整个 Spring 中只有⼀份, 它是全局共享的. 那么当其他⼈修改了这个值之后, 那么另⼀个⼈读取到的就是被修改的值.观察运行结果得知dog1 和 dog2 为同⼀个对象, dog2 拿到了 dog1 设置的值那么,能不能将Bean对象设置为非单例的(每次获取的bean都是⼀个新对象)这就是了。
2024-02-05 00:39:31
1097
原创 总结 MyBatis 的XML实现方法(使用XML使用实现数据的增删改查操作)
MyBatis是一个优秀的持久层框架,它的XML配置文件是实现数据库操作的关键之一。通过XML文件,可以定义SQL语句、映射关系和一些高级功能。下面将探讨下如何使用MyBatis的XML配置文件实现数据的增、删、改、查操作。
2023-11-15 18:02:22
1381
原创 MyBatis 的注解实现方法整合(完成数据的增删改查操作)
MyBatis是一个用于简化数据库访问层的开源持久层框架。它提供了将对象与数据库表之间的映射关系进行配置的方式,而不需要使用繁琐的 JDBC 代码和手动设置参数。MyBatis的目标是使数据库操作变得更加简单,同时保持足够的灵活性和性能。
2023-11-15 17:29:02
156
原创 汉明距离(Java)
锻炼算法时,重复造轮子不可避免,也是应当的,本方法使用位运算中移位的操作实现位计数功能。两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。给你两个整数 x 和 y,计算并返回它们之间的汉明距离。
2023-11-12 11:41:20
169
原创 找到所有数组中消失的数字(java)
遍历nums,将遇到的元素index作为索引,让nums[index]增加nums.length;因为原来nums数组中的元素范围在[1, n],所以遍历完成后,所有的nums中的元素不大于nums.length的就是没出现过的元素。给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果.输入:nums = [4,3,2,7,8,2,3,1]输入:nums = [1,1]
2023-11-11 13:06:17
270
原创 IDEA中常用的调试快捷键
快捷键可以帮助你更有效调试代码,逐步执行代码并检查变量值,以及快速定位和解决问题.不过,一些快捷键可能会因为IDE版本或者个人设置而有所不同,但以上是一般情况下的默认设置。在代码行号左侧双击,或者使用。在调试模式下,选中变量,然后。
2023-11-10 18:36:51
1356
原创 Spring 中存储 Bean 的相关注解及其用法.
Bean注解通常与@Configuration注解一起使用,@Configuration注解标记的类通常包含了一个或多个@Bean注解的方法,用于定义应用程序中需要的Bean。使用@Bean注解的方法可以接受参数,这些参数可以是其他Bean,也可以是其他配置信息,从而允许你在方法内部执行一些复杂的逻辑来创建Bean实例。总之,@Bean注解是Spring中用于自定义Bean创建的重要注解,它允许你以编程的方式定义和配置应用程序中的Bean。类注解是添加到某个类上的,而方法注解是放到某个方法上的。
2023-11-05 12:43:14
204
原创 垃圾回收(GC)的核心知识点总结
*避免内存泄漏:**在手动内存管理的系统中,程序员需要显式地分配和释放内存。如果程序员犯了错误,忘记释放内存,就会导致内存泄漏,使程序占用的内存不断增加,最终耗尽系统资源。**提高开发效率:**垃圾回收允许程序员专注于解决业务问题,而无需担心手动内存管理。这提高了开发效率,减少了错误的可能性。:手动内存管理容易导致各种内存错误,如空指针引用、野指针等。垃圾回收可以减少这些类型的错误。**提高程序的可维护性:**垃圾回收可以减少内存管理方面的代码,使代码更易于维护和理解。
2023-10-17 16:34:49
77
原创 类加载的过程总结以及双亲委派模型[JVM]
缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区中搜寻该Class,只有当缓存区中不存在该Class对象时,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓冲区中。扩展类加载器是Java类加载层次中的第二级加载器,其加载范围在类加载层次中位于启动类加载器和应用程序类加载器之间。1.当一个类收到类加载请求时,他首先不自己尝试去加载,而是层层向上委派给自己的父类,每一层加载器都如此,因此所有的请求都应该传送到启动类加载器中。
2023-10-17 16:19:53
359
原创 Linux 的常用命令大全
如果当前工作目录是 /home/user/,要引用同一目录下的文件 document.txt,您可以使用相对路径 document.txt,而不需要指定完整的绝对路径。在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息。千万不要运行rm -rf / 或 rm -rf /*, 尤其是在公司的生产服务器上,为这个命令是直接删除根目录。查看文件的内容,开头.默认head命令打印其相应文件的开头10行。
2023-10-17 15:24:10
312
原创 求最大bit数(java)
求一个int类型数字对应的二进制数字中1的最大连续数例如3的二进制为00000011,最大连续2个1数据范围:数据组数:11t15,11n1500000进阶: 时间复杂度: O(logn),空间复杂度: O(1)输入:200输出2说明200的二进制表示是11001000,最多有2个连续的1.
2023-10-14 14:55:41
110
原创 Cookie 和 Session 的工作流程总结
HTTP协议自身属于"无状态"协议,默认情况下HTTP协议的客户端和服务器之间的这次通信和下次通信没有直接的联系.而在实际的开发中,我们是需要知道请求之间的关系和联系的.例如登录网站后,第二次访问的时候就知道该请求是否已经登录过了.Cookie和Session的主要目的就是为了弥补HTTP的无状态特性.
2023-09-25 15:26:01
63
原创 HTTPS 的加密流程的总结
网络安全中,"攻击”和防御”是一个对抗的过程这个过程,理论上是“无限升级的过程但是实际上,一般来说,防御方还是比攻击方更有优势的.
2023-09-19 18:41:27
571
原创 总结 HTTP 协议的基本格式和 fiddler 的用法
HTTP协议也是日常开发中非常常用的的一种协议,在众多协议栈里HTTP可能是实际开发中用的最多的。这里说的HTTP是指HTTP1以及HTTP2,他们都是基于TCP协议的,注意:如今最新版的HTTP3是基于UDP的。但如今在互联网中使用的最多的仍然是HTTP1.1的版本。在整个协议栈中,之间的关系是一定的关联关系的,上层协议要调用下层协议,下层协议要给上层协议提供一个支撑,所以说HTTP作为一个应用层协议,他在进行传输数据的时候,就要基于TCP的这一套机制的保证。
2023-09-18 18:21:12
389
原创 总结 NAT 机制的工作流程及优缺点
*NAT(Network Address Translator,网络地址转换)**是用于在本地网络中使用私有地址,在连接互联网时转而使用全局IP地址的技术.实际上是为解决IPv4地址短缺而开发的技术:NAT技术作为当前解决IP地址不够用的主要手段,是路由器的一个重要功能;
2023-09-12 17:13:11
1141
原创 IP协议的相关特性
指定IP协议的版本,对于IPV4来说,就是四位.:IP头部的长度是多少个32bit,也就是Length4的字节数,4bit表示的最大的数是15,因此IP头部最大长度是60.:3位优先权字段(已经弃用),4位TOS字段,和1位保留 字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要;对于 ftp这样的程序,最大吞吐量比较重要。:IP数据报整体占多少个字节.
2023-09-12 16:37:53
113
原创 总结 TCP 协议的相关特性
当连续发多条数据的时候,可能会出现"后发先至"的情况,即一个数据报,是先发的另一个是后发的后发的反而先到了(由于网络的延迟、拥塞或丢包等原因,可能会导致部分数据段的顺序被打乱,即后收到的数据段可能先到达接收方)发送方处理确认应答:发送方收到确认应答后,会更新发送窗口的状态,并根据接收方提供的确认应答信息进行相应处理,如确认成功发送的数据段、启动定时器等。发送确认应答:如果数据段没有错误,接收方会发送一个确认应答段(ACK),该段中包含了接收到的数据段的序列号,通知发送方数据已成功接收。
2023-08-16 15:38:46
617
4
原创 编写 UDP版本的 echo server 和 echo client
【代码】编写 UDP版本的 echo server 和 echo client。
2023-08-14 15:05:46
161
原创 总结 File 类的用法和 InputStream, OutputStream 的用法
在new的时候输入路径, 可以是绝对路径也可以相对路径一个依赖于系统的分隔符,String类型的表示另一个依赖于系统的路径分隔符,char类细表示。
2023-08-13 09:25:39
164
原创 编写代码, 基于 AtomicInteger 实现多线程自增同一个变量
【代码】编写代码, 基于 AtomicInteger 实现多线程自增同一个变量。
2023-08-11 19:34:58
183
原创 HashTable, HashMap, ConcurrentHashMap 之间的区别
虽然是线程安全的,但是它只是简单地用修饰了一些关键方法,相当于是对加锁,即对整个对象进行加锁在多线程情况下,这种加锁方式是非常低效的:1) 多个线程访问同一个对象时,无论做什么操作,都会产生锁冲突;2) 如果某个线程触发了扩容机制,那么就会由这个线程完成整个扩容过程,如果元素过多,效率则非常低,其它线程阻塞等待的时间也会更长。
2023-08-11 10:30:03
79
原创 总结锁策略, cas 和 synchronized 优化过程
假设数据一般情况下不会产生并发冲突,所以在数据进行提交更新的时候,才会正式对数据是否产生并发冲突进行检测,如果发现并发冲突了,则让返回用户错误的信息,让用户决定如何去做总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。
2023-08-11 09:37:56
108
原创 总结synchronized
互斥性:synchronized保证了同一时刻只有一个线程可以执行被synchronized修饰的代码块或方法。当一个线程进入synchronized代码块或方法时,其他线程必须等待,直到该线程执行完毕并释放锁。可重入性:同一个线程可以多次获得同一个对象的锁。如果一个线程已经获取了对象的锁,在持有锁的情况下再次进入由synchronized修饰的代码块或方法,不会产生死锁,而是允许继续访问。保证可见性:synchronized不仅保证了线程的互斥执行,还保证了共享变量的可见性。
2023-08-10 15:02:27
825
原创 死锁的成因,和解决方案总结
死锁是多线程或并发程序中的一种情况,当多个线程因为竞争资源而相互等待,并且无法继续执行的情况。在死锁中,每个线程都在等待其他线程释放资源,从而导致所有线程都陷入无限等待状态,无法继续向前执行,最终导致程序无法完成任务。
2023-08-10 14:44:35
297
原创 总结线程池
核心线程数():核心线程数是线程池中保持活动状态的线程数量。在没有任务执行时,核心线程会一直保持存活状态。如果任务数量超过核心线程数,线程池会创建新的线程来执行任务。最大线程数():最大线程数是线程池中允许存在的最大线程数量。当任务数量超过核心线程数且任务队列已满时,线程池会创建新的线程,直到达到最大线程数。超过最大线程数的任务会根据配置的拒绝策略进行处理。空闲线程存活时间():当线程池中的线程数量超过核心线程数时,多余的空闲线程会在一定时间内保持活动状态,等待新的任务。
2023-08-09 16:33:48
117
原创 线程安全问题的原因和解决方案的总结
1.随机调度,抢占式执行(万恶之源,无法解决)2. 多个线程修改同一个变量(可适当调节代码结构,避免这种情况)3.修改操作不是原子性的(加锁,关键字synchronized)4.内存可见性(使用关键字volatile)5.指令重排序(使用关键字synchronized)
2023-08-08 15:07:47
68
原创 单例模式写法的总结(保证线程安全)
知道你很饿,但是当你第一次需要的时候我再给你,不需要的时候是没有我的实例对象给你调用的,这个实例对象通常由方法中创建,由方法来返回。可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界访问,从而方便的控制了实例个数,并节约系统资源。会的,如果多个线程中同时调用getSingleton方法,那么就有可能同时创建出多个实例对象。而懒汉模式是需要才创建,那么多个线程中同时需要会怎么办?的过程中创建实例,所以就写在static代码块中,和类一起加载。因为饿汉模式提前创建好了,所以天生就是线程安全的。
2023-08-08 14:18:35
1186
原创 总结 Thread 类基本用法
/自定义标识符@OverrideSystem.out.println("开始执行");while(!flag){try {//线程休眠1sSystem.out.println("线程结束");});flag=true;// 自定义中断标识符的问题在于:线程中断的不够及时。// 因为线程在执行过程中,无法调用 while(!isInterrupt) 来判断线程是否为终止状态,// 它只能在下一轮运行时判断是否要终止当前线程,所以它中断线程不够及时。
2023-08-07 02:00:23
54
原创 Thread类中run和start的区别(方法及运行结果)
单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程!(1)Thread.currentThread().getName()是用于获取“当前线程”的名字。(3) mythread.start()会启动“线程mythread”,“线程mythread”启动之后,会调用run()方法;start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。(2) mythread.run()是在“主线程main”中调用的,此时的run()方法是运行在“线程mythread”上。
2023-08-07 01:30:23
104
原创 Java 线程的几种状态解析
从,任何线程一般都具有五种状态,即创建、就绪、运行、阻塞、终止。在程序中用构造方法创建一个新线程时,如new Thread(),该线程就是创建状态,此时它已经有了相应的内存空间和其它资源,但是还没有开始执行。新建线程对象后,调用该线程的start()方法就可以启动线程。当线程启动时,线程就进入就绪状态(runnable)由于还没有分配CPU,线程将进入线程队列排队,等待CPU服务,这表明它已经具备了运行条件。当系统挑选一个等待执行的Thread对象后,它就会从等待状态进入执行状态。
2023-08-06 17:32:50
90
空空如也
这个软件工程的实验谁会啊
2023-11-19
TA创建的收藏夹 TA关注的收藏夹
TA关注的人