- 博客(39)
- 收藏
- 关注
原创 Servlet和Controller线程安全问题及其解决办法
controller是线程不安全的,因为controller默认是单例模式,不同的线程会对数据进行共享,导致数据混乱,对于一个浏览器请求,tomcat会指定一个处理线程,或者在线程池中选取空闲的,或者新建一个,单例的好处就是节省内存资源。同理servlet一样,再Tomcat中,每个servlet都是单例的;因为设计成单例模式的话,就不需要处理太多的gc,性能就可能得到提高。
2024-02-21 21:46:32
603
原创 Java类-URLEncoder和URLDecoder
这2个类是java .net包下的2个与编码相关的类。编码原因:1、因为当字符串以url的形式传递给web服务器的时候,字符串中不允许出现特殊字符,如空格、@、=、/等,所以需要编码。比如说有一个服务器接口需要传递邮箱,hehe@163.com url中是不允许出现@符合的,所以会被转义为hehe%40163.com现在标准的url规范中,中文和很多字符是不允许出现的2、如果url中出现了特殊字符,浏览器会自动帮你把这特殊符合进行url编码,然后传输到后台,后台再URLDecoder解码。
2024-02-21 21:29:57
664
原创 Https原理简介
1、签名:指的是浏览器端把发送的内容通过单向加密的方式进行加密(只能正向加密,不能解密的算法,如MD5,tip:MD5现在有解密方式),然后把加密后的字符串和内容一放在一起的过程叫加签。2、数字证书:主要是确保发送者是正确的人,不是黑客中途拦截而伪造的公私钥,需要的东西有第三方认证机构(CA)颁发的证书,数字证书中有:发送者的公钥,内容、颁发机构的公钥、有效期等。具体就是,浏览器用 CA 公钥,对 helloworld 的数字证书中的签名进行解密,得到摘要 D1。
2024-02-21 21:03:45
470
原创 Servlet[dispatcherServlet]的Servlet.init()引发异常
错误信息: javax.servlet.ServletException: Servlet[dispatcherServlet]的Servlet.init()引发异常 org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: org.xml.sax.SAXParseException; lineNumber 错误描述:主要是在配置spring的配置文件时,引入的约束地址往往可能不对,需要自己检查一下 解决办法:修改sprin
2022-04-27 21:17:43
2054
原创 org.springframework.beans.factory.BeanNotOfRequiredTypeException
spring事务
2022-04-26 21:23:22
2219
原创 Java的三目运算符与C++的三目运算符的区别
c++的三目运算符既可以作为左值接收赋值,又可以作为右值赋给其他变量,还可以作为表达式谁有不赋值 Java的只能作为右值赋给其他变量 c++:java只支持第一种 int main() { int a = 1; int b = 2; int c = a > b ? a++ : b++; //作为右值 a > b ? ++a : ++b = 100; //作为 左值 a > b ? a-- : b--; //作为单独的表达式 system("pause");
2021-11-03 15:12:08
304
原创 23种设计模式
1. 简单工厂模式 #include<iostream> using namespace std; //抽象水果类 class AbstractFruit { public: virtual void show() = 0; }; class Apple :public AbstractFruit{ public: virtual void show() { cout << "it's apple" << endl; } }; class Banana :p
2021-06-01 15:18:16
129
原创 linux GDB调试常用命令
tip:首先编译时需要-g携带编译信息 gcc a.c -g -o app gdb app :进入调试 run/r :运行程序 quit/q :退出程序 break/b :打断点 1.b +行号 2. b +函数名 3. b +if 变量名=value (条件断点) delete/del:删除断点,后面接断点编号,编号由info查看得知 info/i :查看信息 i b 查看断点信息 print/p :打印变量的值或地址 eg; p i p &i ptype : 打印变量的数据类型 p
2021-05-27 13:58:30
235
原创 静态库和动态库的制作与使用
静态库的制作: 1.命名规则: lib+库名+.a eg:libmyku.a 2.制作步骤 生成 .o文件 gcc -c *.c 将生成的.o 文件打包 ar rcs +库名(libmyku.a)+所需的.o文件 eg: 1: gcc -c *.c 2: ar rcs libmytest.a *.o 本质:提供一个静态库和一个头文件 该头文件包含有所库中的函数接口,该库中包含所有的函数实现(以库的形式提供,从而不提供原码) include :提供的头文件 lib: 为需提供的静
2021-05-26 20:52:15
211
原创 vim编辑器常用命令,用到啥补啥
vim的常用三种模式 命令行模式 :进入编辑器默认命令行模式 插入模式 :A,a,I,i,O,o 末行命令模式 : 在命令行模式下按下 “ :”进入该模式 补充2种模式:可视模式 :在命令行模式下按v或者V进入,作用选择多行,替换模式:按r进入,替换作用 常用的启动vim的命令 vi a.c :打开a.c文件 vi + a.c :打开文件a.c,并且在光标最后位置 vi +2 a.c :打开文件a.c,光标停留在第二行首 vi +/string a.c: 打开a.c,并将光标停留在第一个找到 的stri
2021-05-24 15:11:52
183
原创 递归概念专题
暴力递归 一:基础知识:暴力递归就是尝试出所有的方案。 1.1:递归的过程和伪代码模版 有明确的不需要继续进行递归的条件(basecase) 把问题转化为规模缩小了的同类问题的子问题 确定当得到了子问题的结果之后的决策过程 int/void process(一个或者两个变化参数和一些不变的参数) { if(end_condition) {//递归结束的条件和basecase是一致的,有2种理解方式 end;//结束情境 return; //return value; } slove();/
2021-05-15 17:06:28
149
原创 计数排序稳定版+不稳定版
#include<iostream> using namespace std; #include<vector> #include<algorithm> //计数排序:不稳定版(相等值相对位置变动)和稳定版(相等值相对位置不变动) //适用情况 :数量大但是数值的范围小 eg:年龄,(0-100)分数(1-100) //不稳定版 vector<int> processing(vector<int>arr) { int maxnum = *(ma
2021-04-27 17:30:04
194
原创 简单的程序计时
#include <iostream> #include <windows.h> using namespace std; int main() { DWORD star_time = GetTickCount(); //此处需要注意如果数值太小则检测不出来 for (int i = 0; i < 100000000; i++) { i++; } DWORD end_time = GetTickCount(); cout << "这个程序运行时
2021-04-27 14:35:22
142
原创 贪心案例1
#include<iostream> #include<algorithm> using namespace std; #include<vector> #include<string> /*贪心算法*/ //:一般是计算一个最大值或者最小值,(注意与dp分开)局部最优为全局最优 //1.问题描述:给一个字符串数组,返回其拼接后的最小字典序 class MyCompare { public: bool operator()(string a, st
2021-04-27 10:43:55
120
原创 迷宫问题
int Getminstep(vector<vector<int>>arr, int curx, int cury, int targetx, int targety, vector<pair<int, int>>used) { deque<pair<int, int>>dq; int countnum = 0; dq.push_back(pair<int, int>(curx, cury)); used.push_
2021-04-26 20:40:35
133
原创 全排列回溯法
#include<iostream> #include<algorithm> using namespace std; #include<vector> #include<string> #include<set> void processing(vector<string>arr,set<int>&used,string path,vector<string>&ans){ if (used.
2021-04-26 14:48:38
149
转载 C++类型转换
一 C风格类型转换 void test01(){ //一: /************C风格的转换*********************/ int a1 = 80; char c1 = a1; cout << c1 << endl; c1++; cout << c1 << endl; //C风格的自动类型转换 int a2 = 80; cout << (char)a2 << endl;//C风格的强制转换 }
2021-04-20 14:31:32
109
原创 拼凑面币
//#include<bits/stdc++.h> 没有vector #include<iostream> #include<vector> #include<algorithm> using namespace std; /*问题描述:arr中是面币的数值大小,eg:arr=={1,2,5,10,20,100}元等 要凑齐325元,有多少种方法? */ //作用:返回 可以自由使用arr[index...]及其以后的所有面值,每种面值可以使用任意张
2021-04-17 14:20:04
101
原创 机器人运动递归法+dp
#include<iostream> using namespace std; #include<vector> #include<string> #include<stack> #include<set> #include<unordered_set> #include<algorithm> /********************************从左到右的尝试模型************************
2021-04-17 11:20:32
181
原创 范围上的尝试模型
#include<iostream> using namespace std; #include<vector> #include<string> #include<stack> #include<set> #include<unordered_set> #include<algorithm> /* 范围上的尝试模型 特点 范围上的尝试模型由于left必定right 所以dp表只有斜对线一半(包括斜对线位置)有效
2021-04-16 23:16:11
161
原创 01背包
//#include<bits/stdc++.h> 没有vector #include<iostream> #include<vector> #include<algorithm> using namespace std; //输入如下 对应的输出为19 /*5 10 8 6 10 4 4 2 5 4 5 3*/ /***********************************暴力递归*****************************
2021-04-16 20:52:17
122
原创 VS简单的调试技巧
1、添加断点或取消断点:F9(或者点击代码行最左边的灰色行) 2、调试:F10逐过程(不进入函数内部,直接获取函数运行结果) 3. F11逐语句(会进入函数),如果想跳出函数按shift+F11,如果对某个函数的使用定义不清楚,按F12转到定义。 4、按F5执行,如果调试中多个断点,按F5,执行到下一个断点 5、出现箭头表示执行到该语句,但是该语句还没执行。 6、鼠标悬停,监视变量 常用: F11逐条执行,shift+F11跳出该函数 加上变量监视 完美 ...
2021-04-15 22:18:27
458
原创 解码方法 leetcode 91 字符对应转换数字 ,递归法+dp
#include<iostream> using namespace std; #include<vector> #include<string> #include<stack> #include<set> #include<unordered_set> #include<algorithm> /********************************暴力递归*****************************
2021-04-15 20:12:54
199
原创 全排列返回不重复序列递归法
#include<iostream> using namespace std; #include<vector> #include<string> #include<stack> #include<set> #include<unordered_set> #include<algorithm> /********************************普通输出全排列即使重复**********************
2021-04-15 16:15:22
145
原创 全排列 递归法
#include<iostream> using namespace std; #include<vector> //#include<string> //#include<stack> //#include<set> //#include<unordered_set> //#include<algorithm> class Solution { public: void swapfunc(int& a, int&
2021-04-15 15:36:18
97
原创 返回字符串所有不重复子序列 递归法
#include<iostream> using namespace std; #include<vector> #include<string> #include<stack> #include<set> #include<unordered_set> class Solution { public: //unordered_set<string>&ans为传出参数,必须为引用的方式。path记录每种选择的路径
2021-04-15 14:29:59
268
原创 获取字符串的子序列递归方式
#include<iostream> using namespace std; #include<vector> #include<string> #include<stack> class Solution { public: //vector<string>&ans为传出参数,必须为引用的方式。path记录每种选择的路径,最后 //被压入ans中,就是以引用的方式,也不会变化还是""空 void GetSonlist(strin
2021-04-15 14:12:42
286
原创 汉罗塔递归返回操作步骤和步数
#include<iostream> using namespace std; #include<vector> #include<string> class Solution { public: void hans(int n, string A, string B, string C, int& steps ) { if (n == 0) return; if (n == 1) { cout << " move " <<
2021-04-14 21:32:27
124
原创 斐波那契数列
#include<iostream> using namespace std; #include<vector> class Solution { public: /*************暴力递归法**************************/ int fibfoc(int n) { if(n==0) return 0; if(n==1) return 1; return fibfoc(n-1)+fibfoc(n-2);
2021-04-14 20:13:15
81
转载 STL容器根据迭代器的失效问题
STL容器根据迭代器的失效问题,其实可以分为两类容器: (1)数组型容器的插入删除操作:vector、string、deque(均为顺序存储) 由于这类容器的插入或删除都会使所有迭代器失效,因此每次插入删除后都需要重新定位 (2)结点型数据容器的插入删除操作:list(使用链表存储)、map(使用红黑树存储)、set(使用红黑树存储) 由于这类容器删除时只会失效当前迭代器,而插入时不会使任何迭代器
2021-03-31 11:15:56
98
转载 vim编辑模式下不能backspace的情况
先问下,是不是你在vi编辑模式下按退格键不能删除内容,按方向键不能上下左右移动? 如果是则: 在vi里非编辑模式下按冒号进入到末行命令模式,然后输入set nocompatible,回车,然后在进入vi编辑模式,看退格键是否生效,如果生效,你可以把set nocompatible这个设置放到~/.vimrc里让它永久生效。 或 安装vim full版本,ubuntu默认安装的是vim tiny版本: $sudo apt-get remove vim-common $sudo apt-get install
2021-03-16 16:14:55
386
原创 C++常用的标准输入方式
C++常用的标准输入方式 个人常用的就2种,cin>>和getline()(后面这个在头文件中),在理解cin功能时,不得不提标准输入缓冲区。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符\n,这个换行符\n也会被存储在cin的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了123456这个字符串,然后敲一下回车键(\r)将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是7 ,而不是6。 cin读取数据
2021-03-05 14:33:38
1979
原创 任意进制转换10进制和10进制转换成任意进制
任意进制转换10进制和10进制转换成任意进制 1 . 任意进制转10进制 原理 :输入是一个字符串,由函数体转换成数(考虑是否溢出int范围)。 #include<iostream> using namespace std; #include<algorithm> typedef long long LL;//这个具体要看要求,如果给的输入是否会超过一个int的范围 #include<string> LL TransDec(string num, int transTar
2021-03-04 20:31:25
556
1
原创 C++代码规范常见三条
C++代码规范常见三条 1.加注释 不多说,看别人代码最讨厌没注释,自己写代码最讨厌写注释。 2.标识符命名规范 2.1 标识符不能是关键字; 标识符是由字母,数字和下划线组成;且不能数字开头; 区分大小写 最重要的是见字知意 驼峰法命名标识符 驼峰法分大驼峰法和小驼峰法。大驼峰法是标识符首个单词的第一个字母大写。 小驼峰法是标识符首个单词的第一个字母小写。 大驼峰法应用:类名,函数名,命名空间,属性名(C++中也可以用小驼峰) class StudentInformation { stri
2021-03-04 19:30:42
287
1
原创 C++#define和typedef的区别
C++#define和typedef的区别 1.typedef用法 在C/C++语言中,typedef常用来定义一个***标识符及关键字***的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,如下: typedef int INT; // 标识符在前,有分号 typedef int* pINT; 2.#define用法 #define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),也可以是标识符关键字等,它本身并不在编译过程中进行,
2021-03-04 13:39:06
305
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人