自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 小项目“谈笑风生”测试报告

随着互联网的迅速普及和广泛应用,人们的沟通方式开始多元化,即时通讯软件的出现让人们之间的交流变得更加灵活和方便。为了满足人们交流多元化的需求,这里模仿QQ社交软件,开发了一个网页聊天程序。登录、注册、展示好友列表、展示消息列表、展示聊天记录、与好友进行实时聊天。

2024-05-08 11:47:04 907

原创 小项目“星云曲库”测试报告

这是一款可以播放歌曲的网站,用户可以播放自己上传的歌曲,也可以播放其他用户上传的歌曲。作为开放的歌曲分享平台,我们可以在市面上的音乐软件中下载好VIP歌曲,然后将下载好的歌曲上传到这个网站,这样其他在市面上的音乐软件中没有VIP的朋友就可以聆听到VIP歌曲了。实现一次VIP下载,广泛聆听。登录、播放歌曲、把歌曲标记为喜欢、删除歌曲、上传歌曲、搜索歌曲(模糊查询)、取消喜欢。

2024-03-31 16:13:26 926

原创 MyBatis中的XML实现和动态SQL实现

默认情况下,如果mapper层声明方法的参数是List类型,则foreach标签里的collection会等于"list";如果mapper层声明方法的参数是数组类型,则foreach标签里的collection会等于"array",这时mybatis自动做的。我们可以将XML中重复出现的内容提取出来放到sql标签中,当需要用到sql标签中的内容时,用include标签将sql标签中的内容引进来即可。where标签的作用是删除代码块最前面的and;=null这个条件,则会显示if标签里的内容。

2024-02-13 19:14:12 2522 4

原创 Spring MVC中的常用注解及其用法

RequestParam注解里加required = false则表示这个注解修饰的参数可以不传(否则这个注解修饰的参数一定要传),不传时这个参数的值为null。以下这种转换方式:拿到json字符串把这个json字符串转换为java对象的时候,会调用java对象无参的构造函数构造成一个空的对象,再对字符串进行解析对空对象的属性进行赋值。@ResponseBody表示返回数据,其既可以修饰类又可以修饰方法,修饰类表示该类内的所有方法返回的都是数据,修饰方法表示该方法返回的是数据。即获取请求中的文件。

2024-01-14 23:15:13 1174 6

原创 JVM类加载的过程和JVM垃圾回收机制

编译之后,.class文件的二进制指令中也会有一个a这样的引用被创建出来,由于引用本质上保存的是一个变量的地址,在.class文件中,因为文件不涉及到内存地址,所以.class文件中的a就会先被设置成一个“文件偏移量”,通过这个“文件偏移量”可以找到hello这个字符串所在的位置,当我们把这个类真正加载到内存的时候,再把这个“文件偏移量”替换回真正的hello的内存地址。⑥Extension ClassLoader就会扫描自己负责的目录,如果找到对应的.class文件,则查找结束,就执行后续的类加载操作;

2023-11-24 09:45:12 530 1

原创 Linux常用命令

ps aux | grep mysql,查看mysql进程的进程pid,|叫管道,把前一个命令的输出变为后一个命令的输入,本身grep是从文件中进行查找,但现在我们是把pa aux的结果通过管道的方式导入到grep命令里,这时grep就可以针对pa aux的结果进行查找了。使用cd命令时,需要加上路径的时候,可以手动打几个字母然后按tab键来补全路径,但前提是当前输入的路径是唯一的选项,如果有多个匹配的目录名字/文件名字,按tab就不能补全了,按两次tab就可以列出所有可以补全的选项。

2023-11-19 18:19:06 138

原创 通过Cookie和Session来实现网站中登录账号的功能

在浏览器中首次进行登录操作的时候,服务器会进行身份验证,验证通过后服务器会创建具有身份标识的会话信息(即session信息和sessionId)并将其保存到服务器哈希表中,然后通过响应将sessionId返回给客户端。客户端也会用Cookie中的键值对来保存身份标识sessionId(sessionId=……)。

2023-11-09 18:47:48 2598

原创 https的加密流程

