
Coding
文章平均质量分 60
狮子HH
且将新火试新茶,诗酒趁年华!
展开
-
HikariCP:一个叫光的JDBC连接池
天不生我李淳罡,剑道万古如长夜。Hikari [hi·ka·'lē] 是日语“光”的意思。HikariCP的卖点是快、简洁、可靠,整体非常轻量,只有130Kb左右。HikariCP的出现可以说是颠覆了连接池领域,就连曾经风靡一时的BoneCP也主动停止维护,让贤于他。而且,在Spring Boot 2.0中,HikariCP凭借其优越的性能取代Tomcat成为默认的数据库连接池。原创 2023-06-08 14:27:36 · 6454 阅读 · 0 评论 -
ImmutableList hessian2序列化失败问题分析
Java中的不可变集合(guava的 ImmutableList、ImmutableSet等,Java9引入的ImmutableCollections相关类型)不能作为POJO参数进行序列化,但是可以直接作为对象进行序列化;float 反序列化后精度丢失,double 没问题;keySet()返回的Set未实现Serializable,Hessian反序列化结果为ArrayList;原创 2023-01-26 16:23:58 · 2722 阅读 · 0 评论 -
Comparator.nullsLast 空指针问题
线上报了个NPE,定位问题是nullsLast排序时从map里取到的值为null导致,但既然使用了nullsLast说明开发在写代码时对空指针是有防御意识的,虽然实际没有起到预期的效果。仔细看了下代码发现大家对nullsLast/nullsFirst的理解并不深,有不少代码写法有问题,导致并不能起到想要的效果。原创 2022-10-09 01:41:47 · 3541 阅读 · 0 评论 -
本地缓存之王-Caffeine
引言随着业务体量的增长,使用的缓存方案一般会经过:1)无缓存直接查DB;2)数据同步+Redis;3)多级缓存 三个阶段。第1阶段直接查DB只能用于小流量场景,随着QPS升高,需要引入缓存来减轻DB压力。第2阶段一般会通过消息队列将数据同步到Redis,并在数据发生变更时同步更新Redis,业务查询时直接查Redis,如果Redis无数据再去查DB。该方案的缺点是如果Redis发生故障,缓存雪崩会直接将流量打到DB,可能会进一步将DB打挂,导致业务事故。第3阶段将Redis缓存作为二级缓存,在其上再原创 2022-01-30 19:54:34 · 20664 阅读 · 4 评论 -
const与指针
const与指针在C/C++中,const与指针之间的不同的位置关系代表着不同的意义。 本文主要对这种关系进行一次梳理,给出两种容易理解和记忆的判别方法。 一种方法是将const之后的内容看做一个整体; 另一种通过从右向左读的方法来进行识记。将const之后的内容看作一个整体char * const a;const和a之间没有*,说明a是不可写的,*a是可写的。 也就是说a是一个常量指针,原创 2016-07-19 19:33:53 · 1806 阅读 · 0 评论 -
数字推理技巧
第一步:整体观察若有线性趋势则走思路A,若没有线性趋势或线性趋势不明显则走思路B。注:线性趋势是指数列总体上往一个方向发展,即数值越来越大,或越来越小,且直观上数值的 大小变化跟项数本身有直接关联(别觉得太玄乎,其实大家做过一些题后都能有这个直觉)第二步思路A:分析趋势1. 增幅(包括减幅)一般做加减。基本方法是做差,但如果做差超过三级仍找不到规律,立即转换思路,因为公考没有考过三级以上的等差数列转载 2016-08-05 16:51:49 · 5274 阅读 · 0 评论 -
全排列与next_permutation
全排列是面试笔试过程中经常遇到的一个问题。对于练习过的同学来说,这个问题其实 不算一个难题,但是对于没有练习过的同学,或者说只是知道大致思路的同学来说, 要在短时间内写出正确的全排列代码还是有点难度的。本文是作者在学习全排列时的一个总结笔记,主要包括: [1]. 全排列的递归实现 [2]. 全排列的非递归实现 [3]. STL中的next_permutation全排列的递归实现递归方法的全原创 2016-07-27 16:01:23 · 8150 阅读 · 0 评论 -
leetcode_p139_WordBreak_cpp
leetcode p139:word break 给定一个字符串s和一个字典dict,判断该字符串是否可以由字典中单词组成。举个栗子: s = “leetcode” dict = [“leet”, “code”] s可以由dict中单词组成,所以返回true。注意!栗子2:input: "abcd" ["a","abc","b","cd"]output: tr原创 2016-10-26 23:59:21 · 483 阅读 · 0 评论 -
JianZhiOffer_p31_GreatestSumOfSubarray
[笔试面试高频题] 求一个数组的子数组中所有元素和的最大值。 子数组指一个或连续多个数组成的数组。 使用动态规划方法求解,算法的时间复杂度为O(n).举个栗子: 输入数组为:6,-3,-2,7,-15,1,2,2 和最大的子数组为:6,-3,-2,7 输出该子数组的和为:8解法:用curSum[i]表示前i个元素(包含第i个, i从0开始)所组成的子数组的最大和,那么max(curSum原创 2016-10-25 23:05:37 · 650 阅读 · 0 评论 -
leetcode_p6_ZigZag_Conversion_c++
leetcode p6: ZigZag_Conversion给定一个字符串s和行数numRows, 先将该字符串按z形排成numRows行,然后按行输出所有字符组成的新字符串。举个栗子: 从中发现:这些数字都与6有关,称为magicNum,该数与行数有关,举个不同行的例子,可以发现规律: magicNum = 2*(numRows - 1) ;对于每行的第一个数字,是以2为步长依次递减的,当为原创 2016-10-24 11:50:18 · 525 阅读 · 0 评论 -
leetcode_p64_MinimumPathSum_cpp
leetcode 第64题:Minimum Path Sum 给定一个m*n的非负整数矩阵,找到一条从左上角到右下角的路径,使得该路径上的数字之和最小。分析: 要使得和最小,则要求在每个格子上只能向下或向右两种走法。 如果用穷举法,由于所有可能路径为(m-1)+(n-1) = m+n-2种,即m-1步向下走,n-1步向右走,所以所有可能情况为C(m+n-2, m-1),由于随着m和n的增原创 2016-11-08 15:08:15 · 481 阅读 · 0 评论 -
JianZhiOffer_p33_把数组排成最小的数
输入一个正整数数组,将数组中各个数字连成一个数,输出所有可能的数字中最小的那个数。举个栗子: 输入: 3,32,321 输出: 321323最直观的做法是穷举所有排列所组成的数字,再从中找出最小的,该解法由于要穷举所有排列,所以复杂度至少为O(n!)。有一种O(n*logn)的解法是,先对数组中数字按从小到大的顺序排序,再将数组中数字连接起来即为最小的数。这里需要注意两点:排序过程中,按递增顺原创 2016-10-29 01:18:53 · 879 阅读 · 0 评论 -
C++ STL中的六大件
(《STL源码剖析》学习笔记)STL提供了六大组件容器(containers) 用来存放数据,包含多种数据结构,如:vector、list、deque、set、map等。 从实现的角度来看,STL容器是一种class template。算法(algorithms) 包括各种常用算法,如:sort、search、copy、erase等。 从实现的角度来看,STL算法是一种function原创 2016-11-18 18:12:19 · 1221 阅读 · 0 评论 -
Spring装配Bean
Spring提供了三种主要的装配机制:在XML中进行显式配置。在Java中进行显式配置。隐式的bean发现机制和自动装配。Spring从两个角度来实现自动化装配:组件扫描(component scanning): Spring会自动发现应用上下文中所创建的bean。自动装配(autowiring): Spring自动满足bean之间的依赖。自动化装配Bean@Component注解这个原创 2017-06-19 14:04:55 · 546 阅读 · 0 评论 -
MyBatis Generator自动生成代码
MBG介绍 MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。MyBatis使得数据库操作变得非常原创 2017-06-19 18:04:28 · 2360 阅读 · 0 评论 -
妙解质因子--不进行质数判断
//功能: 输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )//输入:输入一个long型整数//输出:按照从小到大的顺序输出它的所有质数的因子,以空格隔开#include <iostream>using namespace std;int main(){ long input; while(cin>>input){原创 2016-04-21 14:09:28 · 735 阅读 · 0 评论 -
C++中define与const的区别
C++中不但可以用define定义常量还可以用const定义常量,它们的区别如下:用#define MAX 255定义的常量是没有类型的,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常量的名字联系起来,define所定义的宏变量在预处理的时候进行替换,在程序中使用到该常量的地方都要进行拷贝替换;用const float MAX = 255; 定义的常量有类型名字,存放在内存的静态区域原创 2016-04-21 10:20:54 · 16816 阅读 · 5 评论 -
递归生成格雷码
腾讯2016研发笔试/* 递归生成格雷码当n=1时,{0,1}当n=2时,{00,01,11,10}当n=3时,{000,001,011,010,110,111,101,100}...n位格雷码共有2^n个元素。其中每个元素是(n-1)位的格雷码前面加0,然后再反向后前面加1生成的。如n=3可由n=2进行两步操作后得到:1.在n=2的格雷码前面加0,生成:000,001,011,01原创 2016-03-29 13:14:34 · 825 阅读 · 0 评论 -
C/C++中的移位运算
在计算机中,数值是以补码来表示和存储的。所以移位运算都是在“补码”上进行操作的。原码转补码 正数的补码与原码相同。 负数的补码:符号位为1,其余位是原码按位取反,然后整个数加1。原创 2016-04-01 11:53:50 · 937 阅读 · 0 评论 -
SQL语言的四种类型
SQL包含四种程序设计语言类别的语句:数据定义语言(DDL)、数据操作语言(DML)、数据控制语言(DCL)和事物控制语言(TCL)。Data Definition Language(DDL) DDL使我们有能力创建或删除表格。也可以定义索引(键),规定表之间的链接,以及施加表间的约束。 CREATE DATABASE - 创建新数据库 ALTER DATABASE - 修改数据库 CREA原创 2016-04-14 16:46:49 · 18579 阅读 · 6 评论 -
SQL基本命令
注意: - SQL 对大小写不敏感! - SQL 语句后面的分号要视具体的应用环境而决定加还是不加。 如果是MS Access 和SQL Server 2000则不必使用分号,而有些数据库软件则必须使用分号。 (也有说在程序里写sql不要加分号,否则编译器会把分号认为是sql语句本身的一部分,在查询工具里可以使用分号作为sql语句分隔标志。)select 用于从表中选原创 2016-04-14 18:16:29 · 675 阅读 · 0 评论 -
寻找第K大的数(快排思想)
使用快排思想找第K大的数,算法复杂度O(n)。1.以数组a的第0位a[0]为参考基准base,将数组划分为两个部分; 如果找第K大的数,则将大于base的数往前挪,将小于base的数往后挪。如果找第K小的数,则与此相反。 划分过程与快排相同,使用两个指针i和j分别指向数组的首尾,根据指针所指元素与基准base的大小交替移动两个指针,直到两个指针指向同一个位置i==j,此时i或j即为base的下标原创 2016-04-15 22:27:19 · 11756 阅读 · 0 评论 -
C++笔记:0
1.对字符串进行sizeof操作的时候,会把字符串的结束符”\0”计算进去的,进行strlen操作求字符串的长度的时候,不计算\0的。2.数组作为函数参数传递的时候,会退化为指针。3.对于内置类型而言,new仅仅是分配内存,除非后面显示加(),相当于调用它的构造函数; 对于自定义类型而言,只要一调用new,那么编译器不仅仅给它分配内存,还调用它的默认构造函数初始化,即使后面没有加()。4.enum原创 2016-02-26 09:58:52 · 476 阅读 · 0 评论 -
C++笔记:1
1.vector<vector<int> > array(3,vector<int>()) ; //vector()是对vector进行初始化,否则不能通过array[i].push_back()存入元素.这是因为空vector根本不包含任何元素,所以不能通过下标去访问元素。正确的方法是使用push_back()。2.vector 的小标运算符可以用于访问已存在的元素,不能用于添加元素。只能对已存在原创 2016-02-27 09:36:56 · 581 阅读 · 0 评论 -
C++笔记:2
1.strcpy(s1,s2)这个函数是把s2字符串拷贝到s1这个字符串,同时也把s2的 ‘\0’ 拷过去. strlen()遇到 ’ \0 ’ 停止. 2.一般转义字符:这种转义字符,虽然在形式上由两个字符组成,但只代表一个字符。常用的一般转义字符为:\a \n \t \v \b \r \f \ \’ \"; 3.八进制转义字符:它是由反斜杠’\’和随后的1~3个八进制数字构原创 2016-02-28 09:01:15 · 692 阅读 · 0 评论 -
C++笔记:3
1.斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*).2.函数模板的声明.函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计。它的最大特点是把函数使用的数据类型作为参数。函数模板的原创 2016-02-29 15:29:20 · 105 阅读 · 0 评论 -
C++笔记:4
计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。 在计算机系统中,数值一律用补码来表示和存储。 正整数的补码是其二进制表示,与原码相同. 求负整数的补码,将其对应正数二进制表示所有位取反(包括符号位,0变1,1变0)后加1。-5对应正数5(00000101)→所有位取反(1111原创 2016-03-01 10:59:45 · 650 阅读 · 0 评论 -
指针与引用的区别
指针和引用在c++中都是复合类型(compound type),即基于其他类型定义的类型。指针本身就是一个对象,允许对指针进行赋值和拷贝,在指针的生命周期内它可以先后指向几个不同的对象。 引用并非对象,相反它只是为一个已经存在的对象所起的另外一个名字,“引用即别名”。因为引用不是对象,所以: 不能定义引用 的引用; 没有实际地址,不能定义指向引用的指针。区别:指针是一个对象,而引用仅是个别名原创 2016-04-16 10:34:43 · 480 阅读 · 0 评论 -
C++英文面试常见问题
Difference between new/delete and malloc/freeNew/delete is C++, malloc/free comes from good old C.In C++, new calls an objects constructor and delete calls the destructor.Malloc and free, coming from t原创 2016-04-16 11:21:08 · 2881 阅读 · 0 评论 -
非循环的冒泡排序
在不适用循环的条件下,写出冒泡排序。循环与递归之间可以相互转换,不让使用循环那只能通过递归来代替循环过程了。搞清楚递归过程中需要改变的变量和递归的结束条件就ok了。 代码比较简单,如下所示:#include<iostream>#include<algorithm>using namespace std;void BubbleSortNoLoop(int a[],int start,int n)原创 2016-04-18 19:02:38 · 1002 阅读 · 0 评论 -
sizeof(class)
在使用sizeof计算类的大小时要注意:sizeof是用来计算栈中变量的大小的,不涉及全局区,故sizeof计算类的大小时,不考虑静态成员变量的大小;类与结构体一样,都存在字节对齐问题;类中普通函数不占用类的大小,类中虚函数不管有多少个只需要占用一个虚函数表指针的大小;类中常量存在静态存储区不占用类大小,如const、static、enum;子类的大小=子类新增加的大小+父类大小。//原创 2016-05-04 16:34:10 · 2198 阅读 · 0 评论 -
求最大公约数
欧几里得算法或辗转相除法#include <iostream>using namespace std;//循环gcd:greatest common divisorint gcd(int a,int b){ int tmp; while(b){ tmp = b; b=a%b;a=tmp; } return a;}//递归gcdint gcd1(原创 2016-03-16 11:24:21 · 559 阅读 · 0 评论