<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[siyue521的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/siyue521</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; siyue521]]></copyright><item><title><![CDATA[类加载过程]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/119053308</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/119053308</guid><author>siyue521</author><pubDate>Sat, 24 Jul 2021 09:57:13 +0800</pubDate><description><![CDATA[类加载过程
据我从面经上来看，通常会问下知不知道类加载过程有哪些步骤？顺口而出，就是加载链接初始化，其中链接还包括验证准备解析。（这个时候最好就顺势展开各个点都做了些什么），加载的话，实现是根据类名获取定义此类的二进制文件流，这个步骤还提供自定义的，然后将二进制流储存所代表的静态储存结构转换成方法区/元空间运行时的数据结构，最后在内存中生成一个代表该类的Class对象，作为方法区/元空间这些数据的访问入口。
那其他过程呢？简单来说，链接的过程包括验证准备解析，验证就是检查class文件的正确性，例如clas]]></description><category></category></item><item><title><![CDATA[docker 生成centos容器并安装MySQL，使用SQLyog连接centos容器里的MySQL]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/118892207</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/118892207</guid><author>siyue521</author><pubDate>Mon, 19 Jul 2021 11:43:47 +0800</pubDate><description><![CDATA[安装
dockers中本来就安装了centos7j镜像,如下：

所以直接生成centos7容器，
docker run -itd -p 50022:22 -p 33010:3306 --privileged --name myCentos centos:7 /usr/sbin/init

参数解析：

-d ——后台运行容器并返回容器ID
-i ——交互模式运行容器，通常与 -t 同时使用
-t ——为容器重新分配一个伪输入终端，通常与 -i 同时使用
–name ——为容器指定一个名称，此例为容器指定名]]></description><category></category></item><item><title><![CDATA[SQL注入]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/118549075</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/118549075</guid><author>siyue521</author><pubDate>Wed, 07 Jul 2021 16:08:03 +0800</pubDate><description><![CDATA[概念
攻击者通过在表单中填写包含SQL关键字的数据，然后这些关键字被拼接到SQL语句中进而改变了SQL语句的原始语义，最终拼接后的恶意代码得到执行。
避免或减少SQL注入

把应用服务器的数据库权限降至最低，尽可能地减少 SQL 注入攻击带来的危害
对数据库的特殊字符进行转义处理；
避免网站打印出SQL错误的信息，把SQL语句保留出来，防止攻击者进行研究
预编译语句，绑定变量。使用预编译的SQL语句
过滤用户输入，不允许输入SQL注入相关字符


...]]></description><category></category></item><item><title><![CDATA[HashMap是线程安全的吗？有什么线程安全的方法]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/118528877</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/118528877</guid><author>siyue521</author><pubDate>Tue, 06 Jul 2021 21:52:58 +0800</pubDate><description><![CDATA[总结
HashMap在并发场景中不是线程安全的。比如A希望插入一个key-value对到HashMap中，当获取到对应的链表结点位置时，此时线程A的时间片用完了，而此时线程B被调度得以执行，可能线程B占用了A计算得到的位置，插入了数值。而线程A被切换回来的时候，不知道B已经插入了元素，仍然将元素插入此前计算好的位置，这样就会将B线程的插入记录覆盖掉了，这对应了多线程的put可能导致元素的丢失；
JDK1.7 当扩容的时候，存在 Entry 链死循环和数据丢失问题（线程1的put和线程2的get并发，可能导致]]></description><category></category></item><item><title><![CDATA[升级Springboot版本异常 Parameter * of method linkDiscoverers in org.springframework.hateoas.config.Hateoas]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/118499319</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/118499319</guid><author>siyue521</author><pubDate>Mon, 05 Jul 2021 21:38:27 +0800</pubDate><description><![CDATA[升级Springboot版本，执行代码报错

解决方法：
修改swgger版本
&lt;dependency&gt;
      &lt;groupId&gt;io.springfox&lt;/groupId&gt;
      &lt;artifactId&gt;springfox-swagger2&lt;/artifactId&gt;
      &lt;version&gt;2.6.1&lt;/version&gt;
&lt;/dependency&gt;
 
&lt;dependency&gt;
 ]]></description><category></category></item><item><title><![CDATA[Java泛型的记录]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/118482163</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/118482163</guid><author>siyue521</author><pubDate>Mon, 05 Jul 2021 10:21:39 +0800</pubDate><description><![CDATA[泛型：：参数化的类型（把类型当作是参数一样传递）
定义时不指明参数的类型，使用的时候再指明参数的类型

提高代码的复用性
它提供了编译期的类型安全，确保你只能把正确类型的对象放入集合中，避免了在运行时出现ClassCastException。

类型擦除
为了向下兼容，虚拟机其实是不支持泛型，所以Java实现的是一种 伪泛型机制，也就是说Java在编译期擦除了所有的泛型信息。所有的泛型类型最终都是一种原始类型，在Java运行时根本就不存在泛型信息。
Java编译器具体是如何擦除泛型的
检查泛型类型，获取目标]]></description><category></category></item><item><title><![CDATA[浅析Java集合框架]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/118363467</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/118363467</guid><author>siyue521</author><pubDate>Wed, 30 Jun 2021 16:42:27 +0800</pubDate><description><![CDATA[Set：无序，不可重复的集合
List:有序，重复的集合
Map：具有映射关系的集合
Queue: 队列集合

Java集合和数组的区别：
（1）数组长度在初始化时指定，意味着只能保存定长的数据。而集合可以保存数量不确定的数据。
（2）数组元素即可以是基本类型的值，也可以是对象。集合里只能保存对象（实际上只是保存对象的引用变量），基本数据类型的变量要转换成对应的包装类才能放入集合类中.
Collection接口
Collection的常用方法：

使用Iterator遍历集合元素
Iterator接口中..]]></description><category></category></item><item><title><![CDATA[Java中的对象和引用]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/118362041</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/118362041</guid><author>siyue521</author><pubDate>Wed, 30 Jun 2021 15:26:59 +0800</pubDate><description><![CDATA[概述
对象：一般是指某个类（class）的一个实例（instance）；
对象引用：在Java中，指向某个对象存储地址，也就是指向一个对象的“引用”
比如：
Person person = new Person("张三");

new Person(“张三”);是new了Person类的一个对象（在堆上创建），而Person person是声明一个可以指向Person类对象的引用person，与下面两行代码完全相同
Person person;
person = new Person("张三");

由此可]]></description><category></category></item><item><title><![CDATA[问什么hsahmap的容量总是2的n次幂]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/118303901</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/118303901</guid><author>siyue521</author><pubDate>Mon, 28 Jun 2021 15:36:35 +0800</pubDate><description><![CDATA[概述
我们知道hsahmap的底层是由链表和数组构成的，为了最有效的提高数据的存取效率，hashMap每次保存数据都是分散保存在不同的index位置上。
如何实现数组的散列性呢？一般的想法可以是利用key值的哈希值（hash）对数组的长度（length）取余，即hash%length。但是hashMap的源码作者是利用一种更高效的计算手段，也就是利用哈希值和数组长度的二进制表示进行位运算，具体来说就是hash&amp;(length-1)，但是必须保证length等于2的n次幂。
原理
因为我们知道leng]]></description><category></category></item><item><title><![CDATA[详谈 http和https]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/118296574</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/118296574</guid><author>siyue521</author><pubDate>Mon, 28 Jun 2021 11:07:14 +0800</pubDate><description><![CDATA[超文本协议http协议
实现web浏览器和网站服务器之间的信息传递。HTTP协议通过明文传输的方式进行内容发送，没有进行加密处理，浏览器和服务器之间传输的报文信息很容易被攻击者截取。因此http不适合一些敏感信息的传送，比如银行卡密码等。
安全套接层接口超文本传输协议
https是在http的基础上加入了SSL协议，SSL依靠证书来验证服务器的身份，并为浏览器和服务器之间的通信加密。该传输协议基本实现了:

建议一个信息安全通道，来保证数据传输的安全
确定网站的真实性。

主要的区别如下：

https协议]]></description><category></category></item><item><title><![CDATA[String类的.isEmpty()方法 空指针问题]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/118275656</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/118275656</guid><author>siyue521</author><pubDate>Sun, 27 Jun 2021 16:18:43 +0800</pubDate><description><![CDATA[最近，在实现网站国际化，从前端接受参数（字符串类型 language），在判断是否前端有参数传过来的时候，想用.isEmpty()
进行判断，
String language = request.getParameter("l");
if(!language.isEmpty(language)){
            //使用 _ 分割语言和国家
            String[] s = language.split("_");

            locale = new Locale(]]></description><category></category></item><item><title><![CDATA[TCP协议：三次握手、四次挥手过程详解]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/118145341</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/118145341</guid><author>siyue521</author><pubDate>Wed, 23 Jun 2021 10:55:02 +0800</pubDate><description><![CDATA[概述：
建立TCP连接通道（三次握手），传输数据，断开TCP连接通道（四次挥手），下图显示了TCP通信过程。

1. 三次握手建立连接

第一次握手：客户端发送syn包(seq=x)到服务器，并进入SYN_SEND状态，等待服务器确认;服务器收到syn包，必须确认客户的SYN(ack=x+1)，此时，服务器确认，客户端发送能力正常，服务端接收能力正常。
第二次握手：服务器同时自己也发送一个SYN包(seq=y)，即SYN+ACK包，此时服务器进入SYN_RECV状态;客户端收到服务器的SYN+ACK包。此时]]></description><category></category></item><item><title><![CDATA[HashMap的实现原理]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/118048657</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/118048657</guid><author>siyue521</author><pubDate>Sat, 19 Jun 2021 10:56:34 +0800</pubDate><description><![CDATA[HashMap概述
在数据结构中，物理存储的数据结构只有两种，即数组和链表，其余的如树，队列，栈等数据结构都是在它们的基础上逻辑抽象而来Hashmap实际上是一个“链表散列”的数据结构，是数组和链表的结合体（允许使用null值和null键）

由图可知，HashMap底层就是一个数组结构，数组中的每一个元素又是一个链表，因此它综合了数组存储和链表存储的优点，通过这种组合实现了查找和增删效率的平衡。其中，最基本的单元是Entry。
HashMap的实现

当有新的Entry需要加入进来时，根据hash值得到E]]></description><category></category></item><item><title><![CDATA[ArrayList和LinkedList的比较]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/118047850</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/118047850</guid><author>siyue521</author><pubDate>Sat, 19 Jun 2021 10:02:11 +0800</pubDate><description><![CDATA[ArrayList和LinkedList的比较
回顾：List在Collection中的的框架图

可以看出

ArrayList、LinkedList、Vector和Stack是List的四个实现类。
LinkedList是个双向链表，它同样可以被当作栈、队列或双端队列来使用。特别是作为双向链表的使用



实现的原理
ArrayList基于动态数组实现，LinkedList基于链表实现


由二者的实现原理不难看出，ArrayList访问和更新方便（直接通过下表），但是增删比较麻烦（需要逐个移动），开销]]></description><category></category></item><item><title><![CDATA[String 为什么是不可变的？String为啥要设计为不可变的？]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/118047072</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/118047072</guid><author>siyue521</author><pubDate>Sat, 19 Jun 2021 09:33:42 +0800</pubDate><description><![CDATA[String为啥要设计为不可变的？
1、便于实现字符串池（String pool
在Java中，由于会大量的使用String常量，如果每一次声明一个String都创建一个String对象，那将会造成极大的空间资源的浪费。Java提出了String pool的概念，在堆中开辟一块存储空间String pool，当初始化一个String变量时，如果该字符串已经存在了，就不会去创建一个新的字符串变量，而是会返回已经存在了的字符串的引用。假若字符串对象允许改变,那么将会导致各种逻辑错误,比如改变一个对象会影响到另一]]></description><category></category></item><item><title><![CDATA[2021-06-18]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/118014218</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/118014218</guid><author>siyue521</author><pubDate>Fri, 18 Jun 2021 08:57:05 +0800</pubDate><description><![CDATA[打jar包报错：Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project demo: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test failed: Plugin org.apache.maven.plugins:mave]]></description><category></category></item><item><title><![CDATA[线程和进程]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/117927602</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/117927602</guid><author>siyue521</author><pubDate>Tue, 15 Jun 2021 16:50:41 +0800</pubDate><description><![CDATA[线程和进程
本质上，我更愿意将其定义为两种对CPU工作时间段的不同描述。
我们知道，事实上CPU实际的执行时间和等待执行的时间是数量级的差异，所以我们会让CPU轮流执行程序（所有这些任务都处于就绪队列，然后由操作系统的调度算法，选出某个任务，让CPU来执行），但由于其速度极快，这些程序如同同时执行。　具体的轮流方法就是：先加载进程A的上下文，然后开始执行A，保存进程A的上下文，调入下一个要执行的进程B的进程上下文，然后开始执行B,保存进程B的上下文。。。。
这里程序的上下文可以视作除了CPU以外所有的执行环]]></description><category></category></item><item><title><![CDATA[SSM整合-mybatis层]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/117573397</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/117573397</guid><author>siyue521</author><pubDate>Tue, 15 Jun 2021 15:06:28 +0800</pubDate><description><![CDATA[1. maven 的配置
1.1 导入所需的依赖
&lt;dependencies&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;junit&lt;/groupId&gt;
            &lt;artifactId&gt;junit&lt;/artifactId&gt;
            &lt;version&gt;4.12&lt;/version&gt;
            &lt;scope&gt;test&l]]></description><category></category></item><item><title><![CDATA[String类型的存储方式]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/117923665</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/117923665</guid><author>siyue521</author><pubDate>Tue, 15 Jun 2021 14:36:50 +0800</pubDate><description><![CDATA[String类型的声明方式
//方式一
String str1 = "test";
String str3= "test";
//方式二
String str2 = new String("test");

System.out.println(str1 == str2);//false
System.out.println(str1 == str3);//true

方式一 创建的对象将存在String constant pool中，JVM会首先在String constant pool 中寻找是否已经存]]></description><category></category></item><item><title><![CDATA[问什么静态变量不能在方法中定义]]></title><link>https://blog.youkuaiyun.com/siyue521/article/details/117648097</link><guid>https://blog.youkuaiyun.com/siyue521/article/details/117648097</guid><author>siyue521</author><pubDate>Mon, 07 Jun 2021 08:35:46 +0800</pubDate><description><![CDATA[在方法内部定义的叫“局部变量”，而不是静态变量，局部变量不能加static，包括protected，private，public这些也不能加，而全局变量是可以的，
静态变量是定义在类中，方法体外面的，局部变量是保存在栈中的，而静态变量保存在方法区，局部变量出了方法就会被栈回收了，而静态变量不会，所以局部变量前不能加static关键字，同一时刻，只可能有一块栈内存被当前方法使用，用完了就回收了
可以换一个角度理解，静态变量和常量是在编译时确定的，而方法的局部变量是在运行时确定的，也就是说方法是可以变的，当方法]]></description><category></category></item></channel></rss>