如果黑客截获到证书后计算出证书中除数字签名之外的内容的校验和,然后用自己的私钥对校验和进行加密得到自己的数字签名替换掉证书中的数字签名,这时这个证书发送给客户端的时候客户端就无法使用公证机构的公钥对数字签名进行解密然后拿到证书的校验和了。所以要对用于对称加密的密钥(下面简称对称密钥)进行加密,而对对称密钥加密又要在网络上传输一个新的对称密钥,如此往复循环下去,最终还是有对称密钥泄漏的风险,所以仅用对称加密的方式进行加密是行不通的,由此在对称加密的基础上引入非对称加密。那么如何解决中间人攻击问题呢?

2023-10-28 11:39:40 773 3

原创 http协议和Fiddler

查询字符串(query string)中的键值对是程序员自定义的,不像header中的键值对那样都是标准规定。http响应解压缩(点击右下角响应详情里的Response body is encoded.Click to decode.进行解压缩)之后可以看到响应的是文本格式的内容、响应的是html(带有html的标签),浏览器显示的网页就是html,这通常是浏览器先请求对应的服务器,然后从服务器中拿到页面数据html加载过来浏览器中,网站每次打开网页都是一个重新加载的过程,这对网络带宽又有了进一步的要求。

2023-10-25 23:03:02 930 2

原创 数据链路层、网络层以及IP协议

②如果一个IP地址的主机号全为1,则这个IP是一个“广播IP地址”,具体的主机也是不能分配这个IP的。站在服务器的角度,这两个IP数据包虽然有同样的源IP,但这两个IP数据包之间的端口不一样,因此服务器返回给两个主机的响应也会带有不同的目的端口(即刚才的源端口)。通过⑤⑥⑦这三个属性来支持IP协议的拆包组包,如果一个大的IP数据包需要拆成多个小的数据包,此时拆出来的这多个小的数据包的16位标识里的数值就是相同的,这保证了组包时数据的完整性。IP地址是一个32位的整数,2的32次方等于42亿9千万。

2023-10-22 10:06:51 264

原创 TCP协议的报文结构及其特性

(2)B接收到了A发过来的数据B就可以知道A的发送能力和B的接收能力是正常的,然后B向A发送一条数据。比如A第一次向B发送1000个字节的数据(第1个字节到第1000个字节的数据),假设这个TCP报头序号为1,在应答报文的确认序号中就会填写1001,应答报文的意思是收到的数据是第1个字节到第1000个字节的数据表明第1001个字节之前的数据都被B收到了(B接下来向A索要第1001个字节开始的数据),接下来A就会向B发送第1001个字节到第2000个字节的数据。这是正常的四次挥手断开连接的流程。

2023-10-20 09:44:13 3027 2

原创 UDP报文结构

UDP报头和UDP载荷(payload)之间的拼接可以认为是一个“字符串拼接”,里面是二进制数据。

2023-10-10 13:38:24 334

原创 网络中的一些基本概念

比如在网络层数据包前面拼接上以太网包头,在网络层数据包后面拼接上以太网包尾,包头和包尾之间的内容叫载荷,以太网包头最重要的信息是源MAC地址和目的MAC地址(MAC地址也是用来描述一个设备在网络上的地址的)。①应用层:比如在微信应用程序中,微信会把用户输入的“你好”信息打包成一个应用层的数据包(这个数据包实际上是字符串拼接,数据包比如包含源微信、目的微信、发送时间、发送内容等,数据包约定的格式相当于应用层协议,应用层协议往往是根据具体的场景具体的需要由程序员自主决定)。网络层最主要的协议是IP协议。

2023-10-06 19:54:43 93 1

原创 文件操作和IO

文件描述符表是一个顺序表,一个进程每打开一个文件就需要在这个表里分配一个元素,而这个表的长度是有上限的,如果代码一直是打开文件而不去关闭文件,就会使这个表里的元素越来越多直到把表占满,后续再尝试打开文件就会报错,这个问题叫“文件资源泄露”。read()的返回值是int,代表读到的字符,这样做的目的是当文件读完时要返回-1,而char无法返回-1。read()的返回值是int,如果读到了字节int会返回的范围是0~255(即一个无符号byte能表示的范围,即一个字节),如果文件读完时则返回-1。

