<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/kj7762</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; kj7762]]></copyright><item><title><![CDATA[Java代码混淆工具：JavaObfuscator介绍]]></title><link>https://blog.csdn.net/kj7762/article/details/124597070</link><guid>https://blog.csdn.net/kj7762/article/details/124597070</guid><author>kj7762</author><pubDate>Thu, 05 May 2022 20:37:48 +0800</pubDate><description><![CDATA[在Java开发工具中，有一种是Java混淆器，Java Obfuscator是其中之一，此工具会打乱 Java 源代码，使其非常难以理解或逆向工程(示例)。这为必须交付给客户的源代码知识产权提供了重要的保护，并防止对 Java 类文件对象代码进行过于简单的反汇编。您只需要公开您的类提供给客户的公共 API;您所有的内部 API 和类名都变得高深莫测。它是 SD 的Source Code Obfuscators 家族的一员。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kHV]]></description><category></category></item><item><title><![CDATA[【Java进阶营】从基础到进阶，一文详解RocketMQ事务消息，看完不会跪键盘]]></title><link>https://blog.csdn.net/kj7762/article/details/124576216</link><guid>https://blog.csdn.net/kj7762/article/details/124576216</guid><author>kj7762</author><pubDate>Wed, 04 May 2022 19:50:49 +0800</pubDate><description><![CDATA[事务消息是RocketMQ提供的非常重要的一个特性，在4.x版本之后开源，可以利用事务消息轻松地实现分布式事务。本文对RocketMQ的事务消息进行详细介绍，并给出了代码示例。
一. 相关概念
RocketMQ在其消息定义的基础上，对事务消息扩展了两个相关的概念：


Half(Prepare) Message——半消息(预处理消息)：半消息是一种特殊的消息类型，该状态的消息暂时不能被Consumer消费。当一条事务消息被成功投递到Broker上，但是Broker并没有接收到Producer发出的二次确认.]]></description><category></category></item><item><title><![CDATA[【Java进阶营】码农必备干活：Java编码——高效代码汇总小技巧]]></title><link>https://blog.csdn.net/kj7762/article/details/124576206</link><guid>https://blog.csdn.net/kj7762/article/details/124576206</guid><author>kj7762</author><pubDate>Wed, 04 May 2022 19:49:22 +0800</pubDate><description><![CDATA[一. 常量&amp;变量
1.1 当成员变量值无需改变时，尽量定义为静态常量
在类的每个对象实例中，每个成员变量都有一份副本，而成员静态常量只有一份实例。
反例
public class HttpConnection {
    private final long timeout = 5L;
    ...
}


正例
public class HttpConnection {
    private static final long TIMEOUT = 5L;
    ...
}


