自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(105)
  • 问答 (2)
  • 收藏
  • 关注

原创 【Java】基于敏捷开发的简易Web服务器(附下载)

这是一款简易的Web服务器,使用JavaSE的基本工具,实现了主页、404页面、登录、注册、动态页面等最原始的功能。github地址:https://github.com/541380000/Easy-Web-Server-Java 通过敏捷开发的方式,14个小版本快速更迭,能够看到代码的快速变化与结构调整。 项目实现的具体功能有:1、对Http请求的解...

2020-02-23 21:20:07 393

原创 【Java课程设计】仿QQ多人聊天室(基于TCP协议与JavaSwing)附下载

仿QQ多人聊天室下载地址:链接:https://pan.baidu.com/s/1dLFjSxwTA4gL5lI0B4UGuQ提取码:2qs0有两个项目,分别是服务器chatterServer和客户端chatter,先开启服务器,再开启客户端,默认8888端口。先上图(回环测试,即自己和自己聊天):实现的主要功能:1、一对一聊天:连接到服务器的所有客户端和另一个客户端“...

2020-02-17 18:32:22 3063

原创 算法与数据结构【Java实现】:二叉查找树

链表能够很方便的存储数据,但是,数据的组织只能是线性的,不能有层次的组织数据,且查找元素需要线性查找,复杂度O(n)。 二叉查找树是一种按照排序组织数据的有层次的方式它的特点是:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;即:对于任何一个子树,左子树所有结点值小于根...

2020-02-13 21:40:17 363

原创 Linux下使用HugePage减少TLB-Miss,以及使用HugePage创建共享内存

TLB miss是导致程序内存访问延迟的一大原因。特别是使用大量内存时TLB会变得异常拥挤。一个常见的TLB miss导致的内存延迟的现象是:访问一个连续数组,每4KB出现一次较大的访问延迟。因此使用HugePage(巨页)能够改善内存访问延迟。本文主要介绍在共享内存IPC场景下使用HugePage的方法。单进程访问内存的方式会更简单。

2023-04-27 12:49:08 806 1

原创 epoll socket编程中的错误处理

epoll socket编程中的错误处理

2022-10-10 15:14:04 1942

原创 C++Atomic与内存序

C++ 内存模型

2022-08-03 15:03:14 953

原创 Windows和Linux下使用共享内存在C++和Python之间共享DataFrame

参考资料windows api: https://docs.microsoft.com/en-us/windows/win32/api/《Linux-UNIX系统编程手册》Python Doc: https://docs.python.org/3/library/mmap.htmlLinux manual: https://man7.org/linux/man-pages/man2/mmap.2.html实现(windows)主要功能用C++创建共享内存,用Python进行读取,用csv格

2022-05-03 18:18:43 2845

原创 C++线程池(固定线程数,条件变量通知,future返回)

参考资料:《C++并发编程实战》https://en.cppreference.com代码下载https://github.com/541380000/csdn_share/tree/main/threadpool_cpp实现(见注释)#pragma once#include <vector>#include <queue>#include <thread>#include <atomic>#include <condition

2022-05-03 16:38:36 1012

原创 手写一个 RPC 远程调用(C++)

手写一个 RPC 远程调用(C++)

2022-02-25 13:53:58 3540 4

原创 一些常用的Linux命令

1.查找文件 find ./ -name "name.txt" (精准匹配)2.去掉文件夹下,所有文件的prefix_前缀,比如prefix_text.txt -> text.txtfor f in `ls`; do mv $f `echo $f | sed "s/^prefix_//g"`; done3.给文件夹下所有文件加一个前缀prefix_for f in `ls`; do mv $f "prefix_$f"; done...

2021-10-12 16:43:41 88

原创 Libevent基础之 Reactor模式

个人作品,未经允许禁止转载!该代码意在说明reactor的原理,没有深究细节。详见注释#include<stdio.h>#include <sys/epoll.h>#include <sys/socket.h>#include <fcntl.h>#include <ctime>#include <netinet/in.h>#include <cerrno>#include <cstdlib&

2021-10-09 17:28:22 181

原创 Epoll编程笔记

个人作品,未经允许禁止转载!!!解决IO问题的编程模型及特点1.阻塞等待缺点:一个fd等待时,其他fd无法被监听2.多线程阻塞等待缺点:一个fd占用一个线程,线程过多,效率很低3.非阻塞、忙轮询缺点:无效轮询占用大量CPU时间4.Select缺点:能够打开的fd数量受内核限制,如需修改,需要编译内核。效率较低,每次需要遍历fd数组,复杂度和最大fd数量相同5.Epoll优点:用红黑树管理fd,每次返回可以读写或者发生其他事件的fd,大部分情况下效率高于select

