Java
文章平均质量分 77
吉诺比利20
每天进步一点点
展开
-
jdk9为何要将String的底层实现由char[]改成了byte[]
先说结论:出于节省String占用jvm的内存空间。优化String节省jvm内存空间的必要性(1)调查统计发现一个java系统,堆里面存活最多的对象之一就是String对象,所以优化String的占用空间是很有意义的,因为String是实际开发中使用最频繁的类。否则,你去优化一个平时根本不怎么用到的类,那么就很鸡肋了。上图是基于java8运行的spring boot系统对象数量的快照,我们可以看到String对象有82039个,占用了1968936字节的内存,占用内存排在第5位。这里注意的是ja转载 2021-06-18 11:25:26 · 1806 阅读 · 0 评论 -
IO包中InputStream等源码解析
Java源码解析——Java IO包一、基础知识:1.Java IO一般包含两个部分:1)java.io包中阻塞型IO;2)java.nio包中的非阻塞型IO,通常称为New IO。这里只考虑到java.io包中堵塞型IO;2.Java.io包简单地分类。Java的IO主要包含三个部分:1)流式部分――IO的主体部分;2)非流式部分――主要包含一些辅助流式部分的类,如:File类、RandomAccessFile类和FileDescriptor等类;3)文件读取部分的与安全相关的类,如:S转载 2021-04-22 21:51:27 · 484 阅读 · 0 评论 -
mybatis的resultMap中字段重名处理
问题在写mybatis的关联查询时,resultMap中如果两个对象有相同的属性。查询出来的结果内层的对象的属性会被外层对象属性覆盖,导致内层list数据出错。resultMap结构如下:<resultMap id="DetailResultMap" type="com.tchirk.itsm.ca.domain.System"> <result column="object_version_number" jdbcType="BIGINT" property="ob原创 2021-04-07 21:48:01 · 3863 阅读 · 1 评论 -
RESTful风格API详解
在学习RESTful 风格接口之前,即使你不知道它是什么,但你肯定会好奇它能解决什么问题?有什么应用场景?听完下面描述我想你就会明白:在互联网并没有完全流行的初期,移动端也没有那么盛行,页面请求和并发量也不高,那时候人们对接口的要求没那么高,一些动态页面(jsp)就能满足绝大多数的使用需求。但是随着互联网和移动设备的发展,人们对Web应用的使用需求也增加,传统的动态页面由于低效率而渐渐被HTML+JavaScript(Ajax)的前后端分离所取代,并且安卓、IOS、小程序等形式客户端层出不穷,客户端的转载 2021-01-27 20:00:47 · 4279 阅读 · 1 评论 -
引用拷贝、浅拷贝、深拷贝、序列化的解析
在对象的拷贝中,很多初学者可能搞不清到底是拷贝了引用还是拷贝了对象。在拷贝中这里就分为引用拷贝、浅拷贝、深拷贝进行讲述。引用拷贝引用拷贝会生成一个新的对象引用地址,但是两个最终指向依然是同一个对象。如何更好的理解引用拷贝呢?很简单,就拿我们人来说,通常有个姓名,但是不同场合、人物对我们的叫法可能不同,但我们很清楚哪些名称都是属于"我"的!当然,通过一个代码示例让大家领略一下(为了简便就不写get、set等方法):class Son { String name; int age;转载 2020-12-19 20:12:39 · 207 阅读 · 0 评论 -
SpringCloud的配置中心从数据库中获取config配置
在微服务中,配置文件Config服务端:配置中心的config文件: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency>原创 2020-10-21 20:14:36 · 2640 阅读 · 0 评论 -
使用objectMapper处理数据之间的转化详解
在项目中使用到了ObjectMapper,故研究了一下。现将自己的几个测试用例和大家分享一下~首先在pom.xml文件中,加入依赖: <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.转载 2020-10-20 20:07:04 · 2376 阅读 · 0 评论 -
百度云和阿里云实现文件上传下载和删除功能
创建百度云对象存储实例1. 进入百度云官网找到对象存储BOS2.创建Bucket3.客户端认证信息accessKeyId和accessKeySecret数据配置BOS和OSS的配置文件:accessKeyId和accessKeySecret为上图中认证信息中的数据。endpoint为bucket中的官方域名。test: file: bos: accessKeyId: idTest accessKeySecret: secretTest e原创 2020-10-13 22:34:30 · 1451 阅读 · 0 评论 -
Fegin调用时出现JSON parse error:can not deserialize instance of ...
一、问题接口调用时提示json解析报错,如图二、解决通过排查发现Fegin调用时出现问题,Fegin调用的代码时这样写的:employeeFeignClient.addRole(iamOrganizationId,employeeId,roleIds);Fegin类是这样写的:@PutMapping("/v1/{iam_organization_id}/organizations/employee/{employee_id}/role")ResponseEntity<Integer&原创 2020-09-24 17:40:16 · 5290 阅读 · 1 评论 -
SpringCloud注册中心Eureka详解(核心概念、工作流程、自我保护机制)
Eureka 工作原理上节内容为大家介绍了,注册中心 Eureka 产品的使用,以及如何利用 Eureka 搭建单台和集群的注册中心。这节课我们来继续学习 Eureka,了解它的相关概念、工作流程机制等。Eureka 作为 Spring Cl...转载 2020-08-05 22:14:29 · 1278 阅读 · 0 评论 -
操作集合的常用工具类Collections和Arrays的常见方法
Collections 工具类和 Arrays 工具类常见方法Collections排序操作查找,替换操作同步控制Arrays类的常见操作排序 : sort()查找 : binarySearch()比较: equals()填充 : fill()转列表 asList()转字符串 toString()复制 copyOf()Collections 工具类和 Arrays 工具类常见方法CollectionsCollections 工具类常用方法:排序查..原创 2020-07-15 22:07:29 · 291 阅读 · 0 评论 -
@Transactional注解失效场景
引言@Transactional注解哪些场景下会失效,一时语塞致使面试失败。所以今天简单的和大家分享一下@Transactional相关的知识。@Transactional 注解相信大家并不陌生,平时开发中很常用的一个注解,它能保证方法内多个数据库操作要么同时成功、要么同时失败。使用@Transactional注解时需要注意许多的细节,不然你会发现@Transactional总是莫名其妙的就失效了。一、事务事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制,主要分为编程式事务转载 2020-07-13 19:07:29 · 363 阅读 · 0 评论 -
SSO单点登录详解-------九、自定义CAS Server端登录页面
一、前言在第七章节,我们搭建了SSO Server.在浏览器中输入http:www.sso.com:8443/cas/login之后,跳转到了统一认证中心的登陆界面.如下图所示:但是这个页面的logo和布局都是默认apereo的.我们希望把logo换成公司的logo,已经可以自己去定义布局.比如完成如下图:自定义登陆界面我们需要修改的地方包括这几点:修改浏览器标签页图标icon修改浏览器标签标题文本修改logo信息,点击logo跳转到指定页面修改登陆页面的布局修改底部的版权信息转载 2020-07-12 23:11:51 · 1315 阅读 · 0 评论 -
SSO单点登录详解-------八、搭建CAS Client服务端
一、前言目前为止我们已经搭建好了CAS Server端,我们需要来搭建客户端配合使用,完成单点登录和单点注销的功能.我们将讲两种方式来搭建CAS Client端.一种是普通项目搭建,另一种是基于SpringBoot的项目搭建.二、普通项目搭建CAS Client官方提供了一个简易的模板来搭建CAS Client.Github地址:https://github.com/cas-projects/cas-sample-java-webapp下载导入项目之后,我们只需要稍作修改,运行起来就可以使用了.转载 2020-07-12 23:11:36 · 1135 阅读 · 1 评论 -
SSO单点登录详解-------七、搭建CAS Server服务端
一、前言什么是maven的overlay?overlay可以把多个项目war合并成为一个项目,并且如果项目存在同名文件,那么主项目中的文件将覆盖掉其他项目的同名文件。apereo提供了一个基于层结构的框架,可以帮助开发者快速引入cas server的代码,然后实现自由配置或代码覆盖,打包方式也非常简单。Github地址:https://github.com/apereo/cas-overlay-template二、快速构建1.环境要求:JDB1.8+2.下载或者克隆cas-overlay-te转载 2020-07-12 23:11:09 · 1354 阅读 · 0 评论 -
SSO单点登录详解-------六、CAS简介和配置https
一、什么是什么是CASCAS(Central Authentication Service) 是 Yale (耶鲁)大学发起的开源的企业级单点登录系统。它的特点:Java (Spring Webflow/Spring Boot) 服务组件可插拔身份验证支持(LDAP,Database,X.509,MFA)支持多种协议(CAS,SAML,OAuth,OpenID,OIDC)跨平台客户端支持(Java,.Net,PHP,Perl,Apache等)与uPortal,Liferay,BlueSocke转载 2020-07-12 23:10:46 · 1162 阅读 · 0 评论 -
SSO单点登录详解-------四、手写单点登录客户端和服务端
一、前言我们自己动手写单点登录的服务端目的是为了加深对单点登录的理解.如果你们公司想实现单点登录/单点注销功能,推荐使用开源的单点登录框架CAS.我们后面的章节也会带同学们快速搭建CAS Server和CAS Client的环境.二、条件如果没看前面章节的同学,请返回去观看这几章内容,不然这代码是不太好理解的.SSO单点登录教程(一)多系统的复杂性SSO单点登录教程(二)单点登录流程分析SSO单点登录教程(三)单点注销流程分析三、环境要求JDK1.7+Maven3.3Ecli转载 2020-07-04 20:55:17 · 1477 阅读 · 0 评论 -
SSO单点登录详解------三、单点注销流程解析
一、前言单点登录自然也要单点注销,在一个子系统中注销,所有子系统的会话都将被销毁,用下面的图来说明:单点注销流程步骤分析:1. 用户在CRM系统中点击注销按钮.会重定向到统一认证中心的注销方法2. 统一认证中心接受到注销请求之后,会销毁全局的会话.3. 统一认证中心会拿到之前在该系统中注册的子系统集合.4. 依次的调用子系统的登出方法,销毁局部会话.5. 每个系统中的会话都已经销毁之后,跳转到登陆页面.二、系统中的Cookie和Session存储图解以下图解是基于单点登录图转载 2020-07-04 20:53:54 · 1713 阅读 · 0 评论 -
SSO单点登录详解-------二、单点登录流程解析
一、简介单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。二、应用场景如公司有多个系统,分别OA系统、CRM系统、财务管理系统、设备管理系统等,总不能访问每个系统都要登录一遍吧,用户会疯掉的,应该我们认证一遍,其他系统即可访问。网上很多项目都在使用SSO单点登录,比如天猫,淘宝,CSDN,博客园.三、流程分析相比于单系统登录,sso需要一个独立的认证中心,只有认证转载 2020-06-25 22:50:46 · 2851 阅读 · 0 评论 -
SSO单点登录详解-------一、多系统登录时存在的问题
一、学习大纲1.回顾会话机制和登录机制. 因为学习单点登录需要对Cookie和Session有较深的理解,所以我们会先回顾知识.2.多系统的复杂性带来的问题,我们如何解决这些问题?通过这个问题引出单点登录的需求.3.自己动手写单点登录的服务端和客户端,通过这个案例加深对单点登录的理解.4.学习使用开源的单点登录框架CAS,我们使用cas-overlay-template模板来搭建CAS 服务端5.搭建CAS的客户端.我们需要学习普通项目集成CAS客户端以及SpringBoot项目集成CAS客户端.转载 2020-06-24 00:01:03 · 3335 阅读 · 0 评论 -
好用的录屏软件分享
之前用Captura时使用蓝牙耳机声音会有问题,所以重新找了一个录屏软件,BandiCAM破解版链接。直接贴B站视频链接吧:https://www.bilibili.com/video/av92431591/原创 2020-07-15 22:09:42 · 298 阅读 · 0 评论 -
nginx反向代理结合keepalived实现高可用
一、概念正向代理正向代理最大的特点是客户端非常明确要访问的服务器地址。服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。总结 始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的原创 2020-06-11 22:47:12 · 1145 阅读 · 0 评论 -
minio实现文件上传下载和删除功能
前言之前用到文件上传功能,在这里做个学习记录。使用minio实现,后面会记录使用fastdfs和阿里云的oss实现文件上传以及他们的比较(oss根据流量收费)。minio的中文文档:https://docs.min.io/cn/minio安装首先查询docker镜像:docker search minio选着stars最高的那个拉取:docker pull minio/minio启动minio服务器,并设置端口号,容器名,账号和密码:docker run -p 9000:90原创 2020-06-10 21:15:01 · 27812 阅读 · 14 评论 -
MockMvc单元测试使用总结
Junit单元测试之MockMvc在测试restful风格的接口时,springmvc为我们提供了MockMVC架构,使用起来也很方便。下面写个笔记,便于以后使用时参考备用。一 场景提供一个restful风格的接口import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import qinfeng.zheng转载 2020-06-08 19:13:39 · 1126 阅读 · 0 评论 -
使用 DecimalFormat 和 NumberFormat 处理数字的格式化显示问题(千分位、百分号等)
前言原来没有接触过DecimalFormat,没有想到还有这玩意。使用的时候还是不错的,详细的了解可以看官方的api。找到了中文的api,小伙子们可以直接跳转啊!DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。DecimalFormat 包含一个模式 和一组符号。差点忘记说它是干嘛的。符号含义:上一个经典的表格,我们来说一说响应的符号的意义:符号位置本地化?含义0数字是阿拉伯数字#数字是阿拉伯数字如果不存在就原创 2020-06-04 21:31:07 · 8181 阅读 · 0 评论 -
生产环境又有问题?都是脏数据惹的祸!
本文笔者对脏数据的来源、脏数据的危害、脏数据的预防、如何对已出现的脏数据进行处理等问题进行详细阐述。“小光,今天那个诡异的生产环境问题找到原因了吗?”“还是数据问题!之前做的一个功能有一部分数据迁移工作没有做好,导致生产环境有脏数据,委托人的联系人已经不为该委托人服务了,应该移除掉的……”“又是脏数据……”“嗯,好在不是代码问题。”这是在蓝鲸项目发生的真实对话。其中提到的脏数据(Dirty data),也叫坏数据(Bad data),通常是指跟期...转载 2020-06-01 20:05:30 · 972 阅读 · 0 评论 -
Java对象的内存结构分布简介
概念在JVM虚拟机种Java对象的内存结构如图所示分为三大块:对象头(Header)、对象种的实际数据(Instance Data)、对齐填充(Padding)。对象头(Header)Mark Word:用于存储对象自身的运行时数据,如哈希码(HashCode)、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程 ID等。Mark Word 被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据自己的状态复用自己的存储空间。Class Pointer:对象指向它的类数据的指针,原创 2020-05-26 21:52:28 · 833 阅读 · 0 评论 -
ReentrantLock中lock(),tryLock(),lockInterruptibly()的区别
lock()两个线程都使用lock获取锁,如果线程A获取到了锁,线程B只能等待,对线程B调用interrupt()方法不能中断线程B的等待过程。tryLock()使用lock获取锁,如果线程A获取到了锁,线程A返回true,线程B直接返回false。可以传入时间参数,表示拿不到锁等待一段时间,这段时间内还是拿不到就返回false。lockInterruptibly()两个线程都使用lockInterruptibly获取锁,如果线程A获取到了锁,线程B只能等待,对线程B调用interrupt()方法原创 2020-05-25 19:38:45 · 4522 阅读 · 1 评论 -
Token登录认证详解
参考文章:Token 认证的来龙去脉前后端分离使用 Token 登录解决方案理解Cookie和Session机制基于 Cookie/Session 的认证方案CookieCookie的工作原理由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是。cookie指的就是在浏览器里面存储的一种数据,仅仅是浏览器实现的一种数据存储功能。cooki转载 2020-05-25 18:44:35 · 24767 阅读 · 13 评论 -
JDK中javac、jar、javap、jps、jstack等工具的使用
JDK的bin目录下那些常见工具使用集锦 在JDK的bin目录下有许多java小工具可以用于编译,运行以及调试Java程序或监控JVM的运行。在习惯于在Window下使用Eclipse等IDE工具开发的程序员来说,可能bin目录下的很多工具都很少使用。但是如果是运行在Linux下的应用程序并且是命令行模式运行的话,很多时候使用JDK提供的一些工具可以给开发人员带来很多便利。本文总结了在实际开发中我们可能接触到或需要掌握的一些小工具的基本用法。对于像java,javac,javadoc这样的工具可能转载 2020-05-20 17:42:33 · 1076 阅读 · 0 评论 -
JDK1.8中Map的getOrDefault、putIfAbsent、computeIfAbsent、merge方法
一、getOrDefaultgetOrDefault获取当前key的value值,如果Map中存在这个key,就获取到key对应的value值,如果不存在key,就返回一个传入的默认值,常用于往集合。源码: default V getOrDefault(Object key, V defaultValue) { V v; //如果key对应得value不为空,或者Map包含了key,则取得value得值,否则得到默认值。 return (((v =原创 2020-05-12 19:18:03 · 1181 阅读 · 0 评论 -
ThreadLocal线程本地变量学习笔记
一、概念线程安全的解决思路:互斥同步: synchronized 和 ReentrantLock非阻塞同步: CAS, AtomicXXXX无同步方案: 本地存储(Thread Local)ThreadLocal为线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。ThreadLocal 变量通常被private static修饰。当一个线程结束时,它所使原创 2020-05-10 20:43:45 · 397 阅读 · 0 评论 -
ConcurrentHashMap集合源码学习笔记
1、概念ConcurrentHashMap继承了AbstractMap,实现了ConcurrentMap,Serializable接口,ConcurrentMap又实现了Map接口。ConcurrentHashMap是基于散列表实现的,存储的是Key/Value对,底层使用数组+链表+红黑树+CAS算法实现的,数组是存储元素并且查找快,链表是为了解决哈希冲突而存在的,红黑树是为了解决链表中查询速度慢而使用的。CAS可以弥补HashMap线程不安全的缺点,使ConcurrentHashMap实现线程安全。原创 2020-05-09 23:47:00 · 298 阅读 · 0 评论 -
Synchronized关键字与ReetrantLock同步锁学习笔记
一、Synchronized的使用在应用Sychronized关键字时需要把握如下注意点:一把锁只能同时被一个线程获取,没有获得锁的线程只能等待;每个实例都对应有自己的一把锁(this),不同实例之间互不影响;例外:锁对象是*.class以及synchronized修饰的是static方法的时候,所有对象公用同一把锁synchronized修饰的方法,无论方法正常执行完毕还是抛出异常,都...原创 2020-05-08 20:38:10 · 1620 阅读 · 1 评论 -
并发锁核心类AQS学习笔记
AbstractQueuedSynchronizer简介AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS的。当然,我们自己也能利用AQS非常轻松容易地构造出符合我们...原创 2020-05-07 21:24:38 · 909 阅读 · 0 评论 -
为什么说Java中只有值传递
关于这个问题,在StackOverflow上也引发过广泛的讨论,看来很多程序员对于这个问题的理解都不尽相同,甚至很多人理解的是错误的。还有的人可能知道Java中的参数传递是值传递,但是说不出来为什么。在开始深入讲解之前,有必要纠正一下大家以前的那些错误看法了。如果你有以下想法,那么你有必要好好阅读本文。错误理解一:值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递。如果是个引用,就是...转载 2020-05-07 18:25:52 · 224 阅读 · 1 评论 -
Entry、keySet、entrySet概念和根据Key和Value对Map的倒序排序
public class MapSortDemo { //将键值对放入list并重写Comparator方法实现对value排序 private static void sortByValue(Map<Integer,Integer> map) { //将键值对放入list中 List<Map.Entry<Integer, I...原创 2020-05-02 20:17:46 · 2444 阅读 · 0 评论 -
ASCALL码对照表
ASCALL码对照表 目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定的ASCII码(American Standard Code for Information Interchange,美国标准信息交换码),它已被国际标准化组织(ISO...转载 2020-04-30 23:58:23 · 15915 阅读 · 0 评论 -
Kafka学习总结、Kafka与RabbitMQ的区别
初始Kafka Kafka是一个分布式的发布-订阅消息系统,能够支撑海量数据的数据传递。在离线和实时的消 息处理业务系统中,Kafka都有广泛的应用。Kafka将消息持久化到磁盘中,并对消息创建了备份保证了 数据的安全。Kafka在保证了较高的处理速度的同时,又能保证数据处理的低延迟和数据的零丢失。特性高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个主题可...原创 2020-04-29 23:42:44 · 20312 阅读 · 5 评论 -
NIO详解以及BIO、NIO的区别
一、JavaIO流Reader:字符格式操作,基于字符的输入操作Writer:字符格式操作,基于字符的输出操作InputStream:字节格式操作,基于字节的输入操作OutputStream:字节格式操作,基于字节的输出操作按照流的功能可以分为输入流和输出流。按照操作单元可以分为字节流和字符流。使用字节流操作字符时容易出现乱码问题。所以字符流适合对字符处理的IO操作。使用字节...原创 2020-04-29 20:06:56 · 388 阅读 · 0 评论