1.2 尽量.]]></description><category></category></item><item><title><![CDATA[【Java进阶营】Java面试之消息队列]]></title><link>https://blog.csdn.net/kj7762/article/details/124544994</link><guid>https://blog.csdn.net/kj7762/article/details/124544994</guid><author>kj7762</author><pubDate>Mon, 02 May 2022 19:07:25 +0800</pubDate><description><![CDATA[1.应用场景
解耦
异步
流量消峰
日志记录
2.重复消息的解决方案
消费端处理消息的业务逻辑保持幂等性
保证每条消息都有唯一编号且保证消息处理成功与去重表的日志同时出现
3.有序性
Producer对于需要顺序的消息发送到同一个queue中
Consumer使用MessageListenerOrderly来对消息进行有序消费
4. 如何实现分布式事务
发送方向 MQ 服务端发送消息。
MQ Server 将消息持久化成功之后，向发送方 ACK 确认消息已经发送成功，此时消息为半消息。
发送方开始执行本地事]]></description><category></category></item><item><title><![CDATA[【Java进阶营】聊聊Java里常用的并发集合]]></title><link>https://blog.csdn.net/kj7762/article/details/124544987</link><guid>https://blog.csdn.net/kj7762/article/details/124544987</guid><author>kj7762</author><pubDate>Mon, 02 May 2022 19:06:37 +0800</pubDate><description><![CDATA[前言
在我们的程序开发过程中，如果涉及到多线程环境，那么对于集合框架的使用就必须更加谨慎了，因为大部分的集合类在不施加额外控制的情况下直接在并发环境中直接使用可能会出现数据不一致的问题，所以为了解决这个潜在的问题，我们要么在自己的业务逻辑中加上一些额外的控制，例如锁，或者我们直接使用Java提供的可在并发环境中使用的集合类,这是一个简便而且高效的方法。那么我们下面就来了解下Java提供了哪些“神器”可以让我们安全的使用集合。
正文
非阻塞式安全列表 - ConcurrentLinkedDeque
Concu]]></description><category></category></item><item><title><![CDATA[【Java进阶营】Java中用递归和迭代实现二叉树的中序（ InOrder )遍历]]></title><link>https://blog.csdn.net/kj7762/article/details/124535507</link><guid>https://blog.csdn.net/kj7762/article/details/124535507</guid><author>kj7762</author><pubDate>Mon, 02 May 2022 00:25:42 +0800</pubDate><description><![CDATA[与数组和链表不同，二叉树有几种遍历方式。遍历算法大致分为深度优先和广度优先遍历算法，这取决于算法实际如何工作。顾名思义，深度优先在访问同级别兄弟之前先向二叉树纵深访问，而广度优先是先访问同一级别中的所有节点然后再进入下一级别，因此它也被称为级别顺序遍历。 PreOrder和InOrder树遍历算法都是深度优先的，预序和中序算法之间的唯一区别是访问二叉树的根，左节点和右节点的顺序。
InOrder遍历算法首先访问左节点，然后是root节点，最后是右节点。这与首先​​访问根的预序遍历不同。InOrder遍历的一]]></description><category></category></item><item><title><![CDATA[【Java进阶营】Java架构体系学习路线图，第六点尤为重要]]></title><link>https://blog.csdn.net/kj7762/article/details/124535500</link><guid>https://blog.csdn.net/kj7762/article/details/124535500</guid><author>kj7762</author><pubDate>Mon, 02 May 2022 00:24:50 +0800</pubDate><description><![CDATA[我们都知道android依赖于Java，五六年后进入瓶颈期，很多人都学习了后台业务关的知识。当然我业余也在学习后端。如果你还在迷茫，不仿去学习一下Java后台。
Web应用，最常见的研发语言是Java和PHP。
后端服务，最常见的研发语言是Java和C/C++。
大数据，最常见的研发语言是Java和Python。
可以说，Java是现阶段中国互联网公司中，覆盖度最广的研发语言，掌握了Java技术体系，不管在成熟的大公司，快速发展的公司，还是创业阶段的公司，都能有立足之地。
有不少朋友问，除了掌握Java语法]]></description><category></category></item><item><title><![CDATA[【Java进阶营】Jackson自定义序列化注解（2）-Map扁平化到Bean中（&格式转换）]]></title><link>https://blog.csdn.net/kj7762/article/details/124531347</link><guid>https://blog.csdn.net/kj7762/article/details/124531347</guid><author>kj7762</author><pubDate>Sun, 01 May 2022 19:40:18 +0800</pubDate><description><![CDATA[上一篇：[Jackson自定义序列化注解（1）- Map的key驼峰蛇形的转换]中，实现了对Map的key的参数转换，但是总是存在一些骚操作：