2021-10-09 14:57:42 178

原创 Libevent安装

最近在学习libevent,记录一下安装过程,方便日后查看。首先,安装openssl1.下载openssl源码:/source/index.html (openssl.org)wget https://www.openssl.org/source/openssl-1.1.1l.tar.gz2.解压tar -zxvf openssl-1.1.1l.tar.gzcd openssl-1.1.1l/3.编译安装./configmake -j16sudo make inst.

2021-10-09 12:58:08 2372

原创 【设计模式】

软件设计的6大基本原则SOLID1、Single单一性原则一个类只负责一类方法的封装,一个方法只负责单一的功能的封装。该原则是高内聚,低耦合的基础。高内聚指功能相同的方法内聚在同一个类中,共同完成一个功能的代码块聚合在一个方法中;低耦合指一个类之间的方法尽量少的相互调用,修改一个方法不会或者很少的影响另外一个方法。2、Open&Close 开闭原则对扩展开放,对修改关闭。由于旧代码已经经过测试和实践检验,不能对旧代码进行修改,而是只能在旧代码基础上进行扩展,添加新的代码,而非修改

2020-12-03 18:10:09 298 1

原创 Mybatis 自动类型转换

1、新建类xxxTypeHandler,实现TypeHandler接口 或 继承 BaseTypeHandler类package com.william.typehandler;import com.william.mapper.IdCardType;import org.apache.ibatis.type.JdbcType;import org.apache.ibatis.type.TypeHandler;import java.sql.CallableStatement;impor

2020-10-20 11:57:43 2081 1

原创 Mybatis 插入并获取自增主键