2023-09-23 20:44:58 176 1

原创 synchronized

初始情况下,synchronized如果预测到当前锁冲突的概率不大,就会以乐观锁的模式来运行(即轻量级锁,基于自旋锁的方式来实现),实际使用过程中,如果发现锁冲突的情况比较多,synchronized会升级为悲观锁(即重量级锁,基于挂起等待锁的方式来实现)。锁消除是一种编译器优化的手段,编译器会自动针对加锁的代码做出判断,如果编译器觉得某个场景下不需要加锁,此时就会把synchronized给优化掉,编译器只会在非常有把握的情况下才会进行锁消除(触发锁消除的概率不是很高)。锁粗化也是一种编译器优化的手段。

2023-09-20 20:36:26 99 1

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

答案是不会的,因为ConcurrentHashMap在底层编码的时候会比较谨慎地处理一些细节,比如修改的时候会避免使用++、–这种非原子的操作,会使用=(赋值)这种原子性的操作,这样读的时候要么读到的是写之前的旧值要么读到的是写之后的新值。哈希表在扩容的时候会把所有的元素都拷贝一遍,如果元素比较多拷贝就会比较耗时。比如一个线程操作哈希表1号链表中的元素,另一个线程操作哈希表2号链表中的元素,在不考虑扩容的前提下,这种对哈希表的操作是不会发生线程安全问题的。②充分利用CAS特性,省去了一些不必要加锁的环节。

2023-09-20 17:55:07 95 1

原创 Java线程池

线程池的作用:相当于提前把线程创建好放入线程池中,后续需要用到线程时直接从线程池中取出线程,减少了创建新线程的开销,提高了程序的执行效率。

2023-09-16 10:59:31 144 1

原创 出现线程安全问题的原因和解决方案