如上图所示，这样对象Y就可以动态的选择序列化的字段。
本文主要实现Map对象(A，B)如何扁平化到Bean中？且扁平化的过程中，需要完成驼峰-&gt;蛇形的转换。
注：借鉴@JsonProperty的实现思路。
实现代码
引入依赖：
&lt;dependency&gt;
  &lt;groupId&gt;com.google.guava&lt;/groupId&g]]></description><category></category></item><item><title><![CDATA[【Java进阶营】Jackson自定义序列化注解（1）-Map的key驼峰蛇形的转换]]></title><link>https://blog.csdn.net/kj7762/article/details/124531336</link><guid>https://blog.csdn.net/kj7762/article/details/124531336</guid><author>kj7762</author><pubDate>Sun, 01 May 2022 19:39:25 +0800</pubDate><description><![CDATA[需求：完成响应对象驼峰-&gt;蛇形的转换，包括响应对应中Map类型的key也需要转换。
准备工作

com.google.guava
guava
31.0.1-jre

@Data
public class User {
private String nameInfo;

private String ageInfo;

private Account account;

@JsonSerialize(using = MapNamingStrategySerialize.class)
private Ma]]></description><category></category></item><item><title><![CDATA[【Java进阶营】JAVA基础篇—优雅的校验：Preconditions方式实现]]></title><link>https://blog.csdn.net/kj7762/article/details/124531327</link><guid>https://blog.csdn.net/kj7762/article/details/124531327</guid><author>kj7762</author><pubDate>Sun, 01 May 2022 19:38:31 +0800</pubDate><description><![CDATA[使用Preconditions类型的API时，思维要转变，不是某个字段没通过校验的逻辑。而是这个字段所期望的逻辑。

引入依赖：
&lt;dependency&gt;
    &lt;groupId&gt;com.google.guava&lt;/groupId&gt;
    &lt;artifactId&gt;guava&lt;/artifactId&gt;
    &lt;version&gt;31.0.1-jre&lt;/version&gt;
&lt;/dependency&gt;


使用：
.]]></description><category></category></item><item><title><![CDATA[【Java进阶营】Redis中String和Hash哪个结构更加省内存]]></title><link>https://blog.csdn.net/kj7762/article/details/124531304</link><guid>https://blog.csdn.net/kj7762/article/details/124531304</guid><author>kj7762</author><pubDate>Sun, 01 May 2022 19:37:09 +0800</pubDate><description><![CDATA[简略答案：在Redis的hash结构使用ziplist编码且存储相同信息时，hash结构比sring结构更加节省内存。

1. 分析：谁更加节省内存
string结构：
可以简单任务Redis的String结构是用SDS（简单动态字符串）数据结构来实现的。


len：buf中已占用空间的长度；
free：buf中剩余可用空间的长度；
buf[]：数据空间

hash结构使用ziplist结构时：


zlbytes：32bit，表示ziplist占用的字节总数。
zltail：32bit，表示zipli.]]></description><category></category></item><item><title><![CDATA[【Java进阶营】只需花三分钟让你彻底理解cookie、session、token]]></title><link>https://blog.csdn.net/kj7762/article/details/124514394</link><guid>https://blog.csdn.net/kj7762/article/details/124514394</guid><author>kj7762</author><pubDate>Sat, 30 Apr 2022 16:12:18 +0800</pubDate><description><![CDATA[发展史
1、很久很久以前，Web 基本上就是文档的浏览而已， 既然是浏览，作为服务器， 不需要记录谁在某一段时间里都浏览了什么文档，每次请求都是一个新的HTTP协议， 就是请求加响应， 尤其是我不用记住是谁刚刚发了HTTP请求， 每个请求对我来说都是全新的。这段时间很嗨皮。
2、但是随着交互式Web应用的兴起，像在线购物网站，需要登录的网站等等，马上就面临一个问题，那就是要管理会话，必须记住哪些人登录系统， 哪些人往自己的购物车中放商品。
也就是说我必须把每个人区分开，这就是一个不小的挑战，因为HTTP请求]]></description><category></category></item><item><title><![CDATA[【Java进阶营】Git如何优雅的进行版本回退？]]></title><link>https://blog.csdn.net/kj7762/article/details/124514365</link><guid>https://blog.csdn.net/kj7762/article/details/124514365</guid><author>kj7762</author><pubDate>Sat, 30 Apr 2022 16:11:04 +0800</pubDate><description><![CDATA[介绍
在版本迭代开发过程中，相信很多人都会有过错误提交的时候（至少良许有过几次这样的体验）。这种情况下，菜鸟程序员可能就会虎驱一震，紧张得不知所措。而资深程序员就会微微一笑，摸一摸锃亮的脑门，然后默默的进行版本回退。
对于版本的回退，我们经常会用到两个命令：
git reset
git revert
那这两个命令有何区别呢？先不急，我们后文详细介绍。
git reset
假如我们的系统现在有如下几个提交：