1、编写select<insert id="insertUserTestAutoIncrement" parameterType="Student" useGeneratedKeys="true" keyProperty="id"> insert into students(password,age,salary,name) values (#{st.password}, #{st.age}, #{st.salary}, #{st.name}); </insert>

2020-10-20 11:00:12 547

原创 Mybatis联合查询

一对一联合查询查询student表和pwd表的一对一1、写resultMap<resultMap id="OneToOneResultMap" type="Student"> <id column="id" jdbcType="INTEGER" property="id" /> <result column="password" jdbcType="VARCHAR" property="password" /> <result

2020-10-19 20:12:07 304

原创 Mybatis批量插入方式比较

效率:普通for循环 < BATCH方式获取mapper < foreach标签拼接sql主函数代码:package com.william;import com.william.mapper.Student;import com.william.mapper.StudentExample;import com.william.mapper.StudentMapper;import lombok.Data;import lombok.extern.slf4j.Slf4j;

2020-10-19 19:25:14 154

原创 使用MybatisGenerator

1、向pom.xml添加依赖项<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.22</version></dependency><dependency>

2020-10-19 13:53:07 151

原创 Java多线程的3种实现方法:Thread,Runnable,Callable

1、继承Thread类,重写run方法public class Main { static public void main(String[] args){ Thread thread = new Thread(){ public void run(){ System.out.println("正在执行的线程名:" + Thread.currentThread().getName()); }

2020-10-18 20:59:00 243

原创 Mysql安装

1、下载安装包(8.0.19版本):链接:https://pan.baidu.com/s/1vORXjeap7US2bdWDZA6pNQ提取码:cu792、解压到d盘的任意目录下,但是要知道解压到了哪。比如解压到D:\MySQL,得到新的文件夹mysql-8.0.19-winx643、将D:\MySQL\mysql-8.0.19-winx64\bin,加入系统环境变量PATH4...

2020-03-03 12:57:34 218

原创 算法与数据结构【C++与Java实现】:链表篇

对于大多数应用而言,存储数据最好的方式就是使用表。表有两种最常用的实现:数组和链表数组是在内存中连续存在的结构,且编译器就需要直到其大小。对于无法提前预估数据规模的程序,如果初始的数组太小,则需要扩展数组大小,这常常伴随着大量的内存复制,时间复杂度很高;如果初始的数组太大,则会造成很大的内存资源浪费。链表也是一种连续的数据结构,与数组的不同是,每一个元素在内存中不一定连续存储,元素与元...

2020-01-27 21:37:06 1619

原创 算法与数据结构【C++】:稀疏表

很多情境下,存储数据的最好方式就是表。当数据较为稠密的聚集在某个坐标范围中时,采用数组是最好的选择。比如,要存储一个班学生的成绩,该班级有30人,编号从1-30,有10门课,编号1-10那么就可以用一个30x10的数组存储这张成绩表,经济实惠使用方便但是有的时候数据非常稀疏,比如一个学校一共开设了1000门课,有的学生可以随意选课,现在需要一个数据结构存储每个学生每门课的成绩。显...

2020-01-27 21:27:54 570

原创 算法与数据结构【Java】:稀疏表

很多情境下,存储数据的最好方式就是表。当数据较为稠密的聚集在某个坐标范围中时,采用数组是最好的选择。比如,要存储一个班学生的成绩,该班级有30人,编号从1-30,有10门课,编号1-10那么就可以用一个30x10的数组存储这张成绩表,经济实惠使用方便但是有的时候数据非常稀疏,比如一个学校一共开设了1000门课,有的学生可以随意选课,现在需要一个数据结构存储每个学生每门课的成绩。显...

2020-01-27 21:27:40 448

原创 算法与数据结构【Java】:跳跃链表

普通链表有一个严重的缺陷:查找某对象时需要遍历整个链表,直到找到了该元素或者遍历完了整个链表也没有找到,时间复杂度很高。 为了解决该问题,可以使用跳跃链表。跳跃链表的特点:跳跃链表中的元素按照从小到达或从大到小的规则排列,该顺序在向链表加入元素时维护,所以,只能指定向链表插入某个值,不能指定插入位置跳跃链表使用了二分查找的思想, 查找某个元素的复杂度是O(logn)...

2020-01-26 16:20:43 486

原创 算法与数据结构【C++】:跳跃链表

普通链表有一个严重的缺陷:查找某对象时需要遍历整个链表,直到找到了该元素或者遍历完了整个链表也没有找到,时间复杂度很高。 为了解决该问题,可以使用跳跃链表。跳跃链表的特点:跳跃链表中的元素按照从小到达或从大到小的规则排列,该顺序在向链表加入元素时维护,所以,只能指定向链表插入某个值,不能指定插入位置跳跃链表使用了二分查找的思想, 查找某个元素的复杂度...

2020-01-26 16:19:38 354

原创 算法与数据结构【Java】:自组织链表

由于链表中,在某一时间段内每个元素使用的频率不同,所以,依赖于这种特点,产生了自组织链表,来提高链表的查找效率。自组织链表可以动态的组织链表,有很多种方法,这里列举4种: 1、前移法:找到需要的元素之后,将它放到链表开头 2、换位法:找到需要的元素之后,将它和前驱交换位置 3、计数法:在结点中记录被访问的次数,根据被访问的次数,对链表进行排序 4、排序法:根据链表...

2020-01-26 16:16:00 196

原创 算法与数据结构【C++】:自组织链表

自组织链表由于链表中,在某一时间段内每个元素使用的频率不同,所以,依赖于这种特点,产生了自组织链表,来提高链表的查找效率。自组织链表可以动态的组织链表,有很多种方法,这里列举4种: 1、前移法:找到需要的元素之后,将它放到链表开头 2、换位法:找到需要的元素之后,将它和前驱交换位置 3、计数法:在结点中记录被访问的次数,根据被访问的次数,对链表进行排序 4、排...

2020-01-26 16:15:15 476

原创 算法与数据结构【Java】:循环链表

1、定义:循环链表是一种首尾相接的链表,其本身并没有首尾,但是为了给链表提供入口,方便对链表进行操作,所以定义了“头”和“尾”2、循环链表可以在单向链表上通过简单的增改来实现,但是这里单独实现了循环链表。3、循环链表的用处举例:操作系统任务调度时,相同优先级的任务会获得相同时间的CPU使用权,在一个任务占用CPU结束后,需要将CPU让给下一个任务,如此循环,可以用到循环链表。下方是Java...

2020-01-26 16:13:48 201

原创 算法与数据结构【C++】:循环链表

1、定义:循环链表是一种首尾相接的链表,其本身并没有首尾,但是为了给链表提供入口,方便对链表进行操作,所以定义了“头”和“尾”2、循环链表可以在单向链表上通过简单的增改来实现,但是这里单独实现了循环链表。3、循环链表的用处举例:操作系统任务调度时,相同优先级的任务会获得相同时间的CPU使用权,在一个任务占用CPU结束后,需要将CPU让给下一个任务,如此循环,可以用到循环链表。下方是C...

2020-01-26 16:11:54 1395

原创 算法与数据结构【Java】:双向链表

双向链表相对于单向链表的优点: 1、单向链表在需要对列表尾部进行操作时,需要通过遍历的方式获取尾部的结点,很浪费时间 2、对于需要频繁使用deleteFromTail()和addToTail()方法的程序,程序效率会非常低 3、双向链表存储了每个结点前面的结点,在对尾部进行操作时,能非常方便的获取尾部的结点信息,方便对尾部进行操作,大大提高了程序效率 4、但是,...

2020-01-26 16:10:49 205

原创 算法与数据结构【C++】:双向链表

双向链表相对于单向链表的优点: 1、单向链表在需要对列表尾部进行操作时,需要通过遍历的方式获取尾部的结点,很浪费时间 2、对于需要频繁使用deleteFromTail()和addToTail()方法的程序,程序效率会非常低 3、双向链表存储了每个结点前面的结点,在对尾部进行操作时,能非常方便的获取尾部的结点信息,方便对尾部进行操作,大大提高了程序效率 4、但是,...

2020-01-26 16:09:37 271

原创 算法与数据结构【Java】:普通单向链表

普通单向链表应该包含的数据和方法:结点类(Node): 属性: AnyType value; //任意类型的数据 Node* next; //指向下一个节点的指针 方法: 构造方法 Node(AnyType* value, Node* next);链表类(LinkedList): Node*...

2020-01-26 16:07:54 225

原创 算法与数据结构【C++】:普通单向链表

普通单向链表应该包含的数据和方法:结点类(Node): 属性: AnyType value; //任意类型的数据 Node* next; //指向下一个节点的指针 方法: 构造方法 Node(AnyType* value, Node* next);链表类(LinkedList): Node*...

2020-01-26 16:06:41 251

原创 Java飞机大战------纯基础语法实现【附下载】

飞机大战是一项能够使用到绝大部分Java基础语法和面向对象知识的项目。本项目使用到的知识有:1、基础语法,分支,循环2、基本数据类型3、对象的封装、继承、多态4、接口5、Java的窗口类库先放一张成品图。很丑,但是不想做美工了,毕竟是一个练习性质的小项目。下面是系统架构:分成了四个包下面是包的结构和具体链接:包名 用途 链接...

2019-12-31 20:55:13 514

原创 Java飞机大战【4】游戏的主要类

这是飞机大战游戏的基础工具类代码及解释,其他的也在博客中游戏中上层的主要类,统一放在包com.airbattle.game下游戏的主要逻辑在这个包里实现类名 用途 Drawer 画图,用画笔Graphics,在画板上指定位置处画出img图像,这是静态方法 Property 关于游戏配置的所有常量,包括:设置背景、各个角色的图片,飞机移动速度、飞机开火速度、飞机...

2019-12-31 20:26:56 783

原创 Java飞机大战【3】游戏基本类

这是飞机大战游戏的基础工具类代码及解释,其他的也在博客中基本类有三类,统一放在包com.airbattle.gameobject下类 用途 Aircraft 飞行器,游戏中所有的飞行物(英雄机和敌机)都继承该类 Bullet 子弹类,主要是子弹的构造和移动 HostilePlane 敌军飞机,继承了飞行器类 这些类也被写残了,因为我的...

2019-12-31 20:02:45 829

原创 Java飞机大战【2】游戏接口

这是飞机大战游戏的基础工具类代码及解释,其他的也在博客中游戏接口有三个,统一放在com.airbattle.gameinterface包下接口 用途 GameObjectInterface 游戏元素接口,每个游戏元素都必须实现。后来被抛弃了,因为我代码水平不够 最后从瀑布模型转化成了迅捷开发 FlyingObjectInterface 飞行...

2019-12-31 19:51:43 608 1

原创 Java打飞机游戏【1】基础工具类

这是飞机大战游戏的基础工具类代码及解释,其他的也在博客中基础工具类包含三各类,统一放在com.airbattle.gameproperty包下类名 用途 Image 存放游戏元素的图像、图像长宽 Position 位置类,包含x,y坐标 Rect 矩形类,游戏元素占用的矩形框的坐标,包含左上角的坐标(x1,y1),右下角的坐标(x...

2019-12-31 19:45:46 282

原创 Java学习中被忽略的知识点与技巧(1)

JVM:java virtual machineJRE:java runtime environment = JVM + java系统类库,运行java程序JDK:java development kit = JRE + 编译/运行等命令工具运行java的最小环境:JRE开发java的最小环境:JDK环境变量: JAVA_HOME: Path for jdk CLASS...

2019-12-28 15:40:33 189

空空如也

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

TA关注的人

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