Java
文章平均质量分 69
皮皮蟹01
在校计算机专业本科生一枚,想与大家一起交流技术、代码、前沿科技、new idea。还请社区里的大神们多关照。^_^
展开
-
【踩错】Spring源码环境搭建踩坑记录
2021-10-06之前调试Spring源码为了图省事,都是直接利用idea搭建一个Spring项目然后断点调试。这样的好处是快,坏处是对于Spring的整个代码架构没办法像自己的项目代码那样每个包、每个模块一目了然,并且是只读的,没有办法做一些修改与注释。搭建Spring源码阅读环境势在必行。废话不多说,记录一下坑。我使用的是Spring-5.0.4、gradle-4.4.11.下载Spring源码,下载并配置gradle2.配置Spring源码依赖的jar包的下载地址,打开根目录下的build原创 2022-01-27 00:14:41 · 495 阅读 · 0 评论 -
【小记】探析Java类加载时机
2021-09-14最近在重温《深入理解Java虚拟机》这本书,对于第七章的类加载机制部分了解到了之前没有注意的细节,特在此总结记录下来。类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个阶段部分统称为连接(Linking)。什么情况下需要开始原创 2022-01-26 18:07:42 · 215 阅读 · 0 评论 -
【踩错】thymeleaf多重${}
2021-07-03今天遇到一个问题,thymeleaf接收到controller传递过来的model数据中,含有list和map结构的数据,在thymeleaf渲染数据的过程中,首先用th:each遍历list,取list中的元素作为map的键,然后从map中取出对应的value来。想要在thymeleaf上渲染controller层传递过来的数据,需要使用${}来获取后台数据,例如contoller传递一个“user”到thymeleaf,需要在前端使用user.id,如下所示,可以获取到传递过来的原创 2022-01-26 18:03:23 · 565 阅读 · 0 评论 -
【小记】logback日志框架的配置和使用
2021-07-01日志在项目中必不可少,目前流行的日志框架有log4j、log4j2、logback,其中logback和log4j作者是同一个人。logback是SpringBoot默认集成的日志框架,效率高,能适应诸多的运行环境,是SLF4J门面框架的一种实现。添加依赖添加依赖:在pom文件中添加spring-boot-starter-logging<dependency> <groupId>org.springframework.boot</groupI原创 2022-01-26 18:03:05 · 187 阅读 · 0 评论 -
【小记】fail-fast和fail-safe
2021-06-19以前也遇到过在遍历集合的过程中对集合元素进行删除的时候会报出错误的情况,之前一直没弄明白是怎么回事,这次也花了一点时间看了一下相关内容,在此做一个总结。fail-fast快速失败其实是一种编程思想,即快速反馈系统错误,防止发生更严重的问题。我们平时写的在函数的开始进行参数的判空操作,其实也是属于一种快速失败机制的实现。在用迭代器遍历一个对象的时候,如果遍历的过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Excepti原创 2022-01-26 18:02:29 · 270 阅读 · 0 评论 -
【小记】为什么jvm的新生代要分为一个Eden和两个Survivor
2021-03-12现在的JVM的新生代内存中,除了Eden区,还有两个Survivor区。那为什么要这样设置呢?这和新生代的垃圾回收算法是息息相关的。复制算法复制算法是新生代的垃圾收集收集算法,基本思路是将新生代分为两个大小一样的内存区域,每次新对象会放置在其中的一块区域内。当该区域的大小不足以继续分配对象时,此时就会促发Minor GC,首先将存活的对象标记出来,然后将存活的对象转移到另一块内存区域中,这样可以比较紧凑地将对象排列在一起,减小了内存碎片。同时之前那块内存可以一次回收掉所有的对象。原创 2022-01-25 21:20:42 · 1548 阅读 · 0 评论 -
【小记】如何保证缓存和数据库的一致性
2021-03-07今天看到一个有意思的问题,如何保证缓存和数据库的一致性,思考后查资料总结如下。要对数据库更新,如何处置缓存,更新or删除?选择删除缓存。因为要更新的数据可能是简单的也可能是复杂的,复杂的数据更新缓存的话,成本较大,所以选择删除缓存。如果选择更新缓存的话,频繁的写操作意味着数据库和缓存都频繁更新,但重点是,该数据的读频率多大。根据28法则,20%的数据占了80%的访问量,对于某些缓存的频繁更新有点得不偿失。先淘汰缓存还是先更新数据库?先淘汰缓存如果先更新数据库,再淘汰缓存,原创 2022-01-25 21:20:14 · 83 阅读 · 0 评论 -
【实践】springboot中的重定向数据传递
2020-06-17在写springboot项目的时候,有时候会有重定向的需求,例如登录界面登录后,就应该使用重定向来进行页面的跳转。如果这时候使用的是转发的方式来进行页面的跳转的话,会出现两个问题:浏览器上的路径不会改变在主页中点击刷新时,页面会提示需要再次提交表单因为转发是通过forward()方法提交信息在多个页面之间进行传递。登陆后地址栏是需要变为主页地址的,而且也不应该出现刷新提示提交表单的现象,所以应该使用重定向来进行登录跳转。那么这就出现了一个问题,重定向的页面不能读取转向前通原创 2022-01-25 21:17:54 · 3532 阅读 · 0 评论 -
【实践】springboot上传文件
2020-05-31最近有个需求是上传文件到服务器,使用到的框架是springboot,查询资料后记录如下。1.添加基本依赖这是第一步,但一般建立springboot项目的时候能够勾选该启动依赖。<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency&原创 2022-01-25 21:17:27 · 934 阅读 · 0 评论 -
【源码】HashMap源码阅读
2020-02-02下面是JDK11中HashMap的源码分析,对代码的分析将主要以注释的方式来体现。1 概述1.1 HashMap的主要概念HashMap是基于Map接口实现的哈希表,实现了Map接口中的所有操作,而且HashMap允许键为空值,也允许值为空值,与之对应的是Hashtable,Hashtable不能将键和值设置为空。HashMap不能保证元素的顺序,特别是,它不能保证随着时间的推移保持顺序不变。HashMap为基本操作(get和put)提供了恒定的时间性能,假设散列函数在原创 2022-01-24 17:40:57 · 481 阅读 · 0 评论 -
Web聊天室消息[已读未读]的实现
聊天室快速访问继上次完成聊天室的历史记录功能后,我又想着实现聊天记录的已读未读功能。(轻喷。。)开始之前首先我看了抖音和钉钉这两款应用的消息已读未读功能的呈现效果。首先是抖音,在聊天界面,给好友发送完消息后,消息界面的最右下角有一个“已发送”标记,这时候是属于对方未读,如果对方上线并别点开了和你的聊天界面,你和他的聊天界面上,那个“已发送”就变成了“已读”,所以抖音并不会每一条消息上面都显示“已读”或者“未读”。而钉钉,由于其专注于办公,这个已读未读功能就“变态”多了,每一条发出去的消息都会显示对方是原创 2021-07-12 16:14:53 · 7223 阅读 · 8 评论 -
Web聊天室历史记录解决方案(轻喷。。)
聊天室快速访问之前写的Web聊天室一直没有更新了,其实还有一些功能没有完善,比如历史记录、视频对话等。这几天心血来潮,捡起之前的代码,从看起来最简单的聊天记录开始整。开始之前当时写这个聊天室的时候,没有考虑保存聊天记录的功能,因为当时把写的东西先跑起来实现消息发送再说,,,汗,,。 跑起来之后想了想历史记录保存的问题,第一反应是保存到数据库啊!!!就是发一条,就保存一条,执行一条SQL语句。嗯,,很直接暴力。另外查了查资料,网上的文章和帖子都说即时通讯应用的聊天记录都是不会对数据库进行频繁读写的,因为原创 2021-07-05 10:07:26 · 3746 阅读 · 1 评论 -
个人网站新功能:聊天室
之前在个人网站上预留了一个网页聊天室的功能,在这次寒假抽出了时间来完成。快速访问简要记录一下网页聊天室的设计过程。AJAX轮询在设计之前一直纠结该使用何种方式来实现网页聊天室这个模块,最基本的想法是使用ajax来实现轮询,从而达到消息推送的目的,目前的很多网站也是通过这样的手段来实现推送技术。轮询是在特定的时间间隔(如每一秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这样传统的模式需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可原创 2021-03-05 13:36:28 · 353 阅读 · 0 评论 -
解决Shiro第一次重定向url带有jsessionid导致400错误
在Shiro进行第一次重定向时,会在url后携带jsessionid,这会导致400错误(无法找到该网页)。原因在于ShiroHttpServletResponse配置类的doIsEncodeable当中,会将url自动拼接jsessionid。解决办法:在Shiro的配置类中的sessionManager()方法中,将sessionIdUrlRewritingEnabled属性设置为false。该方法返回一个DefaultWebSessionManager实例。将上面方法返回的实例设置为Defa原创 2021-02-20 22:37:28 · 2639 阅读 · 1 评论 -
造了个工具:GitHub Page搜索工具
GitHub Page Search地址GitHub Page是什么当你想搭建一个自己的网站,但却没有服务器,没有数据库等,这时候不用一筹莫展,GitHub Page可以助你一臂之力。GitHub Page是GitHub提供给用户为自己的项目搭建网站的免费站点,只能是静态站点,当然也不错啦!(免费就是香)。 官方网站GitHub Page博客在官方介绍中,GiHub Page还可以用来写博客,直接从GitHub存储库托管,只需编辑、推送,您的修改就会生效。例如我的GitHub Page博客。相比原创 2021-01-14 12:31:31 · 242 阅读 · 0 评论 -
MySql存储emoji表情报错的处理方法
mysql存储emoji表情报错的处理方法:更改编码为utf8mb4uft-8编码可能2个字节、3个字节、4个字节,而MySql的uft-8只支持3字节的数据,而移动端的表情数据是4字节的字符。如果直接采用utf-8编码的数据库中插入表情数据,Java程序将报错:java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1at com.mysql.jdbc.SQLError.cr原创 2021-01-06 09:49:33 · 346 阅读 · 0 评论 -
剑指offer.41 数据流中的中位数
这道题涉及到对堆这个数据结构的使用,落实到代码上实际使用的是优先队列(优先队列底层可以通过堆来实现)。题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整原创 2020-12-19 16:30:00 · 86 阅读 · 2 评论 -
后端架构的演进
当前微服务架构大行其道,很多java工程师也对微服务架构的学习和使用趋之若鹜。但是对于技术人来说,比了解技术更重要的是了解技术产生的背景及核心原理。现在看起来非常复杂和庞大的架构,一定都是随着业务产品种用户量和数据量增长而不断演进的。架构的发展可能都会经历单体架构、垂直和集群、SOA(面向服务架构)、微服务架构等。单体架构单体架构的整个系统非常简单,通常来说,如果一个war包或者jar包里面包含一个应用的所有功能,则我们称这种架构为单体架构。很多传统互联网公司或者创业型公司早期基本都会采用这样的架构原创 2020-12-15 19:59:00 · 173 阅读 · 0 评论 -
Comparator为何是函数式接口?
Functional InterfaceJava SE 8中重磅推出了lambda表达式,为了实现lambda进而又新增了函数式接口:对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式,这种接口称为函数式接口(functional interface)Java的函数式接口与函数式编程有着重要的联系。函数式编程最大的特点就是函数(function)作为一等公民。所谓一等公民,说明了它在编程语言中的重要性。我们的传统语言中大部分是将值作为一等公民,而函数方法大多以API的方式原创 2020-12-02 10:40:57 · 1240 阅读 · 1 评论 -
一种通用的二分法写法
二分法思路很简单,细节是魔鬼。二分法的细节问题有时候真的是让人脑壳痛,什么时候 right = len 而什么时候 right = len - 1,什么时候 mid + 1 什么时候 mid - 1,while 里面到底是 < 还是 <=,哎呀啊,想想就头痛噢。使用二分法主要是想在有序序列中找到:一个确定的数寻找左侧边界寻找右侧边界对于寻找左右边界的做法,主要是因为给定要找的数可能是多个,例如[1, 3, 3, 5, 7, 8],当目标是找到 3 这个数的下标时,就可以对其进行左原创 2020-11-10 19:55:15 · 163 阅读 · 0 评论 -
Java多线程的创建
做实验的过程中需要用到多线程,许久不用有点儿生疏了,现在查资料做个多线程创建的方法记录。Java使用线程大致有以下四种方法:继承Thread类,重写run方法。(Thread类本身也实现了Runnable接口)实现Runnable接口,重写run方法。实现Callable接口,重写call方法(有返回值)使用线程池(有返回值)1.继承Thread类,重写run方法每次创建一个新的线程,都需要新建一个Thread子类的对象。一个线程调用两次start()方法将会抛出线程状态异常。继承Th原创 2020-10-27 15:06:11 · 126 阅读 · 0 评论