其中：A 和 B 是正常提交，而 C 和 D 是错误提交。现在，我们想把 C 和 D 回退掉。而此时]]></description><category></category></item><item><title><![CDATA[【Java进阶营】阿里大神教你如何用java实现排序算法，比较时间复杂度]]></title><link>https://blog.csdn.net/kj7762/article/details/124514346</link><guid>https://blog.csdn.net/kj7762/article/details/124514346</guid><author>kj7762</author><pubDate>Sat, 30 Apr 2022 16:10:07 +0800</pubDate><description><![CDATA[插入排序、冒泡排序、选择排序、快速排序、归并排序
以下所有排序都是实现升序
1.插入排序
【定义】
第一个元素自成一个有序数组A，从第二个元素开始，把每一个元素插入到有序数组A中合适的位置，满足有序的条件。直到最后元素，至此构建成一个有序数组。
【时间复杂度】
O(n2)
【代码】
public void method(int [] array) {
    int length = array.length;

    int i,j;

    for (i = 1; i &lt; length; i+]]></description><category></category></item><item><title><![CDATA[【Java进阶营】对比各类分布式锁缺陷，抓住Redis分布式锁实现命门]]></title><link>https://blog.csdn.net/kj7762/article/details/124504824</link><guid>https://blog.csdn.net/kj7762/article/details/124504824</guid><author>kj7762</author><pubDate>Fri, 29 Apr 2022 21:31:51 +0800</pubDate><description><![CDATA[近两年来微服务变得越来越热门，越来越多的应用部署在分布式环境中，在分布式环境中，数据一致性是一直以来需要关注并且去解决的问题，分布式锁也就成为了一种广泛使用的技术。
常用的分布式实现方式为Redis，Zookeeper，其中基于Redis的分布式锁的使用更加广泛。
但是在工作和网络上看到过各个版本的Redis分布式锁实现，每种实现都有一些不严谨的地方，甚至有可能是错误的实现，包括在代码中，如果不能正确的使用分布式锁，可能造成严重的生产环境故障。
本文主要对目前遇到的各种分布式锁以及其缺陷做了一个整理，并对如]]></description><category></category></item><item><title><![CDATA[【Java进阶营】ZooKeeper应用-解决分布式系统单点故障]]></title><link>https://blog.csdn.net/kj7762/article/details/124504786</link><guid>https://blog.csdn.net/kj7762/article/details/124504786</guid><author>kj7762</author><pubDate>Fri, 29 Apr 2022 21:30:00 +0800</pubDate><description><![CDATA[今天小编给大家分享一下：ZooKeeper应用–解决分布式系统单点故障
1.单点故障问题
什么是分布式系统中的单点故障：通常分布式系统采用主从模式，就是一个主控机连接多个处理节点。主节点负责分发任务，从节点负责处理任务，当我们的主节点发生故障时，那么整个系统就都瘫痪了，那么我们把这种故障叫作单点故障。如下图


