<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title><![CDATA[紫琪程序猿]]></title> 
<atom:link href="https://blog.jjzqkj.cn/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[曲靖开发区紫琪软件工作室官方博客网]]></description>
<link>https://blog.jjzqkj.cn/</link>
<language>zh-cn</language>
<generator>www.emlog.net</generator>
<item>
    <title>java 延迟执行</title>
    <link>https://blog.jjzqkj.cn/工具集/61.html</link>
    <description><![CDATA[<p>// 延迟5分钟执行</p>
<pre><code class="language-java">ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.schedule(() -&gt; {
    // TODO 执行内容
}, 5, TimeUnit.MINUTES);</code></pre>]]></description>
    <pubDate>Fri, 20 Jun 2025 10:16:00 +0800</pubDate>
    <dc:creator>紫琪软件工作室</dc:creator>
    <guid>https://blog.jjzqkj.cn/工具集/61.html</guid>
</item>
<item>
    <title>Linux cp 命令详解</title>
    <link>https://blog.jjzqkj.cn/Linux/60.html</link>
    <description><![CDATA[<h1>基本语法</h1>
<pre><code class="language-shell">cp [选项] 源文件 目标文件
cp [选项] 源文件... 目标目录</code></pre>
<h1>常用选项</h1>
<table>
<thead>
<tr>
<th>选项</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>-a</td>
<td>归档模式，等同于 -dR --preserve=all</td>
</tr>
<tr>
<td>-i</td>
<td>覆盖前提示确认</td>
</tr>
<tr>
<td>-n</td>
<td>不覆盖已存在文件</td>
</tr>
<tr>
<td>-r 或 -R</td>
<td>递归复制目录</td>
</tr>
<tr>
<td>-v</td>
<td>显示详细操作信息</td>
</tr>
<tr>
<td>-u</td>
<td>仅在源文件比目标文件新或目标文件不存在时复制</td>
</tr>
<tr>
<td>-p</td>
<td>保留原始文件的属性（权限、时间戳等）</td>
</tr>
<tr>
<td>-l</td>
<td>创建硬链接而非复制</td>
</tr>
<tr>
<td>-s</td>
<td>创建符号链接（软链接）而非复制</td>
</tr>
<tr>
<td>--backup</td>
<td>覆盖前备份现有文件</td>
</tr>
</tbody>
</table>
<h1>使用示例</h1>
<h2>递归复制文件夹，保留文件信息，显示复制过程</h2>
<pre><code class="language-shell">cp -arpv ziqirj-admin.jar /usr/backup/1.0.0</code></pre>]]></description>
    <pubDate>Tue, 15 Apr 2025 11:16:00 +0800</pubDate>
    <dc:creator>紫琪软件工作室</dc:creator>
    <guid>https://blog.jjzqkj.cn/Linux/60.html</guid>
</item>
<item>
    <title>常用正则表达式</title>
    <link>https://blog.jjzqkj.cn/工具集/58.html</link>
    <description><![CDATA[<p>1、表示一个或多个连续的空白字符<br />
<code>\\s+</code>：- 这是一个正则表达式，表示一个或多个连续的空白字符。这里的 \s 表示任何空白字符（如空格、制表符 \t、换行符 \n 等），而 + 则表示前面的元素（这里是空白字符）可以出现一次或多次。</p>]]></description>
    <pubDate>Tue, 18 Mar 2025 10:37:00 +0800</pubDate>
    <dc:creator>紫琪软件工作室</dc:creator>
    <guid>https://blog.jjzqkj.cn/工具集/58.html</guid>
</item>
<item>
    <title>Linux nohup命令运行jar包</title>
    <link>https://blog.jjzqkj.cn/Linux/57.html</link>
    <description><![CDATA[<p><code>nohup java -jar ziqirj-admin.jar --spring.profiles.active=druid &gt; ziqirj-admin.out 2&gt;&amp;1 &amp;</code></p>]]></description>
    <pubDate>Mon, 17 Mar 2025 09:12:00 +0800</pubDate>
    <dc:creator>紫琪软件工作室</dc:creator>
    <guid>https://blog.jjzqkj.cn/Linux/57.html</guid>
