java
文章平均质量分 84
阿梨喜欢吃榴莲
这个作者很懒,什么都没留下…
展开
-
算法-面试-字符串去重、统计、排序
目录一、常规方法二、前缀树前几天遇到一个面试问题,一个字符串,“aaabbbbccc”,对其进行统计,记录3个a,4个b,3个c,最终打印3a,3c,4b。其实后来面试官提示了用python,后来想了想,用python很简单,但是因为python的第三份库太太太丰富了,所以记起来不容易,java相对时间久,运用也熟悉,就选择了java。一、常规方法这个题,去重,统计都简单,直接用map即可。难的是排序,如何将字符和个数对应起来,而且用个数排序呢?可以知道,“对应起来”放到一个对象原创 2021-11-11 15:21:15 · 917 阅读 · 0 评论 -
算法 - 二叉树的基本算法
目录一、二叉树二、二叉树的先序、中序、后序遍历(一)、递归遍历(二)、非递归遍历(1)先序:头左右(2)中序:左头右(3)后序:左右头三、实现二叉树的按层遍历(一)、遍历-队列(二)、求最大层的宽度四、二叉树的序列化和反序列化(一)、递归(二)、按层一、二叉树图示:结构:public class BtreeNode { public int value; public BtreeNode left; pub..原创 2021-09-28 10:22:53 · 6177 阅读 · 0 评论 -
算法 - 链表相关问题
目录一、问题总纲领二、例题(一)、链表中点(二)、回文结构(三)、链表分成大中小区(四)、复制有随机指针的链表(五)、有/无环 链表相交(五-1)、首先判断一个链表是否有环(五-2)、链表相交(六)、删除某节点一、问题总纲领·笔试:一切为了时间复杂度,不用太关注空间复杂度;一般来说优先考虑用数组,hash表等解决·面试:既要考虑时间复杂度,又要考虑空间复杂度;一般用指针解决二、例题(一)、链表中点⚪ 链表奇数长度,返回中点,偶数长度,返回上中.原创 2021-09-17 15:11:22 · 239 阅读 · 0 评论 -
算法 - 前缀树
目录一、前缀树含义二、代码实现(一)前缀树实现方式一:方式二:(二)暴力实现一、前缀树含义前缀树:把一个“最小”单位的数据看成一个节点到另一个节点的路径,每个节点有两个属性,一个是所有数据经过这个节点的次数pass,一个是这个节点作为结束位置的次数end。例如,一个数组["abc","abd","ab","kst"],看它怎么用前缀树表示:(1)首先有一个节点,指向null(2)看"abc",怎么生成前缀树a.首先是a,第一个节点没有a路径,先生成a.原创 2021-08-11 22:07:57 · 1635 阅读 · 0 评论 -
算法-随机快排
目录一、引:荷兰国旗问题二、快排1.0:每次只排一个数三、快排2.0:每次排一批数四、快排3.0:随机快排五、时间复杂度1、快排1.0时间复杂度2、快排2.0时间复杂度3、快排3.0时间复杂度一、引:荷兰国旗问题一个数组[5,3,7,2,3,4,8,1],给一个数num=4,需要将数组左边放小于4的,中间放等于4的,右边放大于4的。步骤:1、设置一个小于区,大于区2、把数组值一个一个和num比较,第一个是5,当arr[i] > nu.原创 2021-07-12 16:18:40 · 546 阅读 · 5 评论 -
算法-栈 队列
一、栈和队列概念和链表这种“能看见”的不同,栈和队列属于逻辑概念。栈:犹如弹夹,先进后出;队列:犹如排队,先进先出。二、如何用链表实现栈和队列无论是实现栈还是队列,无非是进出的操作,所以用链表实现进出就可以了。1、链表实现进出栈加数据是从尾部加,弹出数据从尾部弹;队列加数据从尾部加,弹出数据从头部弹。所以我们用链表实现3个方法,从尾部加数据,从尾部弹数据,从头部弹数据。1、链表实现栈使用单向链表即可。从尾部加数据,尾部需要有一个指针,再加数据尾部指针不停后移:原创 2021-07-06 13:56:09 · 147 阅读 · 0 评论 -
算法-链表
目录一、创建单向链表、双向链表1、单向链表2、双向链表二、反转链表1、单向链表反转2、双向链表反转三、删除单向链表中的某种值一、创建单向链表、双向链表创建链表,只要明白它的含义,就可以推断出它的属性:1.此节点的值;2.此节点的指针指向的下一个节点。1、单向链表比如创建一个数值型单向链表,用Java语言实现,节点的值设置为int型,节点的指针指向它的下一个节点,下一个节点也是此类的对象:public class Node{ public int va原创 2021-07-03 21:45:27 · 205 阅读 · 2 评论 -
jmeter BeanShell断言判断返回的json中是否包含某字段
工作中,常遇到判断结果json中的某些字段是否和预期一样,而这些字段往往比较多,这时可以用到BeanShell断言。例如:返回结果json是:{ "result": { "realtime": { "wid": "00", "temperature": "-2", "direct": "北风", "aqi": "27", "humidity": "27原创 2020-12-07 14:33:36 · 3745 阅读 · 0 评论 -
深入理解 Spring 事务原理
一、事务的基本原理Spring事务 的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获取连接 Connection con = DriverManager.getConnection() 开启事务con.setAutoCommit(true/false); 执行CRUD ...转载 2018-07-08 19:29:24 · 319 阅读 · 0 评论 -
Ajax跨域请求Cookie无法携带
一、问题在做前后端分离时,前端用ajax发送请求,后端接收请求并设置cookie返回,但是在调试的时候始终无法将cookie写入到浏览器,也就是始终无法使response携带cookie返回。最终发现是ajax问题,ajax默认不支持携带cookie。二、解决发现了问题就要解决:(1)修改ajax参数,使之支持跨域携带cookie:xhrFields : {withCredentials: t...原创 2018-05-16 11:28:44 · 4281 阅读 · 0 评论 -
前后端分离开发跨域问题
一、问题前后端分离开发的时候会有跨域问题的出现:XMLHttpRequest cannot load http://localhost:8080/user/get_user_info.do. The 'Access-Control-Allow-Origin' header has a value 'http://localhost:8080' that is not equal to the su...原创 2018-05-15 22:16:06 · 1963 阅读 · 0 评论 -
Java中如何保证线程安全性
一、线程安全在三个方面体现1.原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,synchronized);2.可见性:一个线程对主内存的修改可以及时地被其他线程看到,(synchronized,volatile);3.有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序,(happens-before原则)。接下来,依次分析。二、原子性-...原创 2018-05-12 16:58:10 · 55840 阅读 · 9 评论 -
Java反射
一、引言:首先,要理解一句话“万事万物皆对象。”比如一个类Foo:(1)它的实例对象,new Foo()出来就可以;(2)那么这个Foo是不是对象呢?是的,Foo这个类是java.lang.Class的实例对象。那么它如何表示呢?new Class()就可以吗?Class源码:构造函数是私有的。只有JVM才能创建。那么Class的实例对象Foo如何(用Class)表示呢?二、创建Foo类的类类型C...原创 2018-03-31 19:34:38 · 97 阅读 · 0 评论 -
Mybatis plugin笔记
一、问题:当使用mybatis框架的时候,从dao层往mapper找对应的方法的时候,往往需要copy方法名,然后查找,很费时。而Mybatis提供的Mybatis plugin却很好的解决了这个问题。二、效果:dao:mapper:通过箭头直接就找到了对应的方法。三、做法:打开Settings。install之后,重启idea,就大功告成了。dao已经和mapper一一对应上了。...原创 2018-04-21 14:34:47 · 914 阅读 · 0 评论 -
web应用连接mysql报错:You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true
一、问题:当用mybatis连接mysql时,出现报错:Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be es...原创 2018-04-21 14:54:28 · 5663 阅读 · 0 评论 -
StringUtils类的isNotBlank 和isNotEmpty
isNotBlank 和isNotEmpty要清楚方法才能不混用,避免在代码中的坑。看isBlank 和isEmpty源码:可以看到isBlank()判断如果是空格的话为true,而对于isEmpty(),空格即不是null,length()也不不等于0,所以为false。那么对于isNotBlank 和isNotEmpty也就清楚了:isNotBlank()传入是空格,认为false;isNot...原创 2018-04-21 16:54:31 · 597 阅读 · 0 评论 -
get方式传值中文乱码
一、问题:当用get显式传值的时候,结果传入到数据库中为乱码。二、可能存在的问题以及解决方法:(1)在后端进行拦截,编码置成UTF8。(2)mysql配置文件5.1版本,my.ini内[mysql][mysqld]中添加:default-character-set=utf8;5.5版本,my.ini内[mysql]中添加:default-character-set=utf8;[mysqld]中添加...原创 2018-04-21 17:11:47 · 616 阅读 · 0 评论 -
BigDecimal解决浮点精度丢失
一、问题:(1)在电商网站计算中,价钱计算是重要一环,那么价钱是如何计算的,先来看:可以看到如果用Long类型计算,会导致问题。比如我买一件0.01元和0.05元的商品,我手里一共0.06元,是可以购买的,但是付款的时候却会发现钱不够,因为Long类型,0.01+0.05等于0.060000000000000005,我们少了0.000000000000000005元。同样的下面,也会减乘除都会遇到...原创 2018-04-21 17:34:45 · 5282 阅读 · 1 评论 -
java实现ftp上传文件
一、java代码(1)创建一个ftp工具类FTPUtil,连接ftp服务端,并上传文件。import lombok.extern.slf4j.Slf4j;import org.apache.commons.net.ftp.FTPClient;import java.io.File;import java.io.FileInputStream;import java.io.IOExcept...原创 2018-04-21 21:49:12 · 358 阅读 · 0 评论 -
guava cache实现防止横向越权
一、问题:忘记密码,在非登录状态下重设密码,回答成功密保问题后,跳转到重置密码页面,如果攻击者看到重设密码接口,就可以输入任意用户名和密码提交,如果用户名存在,就导致这个用户名下密码被修改。为了防止这种横向越权,我们会在答对密保问题后服务端生成一个token返回。然后重设密码后,浏览器端把相应密码信息连token一起交给服务端。服务端借此验证是否为同一个token。二、代码实现我们用guava来实...原创 2018-04-22 16:51:19 · 509 阅读 · 0 评论 -
redis防止横向越权
一、之前有通过guava的cache实现token生成,现在我们用redis实现,过程其实是一样的。之前文章:https://blog.csdn.net/weixin_40459875/article/details/80034267二、(1)先创建一个jedis连接池,连接redispublic class RedisShardedPool { private static Sharde...原创 2018-04-22 16:51:48 · 457 阅读 · 0 评论 -
并发,高并发,CPU多级缓存概念
最近一直在学习java并发编程。整理笔记的过程也是对自己考核的过程。一、并发与高并发概念并发:同时有多个线程,【交替】被CPU执行。高并发:保证系统能同时并行处理很多请求的【设计】。可以看到,当谈论并发的时候,我们关注的是多个线程操作相同的资源时,如何保证线程安全,合理利用资源;而谈论高并发时,我们关注的是如果系统在短时间内遇到大量请求(比如淘宝双十一),那么我们如何提高系统的性能(包括硬件、网络...原创 2018-05-12 12:06:55 · 2604 阅读 · 0 评论 -
Java内存模型
一、Java内存模型概念Java内存模型(Java Memory Model,简称JMM)是一种规范,它规范了java虚拟机与计算机内存如何协同工作,规定了一个线程如何和何时可以看到其他线程修改过的共享变量的值,以及在必须时如何同步的访问共享变量。二、JVM内存分配:堆和栈堆(heap):是运行时的数据区,由垃圾回收负责。优势是可以动态的分配内存大小,生存期也不必事先告诉编译器,缺点是存取速度慢(...原创 2018-05-12 13:38:00 · 167 阅读 · 0 评论 -
Integer自动装箱和拆箱和比较
一、int 和Integer比较。不管Integer是直接等于一个数值,还是=new Integer(xxx);都是Integer拆箱成int,再去和前面那个int数值比较。二、Integer和Integer比较,存在三种情况。a.它们两个都是直接等于一个数值,那么看这个数值大小,-128~127之间,会转成Integer.valueOf(xxx),写入缓存,第二次写入就是用缓存中原创 2018-02-01 10:33:08 · 870 阅读 · 0 评论