<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Gee_Zer的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Gee_Zer</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Gee_Zer]]></copyright><item><title><![CDATA[基于Java的JSON数组铺平解析工具]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/123212044</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/123212044</guid><author>Gee_Zer</author><pubDate>Tue, 01 Mar 2022 18:04:06 +0800</pubDate><description><![CDATA[效果：
解析前：

解析后

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.]]></description><category></category></item><item><title><![CDATA[优先队列-Java实现]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/116205962</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/116205962</guid><author>Gee_Zer</author><pubDate>Tue, 27 Apr 2021 17:34:20 +0800</pubDate><description><![CDATA[class Hoop {
        int tree[];
        int size;

        public Hoop(int capacity) {
            this.tree = new int[capacity + 1];
            this.size = 1;
        }

        public void add(int val){
            if (size == tree.length + 1) {
   ...]]></description><category></category></item><item><title><![CDATA[Mysql on duplicate key update 解决插入重复数据时更新值的问题以及其存在的问题]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/115898669</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/115898669</guid><author>Gee_Zer</author><pubDate>Tue, 20 Apr 2021 11:35:10 +0800</pubDate><description><![CDATA[当有需求，在插入新记录时，如果不存在就插入一条新记录，而存在时就更新原记录上的某些数据，这是可以使用on duplicate key update 语法。
一、使用：
demo如下：
首先创建表test
drop table if exists test;
create table test(
	id int primary key auto_increment,
    value1 varchar(45) not null default '',
    value2 varchar(45) not n]]></description><category></category></item><item><title><![CDATA[Google Guava Maps的使用]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/115490145</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/115490145</guid><author>Gee_Zer</author><pubDate>Wed, 07 Apr 2021 17:04:56 +0800</pubDate><description><![CDATA[在某些场景下，想要比较两个Map的不同，如果自己手动写的话，实现起来代码烦杂，此时可以使用Guava提供的Maps类的difference方法，实现快速的比较不同，结果保存在不同的map中，主要方法如下：
import com.google.common.collect.MapDifference;
import com.google.common.collect.Maps;

import java.util.HashMap;
import java.util.Map;

public class Gua]]></description><category></category></item><item><title><![CDATA[Mapper Example学习]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/114666201</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/114666201</guid><author>Gee_Zer</author><pubDate>Thu, 11 Mar 2021 14:47:41 +0800</pubDate><description><![CDATA[Mapper Example学习
**起因：**在公司实习时发现，公司所使用的Mybatis逆向工程生成的代码和Mapper.xml文件与自己常用的逆向工程生成器生成的不一样
公司Mybatis逆向工程生产以下产物：




名称
描述
作用




XxxMapper.xml
Mybatis配置文件
配置SQL语句


XxxMapper.class
Mapper接口
对应每个SQL语句


XxxMapping.class
实体类
对应数据库表中的每个字段，一个实体类代表一行数据


XxxMappin]]></description><category></category></item><item><title><![CDATA[Java面经（一）]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/111873038</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/111873038</guid><author>Gee_Zer</author><pubDate>Mon, 28 Dec 2020 19:28:58 +0800</pubDate><description><![CDATA[主要问题如下：
1、二分查找的时间复杂度
2、一个学生成绩表，字段（学生姓名，课程名称，分数），求学生总成绩
3、数据库索引，为什么要用索引，怎么用，是不是越多越好，怎么建立索引
4、Java多线程，为什么会线程不安全，怎么解决线程不安全问题（案例：有一个共享变量，解决读写线程安全，给出java解决方法）
5、static修饰的变量是线程安全的吗？
6、线程安全的集合了解哪些？
7、平常怎么学习，看过什么书？
8、Redis缓存击穿，缓存穿透？
9、对未来有什么规划？

...]]></description><category></category></item><item><title><![CDATA[二叉树的先中后序，非递归实现]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/108951368</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/108951368</guid><author>Gee_Zer</author><pubDate>Wed, 07 Oct 2020 15:38:35 +0800</pubDate><description><![CDATA[先序遍历非递归实现
//先将树的右节点加入，再将树的左节点加入即可，因为出栈顺序是相反的
List&lt;Integer&gt; list = new ArrayList&lt;&gt;();
	Stack&lt;TreeNode&gt; s = new Stack&lt;TreeNode&gt;();

	public List&lt;Integer&gt; preorderTraversal(TreeNode root) {
		if (root == null) {
			return list;
	]]></description><category></category></item><item><title><![CDATA[SpringBoot常用配置备份]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/108811535</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/108811535</guid><author>Gee_Zer</author><pubDate>Sat, 26 Sep 2020 14:31:27 +0800</pubDate><description><![CDATA[Shiro依赖
&lt;!--shiro框架--&gt;
&lt;!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.shiro&lt;/groupId&gt;
    &lt;artifactId&gt;shiro-core&lt;/artifactId&gt;
    &lt;version&gt;1.4.0&l]]></description><category></category></item><item><title><![CDATA[LRU缓存设计O(1)复杂度]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/108726924</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/108726924</guid><author>Gee_Zer</author><pubDate>Tue, 22 Sep 2020 11:24:56 +0800</pubDate><description><![CDATA[题目描述
设计LRU缓存结构，该结构在构造时确定大小，假设大小为K，并有如下两个功能
set(key, value)：将记录(key, value)插入该结构
get(key)：返回key对应的value值
[要求]
set和get方法的时间复杂度为O(1)
某个key的set或get操作一旦发生，认为这个key的记录成了最常使用的。
当缓存的大小超过K时，移除最不经常使用的记录，即set或get最久远的。
若opt=1，接下来两个整数x, y，表示set(x, y)
若opt=2，接下来一个整数x，表示g]]></description><category></category></item><item><title><![CDATA[Java中不会加载子类的几种情况]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/108676205</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/108676205</guid><author>Gee_Zer</author><pubDate>Sat, 19 Sep 2020 07:29:36 +0800</pubDate><description><![CDATA[1.调用父类的static成员或方法
父类
package classloaddemo;

public class User {
	static {
		System.out.println("User 被加载！");
	}
	public static int a = 1;
	public static final int b = 1;

	public static void say() {
		System.out.println("Hello!");
	}
}


子类
package class]]></description><category></category></item><item><title><![CDATA[桶排序，选择排序，冒泡排序，插入排序的Java实现]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/108576134</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/108576134</guid><author>Gee_Zer</author><pubDate>Mon, 14 Sep 2020 11:27:28 +0800</pubDate><description><![CDATA[package sort;
//定义接口，控制小到大排序，或者大到小排序
public interface Compare {
	boolean compareTo(int a, int b);
}


package sort;
//排序工具类
public class ArraySortUtil {
	/**
	 * 冒泡排序
	 * 
	 * @param a 排序的目标数组
	 * @param c 比较函数，决定数组的排序规则
	 * @return 返回排序好的数组
	 */
	public s]]></description><category></category></item><item><title><![CDATA[力扣647. 回文子串（DP）]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/108094573</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/108094573</guid><author>Gee_Zer</author><pubDate>Wed, 19 Aug 2020 10:51:11 +0800</pubDate><description><![CDATA[题目链接
给定一个字符串，你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串，即使是由相同的字符组成，也会被视作不同的子串。
示例 1：
输入：“abc”
输出：3
解释：三个回文子串: “a”, “b”, “c”
示例 2：
输入：“aaa”
输出：6
解释：6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”
来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/palindromic-substr]]></description><category></category></item><item><title><![CDATA[基于双向链表实现的栈]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/108015917</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/108015917</guid><author>Gee_Zer</author><pubDate>Sat, 15 Aug 2020 00:59:07 +0800</pubDate><description><![CDATA[看了LinkedList的源码，明白了LinkedList底层使用的是双向链表，一直想找个机会实现一下双向链表，今天写到力扣的每日一题20.有效的括号，正好此题需要使用到栈，所以借此机会来自己实现一下基于双向链表实现的栈，实现栈之前要了解以下知识
1.什么是双向链表
双向链表是指一个节点有一个数据域，两个指针域，一个指针域指向上一个节点，一个指针域指向下一个节点，现在将指向上一个节点的指针域命名为pre，将指向下一个节点的指针域命名为next，节点命名为node，一个合格的双向链表如下图所示

中间的nod]]></description><category></category></item><item><title><![CDATA[LinkedList源码了解]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/107765575</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/107765575</guid><author>Gee_Zer</author><pubDate>Mon, 03 Aug 2020 15:47:58 +0800</pubDate><description><![CDATA[LinkedList源码
/*
 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.util;

import]]></description><category></category></item><item><title><![CDATA[ArrayList的简单了解]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/107690732</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/107690732</guid><author>Gee_Zer</author><pubDate>Thu, 30 Jul 2020 15:10:45 +0800</pubDate><description><![CDATA[有些东西还没做学习，学习完后补充
/*
 * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.util;

im]]></description><category></category></item><item><title><![CDATA[clone的深拷贝与浅拷贝]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/107690175</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/107690175</guid><author>Gee_Zer</author><pubDate>Thu, 30 Jul 2020 15:07:35 +0800</pubDate><description><![CDATA[想要了解浅拷贝和深拷贝之前，要了解的是值传递和引用传递。
值传递：传递的是变量的值，对该值进行修改不会影响原来变量的值
引用传递：传递的是变量的在堆中的引用，修改其值，会影响实际变量
这里只是简单的介绍，想要详细了解的话，建议查看其他博客
知道了值传递和引用传递就可以来了解浅拷贝和深拷贝了
浅拷贝：基本类型拷贝的是值，引用类型拷贝的是引用
深拷贝：基本类型拷贝的是值，引用类型拷贝的也是值
用具体的例子来展示浅拷贝和深拷贝，重写clone方法需要实现Cloneable标识接口，标识该类是可以拷贝的，不然拷贝时]]></description><category></category></item><item><title><![CDATA[设计模式之代理模式]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/107665818</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/107665818</guid><author>Gee_Zer</author><pubDate>Wed, 29 Jul 2020 21:42:06 +0800</pubDate><description><![CDATA[一、代理模式的概念
当一个类无法直接使用另外一个类时，使用一个代理类来达到使用的目的。

这句话是什么意思呢，举一个生活中的例子，现在的人都喜欢去北上广深打工，打工难免要租房子，而租房子，是很难直接去找到房东去租的，一般都需要通过中介来达到中间沟通的作用，这也是为什么中介可以在中间赚差价的原因。
我们把类无法直接使用的类称为目标类，在这个例子中，房东就代表目标类，而中介就是代理类，租客必须通过中介才能联系到房东，这就是代理模式的思想
二、代理模式的作用
1.功能增强：在你原有的功能之上，增加额外的功能。新增]]></description><category></category></item><item><title><![CDATA[SimpleDateFormat的使用方法]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/107017386</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/107017386</guid><author>Gee_Zer</author><pubDate>Mon, 29 Jun 2020 11:54:24 +0800</pubDate><description><![CDATA[使用Date直接输出日期时，是使用系统默认的格式输出，所以需要使用SimpleDateFormat来格式化日期。
那么SimpleDateFormat类怎么使用呢，我们需要先了解此类的格式化符号
y：代表年份
M：代表月份
d：代表月份中的那一天，也就是日
H：代表小时
m：代表分钟
s：代表秒
S：代表毫秒
所以使用时，需要使用这些字符来格式化日期
例如：你想显示日期格式为 2020-05-23 22:00:00 000
使用格式就应该为yyyy-MM-dd HH:mm:ss SSS
下面使用代码展示Si]]></description><category></category></item><item><title><![CDATA[Integer的parseInt源码分析]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/106992865</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/106992865</guid><author>Gee_Zer</author><pubDate>Sun, 28 Jun 2020 09:45:33 +0800</pubDate><description><![CDATA[public static int parseInt(String s, int radix)
                throws NumberFormatException
    {
        /*
         * WARNING: This method may be invoked early during VM initialization
         * before IntegerCache is initialized. Care must be taken t.]]></description><category></category></item><item><title><![CDATA[int Integer String 相互转换]]></title><link>https://blog.youkuaiyun.com/Gee_Zer/article/details/106992843</link><guid>https://blog.youkuaiyun.com/Gee_Zer/article/details/106992843</guid><author>Gee_Zer</author><pubDate>Sun, 28 Jun 2020 09:44:35 +0800</pubDate><description><![CDATA[三种类型的相互转换是非常重要的知识点
接下来直接展示代码：
package cn.geezer.usually;

public class IntToIntegerToString {
    public static void main(String[] args) {
        //int -&gt; String
        int i = 10;
        String str = i + "";//直接使用字符串拼接的技巧，将int转换为String
        str =]]></description><category></category></item></channel></rss>