某些代码在单线程环境下执行结果完全正确,但在多线程环境下执行就会出现Bug,这就是“线程安全问题”。下面以一个变量n自增两次,每次自增10000为例。单线程环境下n自增两次结果为20000,执行结果正确。i < 10000;i++) {n++;i < 10000;i++) {n++;但在多线程环境下n自增两次,结果却不是20000,此时出现了Bug,出现了线程安全问题。//n要定义成全局变量i < 10000;i++) {n++;});i < 10000;i++) {n++

2023-09-13 12:42:04 95 1

原创 Java线程

Thread(String name)、Thread(Runnable target, String name)使创建线程的时候可以指定线程的名字,使得后续调试时用jdk中的jconsole.exe查看线程时根据线程名字更容易区分线程。方法②:用Thread类中现成的标志位终止线程,这里面用到了Thread类中的currentThread(),isInterrupted(),interrupt()。①如果t线程正在运行中,此时“调用join()的线程”就会阻塞,一直阻塞到t线程执行结束为止。

2023-08-17 11:24:12 179 1

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

多进程可以实现并发编程的效果,但是多进程编程模型有明显的缺点是进程太重量、效率不高(消耗较多时间在申请进程的资源上,因为系统申请进程资源时在内存中有一个遍历的过程),为了解决这个问题,引入“线程”(Thread),线程也叫“轻量级进程”,创建线程比创建进程更快,销毁线程比销毁进程更快,调度线程比调度进程更快。⑤线程不能无限制地增加,线程数量达到一定程度时,再进一步增加线程的数目,效率无法进一步提升,反而会因为要调度的线程太多使调度的开销过大,反而会降低程序的执行效率。④增加线程的数目,能进一步提高效率。

2023-08-13 18:36:43 196 2

原创 进程的调度

一个正在执行的程序叫做进程。操作系统会把程序调度到CPU上,让CPU执行程序,此时这个程序就变成了进程。相当于程序在CPU上执行时叫进程,程序没有在CPU上执行时就叫程序。

2023-08-11 21:24:19 126 1

原创 字符串常量池

堆中有一个常量池(StringTable),是一个哈希表,用来提高存储效率,存储双引号引起来的字符串(存储字符串的常量值,双引号引起来的是字符串常量)。存储字符串常量的时候,会检查当前常量池是否存在将要存储的常量。输出1结果是True。输出结果是false。同理以下输出结果也为false。

2023-07-28 14:04:45 96

原创 哈希表及其模拟实现

哈希(散列)方法:构造一种存储结构,通过某种函数使元素的存储位置与它的关键码之间能够建立 一 一 映射关系,那么在查找时通过该函数就可以很快找到该元素。哈希(散列)方法中的函数称为哈希(散列)函数,构造出来的结构称为哈希表(散列表)。例如在集合{1,2,3,4,5}中,哈希函数设置为hash(key)=key%capacity。哈希函数的选择和数据整体元素有关,与单个元素没有直接关联。

2023-07-28 11:00:33 554

原创 模拟实现二叉搜索树

③cur不是root,cur是parent.right,则parent.right=cur.right。③cur不是root,cur是parent.right,parent.right = cur.left。②cur不是root,cur是parent.left,则parent.left = cur.left。②cur不是root,cur是parent.left,则parent.left=cur.right。这里是在cur节点(要删除的目标节点)的右边找替罪羊,在cur的右子树中找到最左边的节点。

2023-07-27 17:24:46 187

原创 七大排序算法和计数排序

以下排序以从小到大排序为例。

2023-07-23 10:31:11 299 1

原创 模拟实现优先级队列(堆)

3、出队出的是优先级高的元素,先将要出队的元素与队尾元素互换,然后usedSize–,采用向下调整使出队后仍然保持为大根堆。2、入队时将元素加入队尾,然后采用向上调整使入队后仍然保持为大根堆。1、这里采用向下调整建大根堆。

2023-07-19 16:46:06 665

原创 模拟实现二叉树的基本操作

【代码】模拟实现二叉树的基本操作。

2023-07-17 17:56:17 64

原创 模拟实现LinkedList

【代码】模拟实现LinkedList。

2023-07-01 21:29:14 176 2

原创 模拟实现ArrayList

【代码】简单实现ArrayList。

2023-07-01 17:43:33 59 1

原创 String类

在Java中字符串是不可变的,如"heLLo"转换为"hello"这个转换不是在原来的字符串上面进行转换,而是生成了一个新的对象。因为String类型的内容不能被修改,所以在这里用+=修改String类型的字符串每次在后面追加修改都要创建新对象,会耗费时间和资源,相比之下修改StringBuffer和StringBuilder类型的字符串不会创建新对象,效率高,StringBuilder效率最高。还有lastIndexOf(“ab”)和lastIndexOf(“ab”,5),即把字符改为字符串。

2023-06-06 13:01:30 342 1

原创 Object类和Java中内置的一些接口

(1)自定义类型的对象要比较大小,则在这个自定义类型(类)中实现Comparable接口,在这个自定义类型(类)中重写compareTo方法,来实现比较的逻辑,因为Comparable接口中的compareTo方法没有具体的实现,compareTo方法的返回值是int,Comparable的T是什么类型(如Person类型),compareTo的参数就是什么类型(如Person类型),因为Comparable源码的泛型是这样写的。在Person类中没有重写equals方法时,下面两行代码没有区别。

2023-06-05 23:17:18 444

原创 抽象类和接口

(10)类在实现接口时,要重写接口中的方法,重写的方法一定由public修饰(类似于重写方法的访问权限高于或等于父类中被重写方法的访问权限)(4)抽象类不可以被实例化,只能被继承(必须被继承),继承后子类要重写父类所有的抽象方法,否则子类也是抽象类(要用abstract修饰)4、用extends拓展接口的功能(接口之间的继承,把多个接口合并在一起),如D接口具备B接口和C接口的功能、同时有自己的功能。(6)从Java8开始,接口当中被static修饰的成员方法,和(5)一样也可以有具体的实现。

2023-06-05 21:29:28 401

原创 类和对象以及数组工具类的常用方法

(2)在实例内部类中,要定义静态的成员变量,则必须加上final,因为static修饰的变量不依赖于对象,而在不是外部类的其它类中获取实例内部类对象时,要依赖外部类对象,造成矛盾,(内部类相当于外部类的普通成员变量,类加载的时候不会加载普通的成员变量,实例内部类中又存在static,而static是在类加载的时候创建的,造成矛盾)加上final后final修饰的是常量,而这个常量不需要类加载,编译时就能知道data的值是6。(1)在不是外部类的其它类中获取静态内部类对象时,不用依赖外部类对象。

2023-06-05 20:46:30 670

原创 Java异常

自定义异常实现登录,定义两个继承Exception类的异常类,在下载函数内部用throw抛出这两个异常,在下载函数名称处声明这两个异常,将调用下载函数写入try{}中,将这两异常以及异常的处理写入catch{}中。if(!throw new UserNameException("用户名错误!");} if(!throw new UserNameException("密码错误!");} System . out . println("登陆成功!");

2023-05-15 13:51:01 52

原创 Java模拟实现图书管理系统

首先创建BookList类型的对象,此时书架中的三本书已经加载好,再在while循环中调用登录方法,登录方法的返回值类型为User,在登录方法中,如果操作者选择管理员,则创建一个管理员类型(AdminUser类型)的对象,如果选择读者,则创建一个普通用户类型(NormalUser类型)的对象,这时会调用相应类的构造方法,User类中操作接口类型的数组就会被初始化,各种操作类的对象也会被创建好,数组元素被初始化为相应类型用户的各种操作类的对象。找不到要归还的书,则要归还的书不属于图书馆,不用归还。

2023-05-14 19:12:12 641

原创 Java面向对象

2、super关键字:在子类方法中访问父类继承下来的成员(相当于是子类对象中从父类继承下来的那部分成员的引用),super.data访问父类的成员变量,super.func()访问父类的成员方法。子类继承父类之后,实例化子类对象的时候,先帮助父类进行构造(在子类的构造方法中用super()调用父类的构造方法),再构造子类自己。3、向上转型后,通过父类引用调用这个父类和子类重写(覆盖,覆写)的方法,结果是调用了子类的方法,这个过程叫做运行时绑定(后期绑定,动态绑定),向上转型的缺点是不能调用子类特有的方法。

2023-05-01 14:57:54 651 3

原创 辗转相除法和二分查找

我们要找数字9,最左边数字的下标为left,最右边数字的下标为right,用int mid=left+(right-left)/2(防止溢出)求数组中中心位置数字的下标mid,这里求得mid为5,以5为下标的数字是7(中心位置数字),7(中心位置数字)比目标值9小,说明目标值9在7(中心位置数字)的左边,令中心位置数字的下标mid减1赋给right,使right的值更新为4,原来中心位置数字右边(包括中心位置数字)的数字全部舍去。最后一次计算用到的n(6)为两数的最大公约数。假设有一组排好顺序的降序数据。

2023-04-15 17:52:47 107 5

原创 程序环境和预处理

用于对数值表达式进行求值的宏在定义时应多加括号,避免在使用宏时因操作符的相互作用而出现不可预料的结果。

2023-04-03 11:58:46 224 4

原创 找单身狗版本2(有两个单身狗/有两个只出现一次的数字)

在找单身狗版本1里,只有一个数字出现一次,其它数字都出现两次,找出只出现一次的数字,这时我们只要将所有的数字异或在一起就可以找出这个数字。基于版本1的思想,在版本2中,要将两个单身狗分开,分到两组中,再用版本1的方法找到两组中各自的单身狗。找单身狗版本2题目要求:一个数组中只有两个数字只出现一次,其他所有数字都出现了两次,编写一个函数找出这两个只出现一次的数字。

2023-04-02 22:14:40 228 1

原创 跟文件操作有关的函数

根据文件指针的位置及其偏移量来定位文件指针(指向文件内容),第3个参数的选择有三种,第一种SEEK_SET(文件指针(指向文件内容)的开始位置),第二种是SEEK_CUR(文件的当前位置),第三种是SEEK_END(文件的末尾位置)。fscanf和fprintf:fscanf是针对所有输入流(文件流/stdin)的格式化的输入函数。将字符(第一个参数)写入pf指向的文件中(pf指向文件对应的文件信息区,pf跟文件里面的内容没有关系),返回写入文件字符的ASCII值,写入失败返回EOF(-1)。

2023-04-02 20:28:59 162

空空如也

空空如也

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

TA关注的人

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