</item>
<item>
    <title>Linux 查看内核版本</title>
    <link>https://blog.jjzqkj.cn/Linux/56.html</link>
    <description><![CDATA[<h1>方法 1: 使用 uname 命令</h1>
<p>uname 是一个常用的命令，用于查看系统信息。查看内核版本可以使用以下命令：<br />
<code>uname -r</code></p>
<h2>输出示例：</h2>
<p><code>5.15.0-83-generic</code></p>
<ul>
<li>其中 5.15.0 是内核版本号，83 是补丁版本，generic 是内核类型。<br />
如果想查看更详细的信息，可以使用：<br />
<code>uname -a</code>
<h2>输出示例：</h2>
<p><code>Linux hostname 5.15.0-83-generic #92-Ubuntu SMP Tue Oct 3 09:00:00 UTC 2023 x86_64 GNU/Linux</code></p></li>
<li>这里会显示内核版本、主机名、操作系统类型、系统架构等信息。
<h1>方法 2: 查看 /proc/version 文件</h1>
<p>Linux 系统的 /proc 目录下有一个 version 文件，记录了内核版本信息。可以通过以下命令查看：<br />
<code>cat /proc/version</code></p>
<h2>输出示例：</h2>
<p><code>Linux version 5.15.0-83-generic (buildd@lcy02-amd64-001) (gcc (Ubuntu 11.3.0-1ubuntu1~22.04) #92-Ubuntu SMP Tue Oct 3 09:00:00 UTC 2023</code></p>
<h1>方法 3: 使用 hostnamectl 命令（适用于 systemd 系统）</h1>
<p>如果你的系统使用 systemd，可以使用 hostnamectl 命令查看内核版本：<br />
<code>hostnamectl</code></p>
<h2>输出示例：</h2>
<pre><code class="language-shell">Static hostname: hostname
Operating System: Ubuntu 22.04.3 LTS
Kernel: Linux 5.15.0-83-generic
Architecture: x86-64</code></pre></li>
</ul>]]></description>
    <pubDate>Wed, 12 Mar 2025 21:47:00 +0800</pubDate>
    <dc:creator>紫琪软件工作室</dc:creator>
    <guid>https://blog.jjzqkj.cn/Linux/56.html</guid>
</item>
<item>
    <title>正则表达式语法</title>
    <link>https://blog.jjzqkj.cn/java/55.html</link>
    <description><![CDATA[<p>在其他语言中，\ 表示：我想要在正则表达式中插入一个普通的（字面上的）反斜杠，请不要给它任何特殊的意义。<br />
在 Java 中，\ 表示：我要插入一个正则表达式的反斜线，所以其后的字符具有特殊的意义。<br />
所以，在其他的语言中，一个反斜杠\就足以具有转义的作用，而在正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。<br />
也可以简单的理解在正则表达式中，两个 \ 代表其他语言中的一个 \，这也就是为什么表示一位数字的正则表达式是 \d，而表示一个普通的反斜杠是 \\。</p>
<p>字符                  说明<br />
\               将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如，&quot;n&quot;匹配字符&quot;n&quot;。&quot;\n&quot;匹配换行符。序列&quot;\\&quot;匹配&quot;\&quot;，&quot;\(&quot;匹配&quot;(&quot;。<br />
^               匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性，^ 还会与&quot;\n&quot;或&quot;\r&quot;之后的位置匹配。<br />
$               匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性，$ 还会与&quot;\n&quot;或&quot;\r&quot;之前的位置匹配。</p>
<ul>
<li>零次或多次匹配前面的字符或子表达式。例如，zo<em> 匹配&quot;z&quot;和&quot;zoo&quot;。</em> 等效于 {0,}。</li>
<li>一次或多次匹配前面的字符或子表达式。例如，&quot;zo+&quot;与&quot;zo&quot;和&quot;zoo&quot;匹配，但与&quot;z&quot;不匹配。+ 等效于 {1,}。<br />
?               零次或一次匹配前面的字符或子表达式。例如，&quot;do(es)?&quot;匹配&quot;do&quot;或&quot;does&quot;中的&quot;do&quot;。? 等效于 {0,1}。<br />
{n}             n 是非负整数。正好匹配 n 次。例如，&quot;o{2}&quot;与&quot;Bob&quot;中的&quot;o&quot;不匹配，但与&quot;food&quot;中的两个&quot;o&quot;匹配。<br />
{n,}            n 是非负整数。至少匹配 n 次。例如，&quot;o{2,}&quot;不匹配&quot;Bob&quot;中的&quot;o&quot;，而匹配&quot;foooood&quot;中的所有 o。&quot;o{1,}&quot;等效于&quot;o+&quot;。&quot;o{0,}&quot;等效于&quot;o<em>&quot;。<br />
{n,m}           M 和 n 是非负整数，其中 n &lt;= m。匹配至少 n 次，至多 m 次。例如，&quot;o{1,3}&quot;匹配&quot;fooooood&quot;中的头三个 o。'o{0,1}' 等效于 'o?'。注意：您不能将空格插入逗号和数字之间。<br />
?               当此字符紧随任何其他限定符（</em>、+、?、{n}、{n,}、{n,m}）之后时，匹配模式是&quot;非贪心的&quot;。&quot;非贪心的&quot;模式匹配搜索到的、尽可能短的字符串，而默认的&quot;贪心的&quot;模式匹配搜索到的、尽可能长的字符串。例如，在字符串&quot;oooo&quot;中，&quot;o+?&quot;只匹配单个&quot;o&quot;，而&quot;o+&quot;匹配所有&quot;o&quot;。<br />
.               匹配除&quot;\r\n&quot;之外的任何单个字符。若要匹配包括&quot;\r\n&quot;在内的任意字符，请使用诸如&quot;[\s\S]&quot;之类的模式。<br />
(pattern)       匹配 pattern 并捕获该匹配的子表达式。可以使用 $0…$9 属性从结果&quot;匹配&quot;集合中检索捕获的匹配。若要匹配括号字符 ( )，请使用&quot;(&quot;或者&quot;)&quot;。<br />
(?:pattern)     匹配 pattern 但不捕获该匹配的子表达式，即它是一个非捕获匹配，不存储供以后使用的匹配。这对于用&quot;or&quot;字符 (|) 组合模式部件的情况很有用。例如，'industr(?:y|ies) 是比 'industry|industries' 更经济的表达式。<br />
(?=pattern)     执行正向预测先行搜索的子表达式，该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配，即不能捕获供以后使用的匹配。例如，'Windows (?=95|98|NT|2000)' 匹配&quot;Windows 2000&quot;中的&quot;Windows&quot;，但不匹配&quot;Windows 3.1&quot;中的&quot;Windows&quot;。预测先行不占用字符，即发生匹配后，下一匹配的搜索紧随上一匹配之后，而不是在组成预测先行的字符后。<br />
(?!pattern)     执行反向预测先行搜索的子表达式，该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配，即不能捕获供以后使用的匹配。例如，'Windows (?!95|98|NT|2000)' 匹配&quot;Windows 3.1&quot;中的 &quot;Windows&quot;，但不匹配&quot;Windows 2000&quot;中的&quot;Windows&quot;。预测先行不占用字符，即发生匹配后，下一匹配的搜索紧随上一匹配之后，而不是在组成预测先行的字符后。<br />
x|y             匹配 x 或 y。例如，'z|food' 匹配&quot;z&quot;或&quot;food&quot;。'(z|f)ood' 匹配&quot;zood&quot;或&quot;food&quot;。<br />
[xyz]           字符集。匹配包含的任一字符。例如，&quot;[abc]&quot;匹配&quot;plain&quot;中的&quot;a&quot;。<br />
[^xyz]          反向字符集。匹配未包含的任何字符。例如，&quot;[^abc]&quot;匹配&quot;plain&quot;中&quot;p&quot;，&quot;l&quot;，&quot;i&quot;，&quot;n&quot;。<br />
[a-z]           字符范围。匹配指定范围内的任何字符。例如，&quot;[a-z]&quot;匹配&quot;a&quot;到&quot;z&quot;范围内的任何小写字母。<br />
[^a-z]          反向范围字符。匹配不在指定的范围内的任何字符。例如，&quot;[^a-z]&quot;匹配任何不在&quot;a&quot;到&quot;z&quot;范围内的任何字符。<br />
\b              匹配一个字边界，即字与空格间的位置。例如，&quot;er\b&quot;匹配&quot;never&quot;中的&quot;er&quot;，但不匹配&quot;verb&quot;中的&quot;er&quot;。<br />
\B              非字边界匹配。&quot;er\B&quot;匹配&quot;verb&quot;中的&quot;er&quot;，但不匹配&quot;never&quot;中的&quot;er&quot;。<br />
\cx             匹配 x 指示的控制字符。例如，\cM 匹配 Control-M 或回车符。x 的值必须在 A-Z 或 a-z 之间。如果不是这样，则假定 c 就是&quot;c&quot;字符本身。<br />
\d              数字字符匹配。等效于 [0-9]。<br />
\D              非数字字符匹配。等效于 [^0-9]。<br />
\f              换页符匹配。等效于 \x0c 和 \cL。<br />
\n              换行符匹配。等效于 \x0a 和 \cJ。<br />
\r              匹配一个回车符。等效于 \x0d 和 \cM。<br />
\s              匹配任何空白字符，包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。<br />
\S              匹配任何非空白字符。与 [^ \f\n\r\t\v] 等效。<br />
\t              制表符匹配。与 \x09 和 \cI 等效。<br />
\v              垂直制表符匹配。与 \x0b 和 \cK 等效。<br />
\w              匹配任何字类字符，包括下划线。与&quot;[A-Za-z0-9<em>]&quot;等效。<br />
\W              与任何非单词字符匹配。与&quot;[^A-Za-z0-9</em>]&quot;等效。<br />
\xn             匹配 n，此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如，&quot;\x41&quot;匹配&quot;A&quot;。&quot;\x041&quot;与&quot;\x04&quot;&amp;&quot;1&quot;等效。允许在正则表达式中使用 ASCII 代码。<br />
\num            匹配 num，此处的 num 是一个正整数。到捕获匹配的反向引用。例如，&quot;(.)\1&quot;匹配两个连续的相同字符。<br />
\n              标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式，那么 n 是反向引用。否则，如果 n 是八进制数 (0-7)，那么 n 是八进制转义码。<br />
\nm             标识一个八进制转义码或反向引用。如果 \nm 前面至少有 nm 个捕获子表达式，那么 nm 是反向引用。如果 \nm 前面至少有 n 个捕获，则 n 是反向引用，后面跟有字符 m。如果两种前面的情况都不存在，则 \nm 匹配八进制值 nm，其中 n 和 m 是八进制数字 (0-7)。<br />
\nml            当 n 是八进制数 (0-3)，m 和 l 是八进制数 (0-7) 时，匹配八进制转义码 nml。<br />
\un             匹配 n，其中 n 是以四位十六进制数表示的 Unicode 字符。例如，\u00A9 匹配版权符号 (©</li>
</ul>]]></description>
    <pubDate>Thu, 27 Feb 2025 11:35:00 +0800</pubDate>
    <dc:creator>紫琪软件工作室</dc:creator>
    <guid>https://blog.jjzqkj.cn/java/55.html</guid>
</item>
<item>
    <title>CentOS8安装mysql8详细步骤</title>
    <link>https://blog.jjzqkj.cn/MySQL/54.html</link>
    <description><![CDATA[<p>1、安装wget</p>
<pre><code class="language-shell">yum -y install wget</code></pre>
<p>2、采取wget下载mysql8安装包</p>
<pre><code class="language-shell">wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm</code></pre>
<p>3、安装yum源</p>
<pre><code class="language-shell">yum -y localinstall mysql80-community-release-el7-3.noarch.rpm</code></pre>
<p>4、安装mysql服务</p>
<pre><code class="language-shell">yum -y install mysql-community-server</code></pre>
<p>如显示：显示公钥尚未安装，执行以下命令，或者考虑直接使用以下命令，省去yum -y install mysql-community-server试试</p>
<pre><code class="language-shell">yum install -y mysql-community-server --nogpgcheck</code></pre>
<p>5、启动mysql服务</p>
<pre><code class="language-shell">systemctl start mysqld</code></pre>
<p>6、设置开机自启</p>
<ul>
<li>设置自启
<pre><code class="language-shell">systemctl enable mysqld</code></pre></li>
<li>重启systemctl
<pre><code class="language-shell">systemctl daemon-reload</code></pre></li>
</ul>
<p>7、通过初始密码登陆mysql</p>
<pre><code class="language-shell">mysql -u root -p</code></pre>
<pre><code>    使用初始密码登录（mysqld.log查初始密码）</code></pre>
<p>8、修改初始密码</p>
<pre><code class="language-shell">ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root123@'</code></pre>
<p>9、设置远程登录</p>
<pre><code class="language-shell">CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password  BY 'Root123@';
GRANT ALL ON *.* TO 'root'@'%';
flush privileges;</code></pre>
<p>10、开放端口</p>
<pre><code class="language-shell">firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload</code></pre>]]></description>
    <pubDate>Wed, 19 Feb 2025 16:54:00 +0800</pubDate>
    <dc:creator>9HSdtZWm</dc:creator>
    <guid>https://blog.jjzqkj.cn/MySQL/54.html</guid>
</item>
<item>
    <title>js 民族数组</title>
    <link>https://blog.jjzqkj.cn/前端/53.html</link>
    <description><![CDATA[<pre><code class="language-javascript">module.exports = {
    nationalities: [
        '汉族', '满族', '蒙古族', '回族', '藏族', '维吾尔族', '苗族', '彝族', '壮族', '布依族', 
        '侗族', '瑶族', '白族', '土家族', '哈尼族', '哈萨克族', '傣族', '黎族', '傈僳族', '佤族', 
        '畲族', '高山族', '拉祜族', '水族', '东乡族', '纳西族', '景颇族', '柯尔克孜族', '土族', '达斡尔族', 
        '仫佬族', '羌族', '布朗族', '撒拉族', '毛南族', '仡佬族', '锡伯族', '阿昌族', '普米族', '朝鲜族', 
        '塔吉克族', '怒族', '乌孜别克族', '俄罗斯族', '鄂温克族', '德昂族', '保安族', '裕固族', '京族', '塔塔尔族', 
        '独龙族', '鄂伦春族', '赫哲族', '门巴族', '珞巴族', '基诺族'
    ]
}</code></pre>]]></description>
    <pubDate>Fri, 14 Feb 2025 00:06:00 +0800</pubDate>
    <dc:creator>紫琪软件工作室</dc:creator>
    <guid>https://blog.jjzqkj.cn/前端/53.html</guid>
</item>
<item>
    <title>反射工具类</title>
    <link>https://blog.jjzqkj.cn/工具集/52.html</link>
    <description><![CDATA[<h1>工具类ReflectUtil</h1>
<pre><code class="language-java">package cn.ziqirj.common.utils;

import cn.ziqirj.common.exception.UtilException;
import lombok.Setter;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 反射工具类
 * @author zhangji
 *
 */
public class ReflectUtil&lt;T&gt; {

    @Setter
    private T t;
    private final Class&lt;T&gt; tClass;

    public ReflectUtil(Class&lt;T&gt; tClass) {
        this.tClass = tClass;
    }

    /**
     * 获取对象实例
     */
    public T getObject() throws InstantiationException, IllegalAccessException {
        return tClass.newInstance();
    }

    /**
     * 生成对象
     * @param map：key属性名-&gt;value值
     * @return T
     */
    public T getObject(Map&lt;String, Object&gt; map) throws InstantiationException, UtilException, IllegalAccessException{
        Set&lt;String&gt; set = map.keySet();
        T tt = tClass.newInstance();
        for (String key : set) {
            try {
                // 这里必须调用getDeclaredFiedl();
                Field fieldDec = tClass.getDeclaredField(key);
                // 是否取消java的语法检查，因为此变量是私有的，如果不取消则无法赋值
                fieldDec.setAccessible(true);
                Object value = map.get(key);
                fieldDec.set(tt, value);
            } catch (NoSuchFieldException | SecurityException e) {
                throw new UtilException(getObjectPath() + ":" + key + " is not found!", e);
            } catch (IllegalArgumentException | IllegalAccessException e) {
                throw new UtilException("赋值失败!", e);
            } 
        }
        return tt;
    }

    /**
     * 解析注解：key："name" ---&gt; value：name值
     * @param annoStr 注解字符串
     */
    private Map&lt;String, String&gt; getParamsAnno(String annoStr) throws IllegalArgumentException {
        Map&lt;String, String&gt; map = new HashMap&lt;&gt;();
        annoStr = annoStr.substring(annoStr.indexOf('(')+1, annoStr.length()-1);
        String[] annoStrArr = StringUtils.toArray(annoStr, ",");
        if (annoStrArr != null) {
            for(String str : annoStrArr) {
                String[] strArr = StringUtils.toArray(str, "=");
                if (strArr != null &amp;&amp; strArr.length == 2) {
                    map.put(strArr[0].trim(), strArr[1]);
                }
            }
        }
        return map;
    }

    public String getObjectPath() {
        return t.getClass().getName();
    }

}
</code></pre>
<h2>toArray工具方法</h2>
<pre><code class="language-java">/**
     * 字符串分割为字符串数组
     *
     * @param str 需要分割的字符串
     * @param decollator 分割符, 默认为逗号
     * @return 字符串数组
     */
    public static String[] toArray(String str, String decollator) {
        if(isEmpty(str) || isEmpty(decollator)) {
            return null;
        }

        //需分割的字符串最后一个字符不能为分隔符
        if(str.lastIndexOf(decollator) == str.length() - 1) {
            str = str.substring(0, str.length() - 1);
        }
        if(isEmpty(str) || isEmpty(decollator)) {
            return null;
        }

        //需分割的字符串第一个字符不能为分隔符
        if(str.lastIndexOf(decollator) == 0) {
            str = str.substring(1);
        }
        if(isEmpty(str) || isEmpty(decollator)) {
            return null;
        }

        String[] array;
        if(!str.contains(decollator)) {
            array = new String[1];
            array[0] = str;
        } else {
            array = str.split(decollator);
        }

        return array;
    }</code></pre>]]></description>
    <pubDate>Tue, 31 Dec 2024 11:23:00 +0800</pubDate>
    <dc:creator>紫琪软件工作室</dc:creator>
    <guid>https://blog.jjzqkj.cn/工具集/52.html</guid>
</item>
<item>
    <title>自定义有序Map</title>
    <link>https://blog.jjzqkj.cn/工具集/51.html</link>
    <description><![CDATA[<pre><code class="language-java">package cn.ziqirj.common.utils;

import lombok.Getter;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

/**
 * 模拟Map集合，key不可重复，按插入顺序排序
 * @author zhangji
 *
 * @param &lt;T&gt;
 */
public class CustomOrderlyMap&lt;T&gt; {
    @Getter
    private List&lt;String&gt; keys = new ArrayList&lt;&gt;();
    @Getter
    private List&lt;T&gt; values = new ArrayList&lt;&gt;();
    private List&lt;map&lt;T&gt;&gt; kv = new ArrayList&lt;&gt;();

    public CustomOrderlyMap() {}

    /**
     * 添加元素
     * @param key 键
     * @param value 值
     */
    public void add(String key, T value) {
        Integer index = getIndex(key);
        if(null != index &amp;&amp; index != -1) {
            values.set(index, value);
            kv.get(index).setValue(value);
            return ;
        }
        keys.add(key);
        values.add(value);
        kv.add(new map&lt;T&gt;(key, value));
    }

    /**
     * 批量添加元素
     * @param customMap 集合
     */
    public void addAll(CustomOrderlyMap&lt;T&gt; customMap) {
        if(null == customMap || customMap.size() == 0) {
            return ;
        }
        List&lt;map&lt;T&gt;&gt; kvl = customMap.kv;
        for(map&lt;T&gt; map : kvl) {
            this.add(map.getKey(), map.getValue());
        }
    }

    /**
     * 移除元素
     * @param key 键
     */
    public void remove(String key) {
        Integer index = getIndex(key);
        if(null == index || index == -1 ) {
            return ;
        }
        keys.remove(index);
        values.remove(index);
        kv.remove(index);
    }

    /**
     * 移除元素
     * @param obj 值
     */
    public void remove(T obj) {
        Integer index = getIndex(obj);
        if(null == index || index == -1 ) {
            return ;
        }
        keys.remove(index);
        values.remove(index);
        kv.remove(index);
    }

    /**
     * 清空集合
     */
    public void removeAll() {
        this.keys = new ArrayList&lt;&gt;();
        this.values = new ArrayList&lt;&gt;();
        this.kv = new ArrayList&lt;&gt;();
    }

    /**
     * 关闭集合
     */
    public void close() {
        this.keys.clear();
        this.values.clear();
        this.kv.clear();
    }

    /**
     * 设置元素
     * @param key 键
     * @param value 值
     */
    public void set(String key, T value) {
        Integer index = getIndex(key);
        if(null == index || index.intValue() == -1)
            return ;
        values.set(index, value);
        kv.get(index).setValue(value);
    }

    /**
     * 获取元素
     * @param key 键
     * @return T
     */
    public T get(String key) {
        Integer index = getIndex(key);
        if (null == index || index == -1)
            return null;
        return kv.get(index).getValue();
    }

    /**
     * 获取集合大小
     * @return Integer
     */
    public Integer size() {
        return this.kv.size();
    }

    /**
     * 判断集合是否为空
     * @return boolean
     */
    public boolean isEmpty() {
        return this.kv.isEmpty();
    }

    /**
     * 打印集合
     */
    public void print() {
        if(isEmpty()) {
            System.out.println("null");
        }
        System.out.print("CustomMap : [");
        for(map&lt;T&gt; m : this.kv) {
            System.out.print(m.toString());
        }
        System.out.println("]");
    }

    /**
     * 获取key的索引
     * @param key 键
     * @return Integer
     */
    private Integer getIndex(String key) {
        int length = this.keys.size();
        if (length == 0) {
            return -1;
        }
        for (int i = 0; i &lt; length; i++) {
            if (key.equals(keys.get(i))) {
                return i;
            }
        }
        return null;
    }

    /**
     * 获取value的索引
     * @param t 值
     * @return Integer
     */
    private Integer getIndex(T t) {
        int length = this.values.size();
        if (length == 0) {
            return -1;
        }
        for (int i = 0; i &lt; length; i++) {
            if (t.equals(values.get(i))) {
                return i;
            }
        }
        return null;
    }

}

@Setter
@Getter
class map&lt;T&gt; {
    private String key;
    private T value;

    public map(String key, T value) {
        super();
        this.key = key;
        this.value = value;
    }

    @Override
    public String toString() {
        return "[K:" + key + " --&gt; V:" + value + "]";
    }

}</code></pre>]]></description>
    <pubDate>Tue, 31 Dec 2024 11:04:00 +0800</pubDate>
    <dc:creator>紫琪软件工作室</dc:creator>
    <guid>https://blog.jjzqkj.cn/工具集/51.html</guid>
</item></channel>
</rss>