传统方式是采用一个备用节点，这个备用节点定期给当前主节点发送ping包，主节点收到ping包以后向备用节点发送回复Ack，当备用节点收到回复的时候就会认为当前主节点还活着，让他继续提供服务。如下图所]]></description><category></category></item><item><title><![CDATA[【Java进阶营】java开发涉及到的各种框架比较，技术选型]]></title><link>https://blog.csdn.net/kj7762/article/details/124460942</link><guid>https://blog.csdn.net/kj7762/article/details/124460942</guid><author>kj7762</author><pubDate>Wed, 27 Apr 2022 21:15:32 +0800</pubDate><description><![CDATA[SOA服务框架
Dubbo：
一个分布式服务框架，以及SOA治理方案．
SOA框架有：淘宝的HSF、阿里的dubbo、amazon coral、twitter Finagle，Xfire(ws服务)+OSGI+Spring，支付宝SOA架构，WebService也是古老的SOA。
其功能主要包括：高性能NIO通讯及多协议集成，服务动态寻址与路由，软负载均衡与容错，依赖分析与降级等。是远程服务调用中间件。
不过已经不再更新了，不推荐．
axis2：
是新一代的SOAP引擎，Web Services 框架．推荐]]></description><category></category></item><item><title><![CDATA[【Java进阶营】Java 包含泛型方法签名的方法调用,如: Map buildHashMap()]]></title><link>https://blog.csdn.net/kj7762/article/details/124460924</link><guid>https://blog.csdn.net/kj7762/article/details/124460924</guid><author>kj7762</author><pubDate>Wed, 27 Apr 2022 21:14:57 +0800</pubDate><description><![CDATA[今天在用Guava做cache的时候,发现guava中,有些方法会带有泛型的方法签名:
public CacheBuilder&lt;K, V&gt; expireAfterAccess(long duration, TimeUnit unit) {
checkState(

    expireAfterAccessNanos == UNSET_INT,

    "expireAfterAccess was already set to %s ns",

    expireAfterAccessNan]]></description><category></category></item><item><title><![CDATA[【Java进阶营】深入理解JMM-CPU多核硬件架构剖析及Java内存模型]]></title><link>https://blog.csdn.net/kj7762/article/details/124434033</link><guid>https://blog.csdn.net/kj7762/article/details/124434033</guid><author>kj7762</author><pubDate>Tue, 26 Apr 2022 18:21:18 +0800</pubDate><description><![CDATA[本节带着大家了解CPU多核硬件架构以及Java内存模型
CPU多核硬件架构剖析
CPU每次从主内存读取数据比较慢，CPU通常涉及多级缓存。CPU读主内存的数据， 按照空间局部性原则加载局部快照到缓存中


L1 L2 属于每个CPU中都是独立的缓存，缓存主内存共享变量的数据作为副本，L3属于多个cpu之间共享的缓存。 每个cpu之间都有独立二级缓存主内存的数据作为副本，而副本与副本之间是完全不可见的
总线仲裁机制

每次处理器和内存之间的数据传递都是通过一系列步骤来完成的，这一系列步骤称之为总线事务（Bus]]></description><category></category></item><item><title><![CDATA[【Java进阶营】Mybatis二级缓存的介绍及使用，使用redis实现二级缓存]]></title><link>https://blog.csdn.net/kj7762/article/details/124433984</link><guid>https://blog.csdn.net/kj7762/article/details/124433984</guid><author>kj7762</author><pubDate>Tue, 26 Apr 2022 18:19:08 +0800</pubDate><description><![CDATA[一、二级缓存
二级缓存是全局作用域缓存，默认是不开启的，需要手动进行配置。
Mybatis提供二级缓存的接口以及实现，缓存实现的时候要求实体类实现Serializable接口，二级缓存在sqlSession关闭或提交之后才会生效。
1-1、特性：

默认已经开启，但是未实现
作用域：基于全局范围应用级别
缓存默认同样使用一级缓存的PerpetualCache类，不同的是在这个基础之上又套了一层Map（org.apache.ibatis.session.Configuration#caches ）,其key为]]></description><category></category></item></channel></rss>