<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Brief_的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Brief_</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Brief_]]></copyright><item><title><![CDATA[有关HashMap一些问题的个人总结]]></title><link>https://blog.youkuaiyun.com/Brief_/article/details/113784055</link><guid>https://blog.youkuaiyun.com/Brief_/article/details/113784055</guid><author>Brief_</author><pubDate>Wed, 10 Feb 2021 17:44:03 +0800</pubDate><description><![CDATA[HashMap1.7与1.8的区别
1）1.7底层：数组+链表；1.8：数组+链表+红黑树
2）1.7：头插法；1.8：尾插法
ps:HashMap在jdk1.7中采用头插入法，在扩容时会改变链表中元素原本的顺序，以至于在并发场景下可能导致链表成环，在进行下次put操作的时候程序会陷入死循环。而在jdk1.8中采用尾插入法，在扩容时会保持链表元素原本的顺序，就不会出现链表成环的问题了。
3）1.7：先扩容后插入；1.8：先插入后扩容
4）1.7：计算hash运算多；1.8：计算hash运算少
JDK1.8以]]></description><category></category></item><item><title><![CDATA[关于脏写、脏读、不可重复读、幻读的理解]]></title><link>https://blog.youkuaiyun.com/Brief_/article/details/113776733</link><guid>https://blog.youkuaiyun.com/Brief_/article/details/113776733</guid><author>Brief_</author><pubDate>Tue, 09 Feb 2021 22:58:52 +0800</pubDate><description><![CDATA[1.概念：
脏写：如果一个事务修改了另一个未提交事务修改过的数据，那就意味着发生了脏写（事务A修改还未提交的事务B所修改的变量，一旦事务B执行回滚操作，那么事务A所做的操作就是无效的）
脏读：如果一个事务读到了另一个未提交事务修改过的数据，那就意味着发生了脏读（事务A读取事务B还未提交的数据，一旦事务B执行回滚操作，那么事务A读取到的数据就是不存在的）
不可重复读：一个事务对一个变量的连续查询读取到不同的数据
幻读：在一个数据区间内，事务连续地按照一定条件查询数据时读取到了上次查询所没有的数据（强调新增，删]]></description><category></category></item><item><title><![CDATA[解析Java中的部分锁]]></title><link>https://blog.youkuaiyun.com/Brief_/article/details/113744492</link><guid>https://blog.youkuaiyun.com/Brief_/article/details/113744492</guid><author>Brief_</author><pubDate>Sun, 07 Feb 2021 18:57:56 +0800</pubDate><description><![CDATA[1.乐观锁和悲观锁
定义

乐观锁认为自己在使用数据的时候不会有别的线程修改数据，所以不会添加锁。在更新数据的时候去判断有没有别的线程更新数据。如果数据已经被其他线程更新，则根据不同的实现方式执行不同的操作（例如报错或者自动重试）。
悲观锁认为自己在使用数据的时候一定有别的线程来修改数据，所以在使用数据之前一定会加锁。

适用条件
从上面的定义可以发现

乐观锁适用于读多写少的场景。
悲观锁适用于写操作多的场景，保证写操作数据正确，避免乐观锁的多次自旋。

示例代码
下面是java中使用悲观锁和乐观锁的示例]]></description><category></category></item><item><title><![CDATA[java中快速失败机制的“Bug”]]></title><link>https://blog.youkuaiyun.com/Brief_/article/details/111405233</link><guid>https://blog.youkuaiyun.com/Brief_/article/details/111405233</guid><author>Brief_</author><pubDate>Sat, 19 Dec 2020 15:41:52 +0800</pubDate><description><![CDATA[之前的文章中对java中的Fast-Fail机制进行过简单的介绍，笔者在后来
	的学习中发现了这个机制的一点漏洞，特此补充下，如有不解，可看上篇
	[文章](https://blog.youkuaiyun.com/Brief_/article/details/109039019)

失败机制的漏洞
这个漏洞要分为2部分讲：
1）ArrayList
在ArrayList中删除倒数第二个元素时不会报错，ArrayList中定义了一个私有内部类来实现Iterator接口，并对hasNext（）方法进行了重写，部分源代码如..]]></description><category></category></item><item><title><![CDATA[Jvm的类加载机制、jdk1.8中方法区的变动]]></title><link>https://blog.youkuaiyun.com/Brief_/article/details/109455255</link><guid>https://blog.youkuaiyun.com/Brief_/article/details/109455255</guid><author>Brief_</author><pubDate>Mon, 02 Nov 2020 19:18:01 +0800</pubDate><description><![CDATA[类加载的过程
加载 —&gt; 验证 —&gt; 准备 —&gt; 解析 —&gt; 初始化 —&gt; 使用 --&gt; 卸载
初始化：执行类构造器&lt;clinit&gt;（）0方法的过程。
ps:&lt;clinit&gt;（）0方法是由编译器自动收集类中的所有类变量的赋值动作与静态语句块（static{}块）中的语句合并产生的。且父类的先执行，同一个类加载器下只会执行一次

只有这5中情况才会导致类的类的初始化

创建类的实例，也就是new一个对象，访问某个类或接口的静态变量，或者对该静态变量赋]]></description><category></category></item><item><title><![CDATA[HashCode（） 和 equals（）]]></title><link>https://blog.youkuaiyun.com/Brief_/article/details/109367772</link><guid>https://blog.youkuaiyun.com/Brief_/article/details/109367772</guid><author>Brief_</author><pubDate>Thu, 29 Oct 2020 20:05:13 +0800</pubDate><description><![CDATA[hashCode()介绍
hashCode() 的作用是获取哈希码，也称为散列码；它实际上是返回一个 int 整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在 JDK 的 Object.java 中，这就意味着 Java 中的任何类都包含有 hashCode() 函数。
散列表存储的是键值对(key-value)，它的特点是：能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码！（可以快速找到所需要的对象）
为什么有hashCode()
在例如HashMap中会基]]></description><category></category></item><item><title><![CDATA[从HashMap的遍历谈起]]></title><link>https://blog.youkuaiyun.com/Brief_/article/details/109313067</link><guid>https://blog.youkuaiyun.com/Brief_/article/details/109313067</guid><author>Brief_</author><pubDate>Tue, 27 Oct 2020 16:06:14 +0800</pubDate><description><![CDATA[关于HashMap的遍历整理了以上7个主要方法。但每种遍历都有不同的地方。

迭代器遍历EntrySet
迭代器遍历KeySet
增强for循环遍历EntrySet
增强for循环遍历KeySet
map.foreach(…)
map.stream().foreach(…)
map.parallelStream.foreach(…)

速度上看
并发环境下jdk 8 的并行流速度是最快的。因为它将任务细分给多个cpu同时做，但是在数据量小的时候可能会比普通的方式慢些（细分任务耗时大于多任务做）。
迭代器的方]]></description><category></category></item><item><title><![CDATA[二分模板]]></title><link>https://blog.youkuaiyun.com/Brief_/article/details/109255582</link><guid>https://blog.youkuaiyun.com/Brief_/article/details/109255582</guid><author>Brief_</author><pubDate>Sat, 24 Oct 2020 10:39:46 +0800</pubDate><description><![CDATA[{
   	 int num[9] = {1,2,3,3,4,4,5,5,7};//测试数据
   	 int L = 0,R = 8;
   	 int target = 5;

//求小于等于target的最后一个数的下标
   while(L &lt; R) {
      	  int mid = L + R + 1 &gt;&gt; 1;
      	  if(num[mid] &lt;= target) L = mid;
      	  else R = mid - 1;
    }

/.]]></description><category></category></item><item><title><![CDATA[Mysql索引结构]]></title><link>https://blog.youkuaiyun.com/Brief_/article/details/109183618</link><guid>https://blog.youkuaiyun.com/Brief_/article/details/109183618</guid><author>Brief_</author><pubDate>Tue, 20 Oct 2020 16:36:17 +0800</pubDate><description><![CDATA[聚簇索引
B+树本身就是一个目录，或者说本身就是一个索引。
两个特点
1.使用记录主键值的大小进行记录和页的排序，这包括三个方面的含义：

页内的记录是按照主键的大小顺序排成一个单向链表。
各个存放用户记录的页也是根据页中用户记录的主键大小顺序排成一个双向链表。
存放目录项记录的页分为不同的层次，在同一层次中的页也是根据页中目录项记录的主键大小顺序排成一个双向链表。

2.B+树的叶子节点存储的是完整的用户记录。所谓完整的用户记录，就是指这个记录中存储了所有列的值（包括隐藏列）。

根据主键值查找一条用户记]]></description><category></category></item><item><title><![CDATA[Java中的各种容器初始值大小以及深入剖析“为什么”]]></title><link>https://blog.youkuaiyun.com/Brief_/article/details/109159671</link><guid>https://blog.youkuaiyun.com/Brief_/article/details/109159671</guid><author>Brief_</author><pubDate>Mon, 19 Oct 2020 14:06:05 +0800</pubDate><description><![CDATA[JAVA 常用容器初始值大小
1.StringBuffer和StringBuilder初始化默认大小为16个字符
2.HashMap初始化默认大小16，加载因子为0.75，自增为2n.
3.HashTable默认初始值为11，加载因子为0.75，自增为2n+1
4.ArrayList初始化默认值为10，自增为1.5n
5.Vector初始化默认值为10，自增为2n
HashMap为啥负载因子为0.75：提高空间利用率和减少查询成本的折中，主要是泊松分布（离散概率分布），0.75的话大量碰撞概率就已经很低了
]]></description><category></category></item><item><title><![CDATA[Redis中的数据结构]]></title><link>https://blog.youkuaiyun.com/Brief_/article/details/109158866</link><guid>https://blog.youkuaiyun.com/Brief_/article/details/109158866</guid><author>Brief_</author><pubDate>Mon, 19 Oct 2020 13:21:45 +0800</pubDate><description><![CDATA[简单动态字符串（SDS）
struct sdshdr { 
  int len;
  int free; 
  char buf[]; 
};

为啥不使用C语言自带的char？*
1.常数复杂度获取字符串长度
2.不会缓冲区溢出
3.减少字符串修改带来的内存重分配通过未使用的空间字段实现了：

空间预分配：分配更多的内存给新增的字符，避免下次新增时在此分配
惰性空间释放：删除字符时，不会立马收回空间，而是留给下次使用

4.二进制安全 C字符串以空字符串为结尾，所以不能存储图片音频等二进制文件，SDS不是]]></description><category></category></item><item><title><![CDATA[fail-fast 与 fail-safe机制]]></title><link>https://blog.youkuaiyun.com/Brief_/article/details/109039019</link><guid>https://blog.youkuaiyun.com/Brief_/article/details/109039019</guid><author>Brief_</author><pubDate>Mon, 12 Oct 2020 23:11:18 +0800</pubDate><description><![CDATA[是什么：
集合框架中的Collection集合的两种应对并发修改的方法。
fail-fast
fail-fast的字面意思是“快速失败”。当我们在遍历集合元素的时候，经常会使用迭代器，但在迭代器遍历元素的过程中，如果集合的结构被改变的话，就会抛出异常，防止继续遍历。这就是所谓的快速失败机制。
public class Fast_Fail {
    public static void main(String[] args) {
        ArrayList&lt;Integer&gt; list =]]></description><category></category></item><item><title><![CDATA[关于配置视图解析器prefix路径前是否要加“/“的问题]]></title><link>https://blog.youkuaiyun.com/Brief_/article/details/107762331</link><guid>https://blog.youkuaiyun.com/Brief_/article/details/107762331</guid><author>Brief_</author><pubDate>Mon, 03 Aug 2020 14:17:43 +0800</pubDate><description><![CDATA[问题描述：
今天做项目进行测试的时候发现了一个平常没咋注意的现象，当我web项目配置url的地址为多级路径时，如果视图解析器中的prefix配置时没有加"/",那么你之后跳转的页面路径将加上多级路径除去最后一级的路径，而这必然会显示404错误，如下上图：
@Controller
@RequestMapping("/dept")
public class DepartController {

    @RequestMapping("/list")
    public String list(){
   ]]></description><category></category></item><item><title><![CDATA[解决tomcat部署项目中静态页面（html）显示中文乱码]]></title><link>https://blog.youkuaiyun.com/Brief_/article/details/107702573</link><guid>https://blog.youkuaiyun.com/Brief_/article/details/107702573</guid><author>Brief_</author><pubDate>Thu, 30 Jul 2020 23:01:44 +0800</pubDate><description><![CDATA[前言：
tomcat中部署项目中的时候有时候我们会突然遇到中文乱码这种问题，导致这种情况有很多种原因，博主在这里主要分享通过修改tomcat配置来达到解决乱码的目的。注：如果使用jsp的话一般不会产生乱码，如果你做项目很急的话可以先li

...]]></description><category></category></item><item><title><![CDATA[解决idea中maven项目无端显示404错误]]></title><link>https://blog.youkuaiyun.com/Brief_/article/details/107633747</link><guid>https://blog.youkuaiyun.com/Brief_/article/details/107633747</guid><author>Brief_</author><pubDate>Tue, 28 Jul 2020 13:27:11 +0800</pubDate><description><![CDATA[问题描述：
有时我们会发现idea中创建的maven项目老是显示项目路径找不到，自己反复检查代码也没发现错误，如何你项目的web.xml是直接由idea默认创建的，而你的头文件又是后来直接用3.1或者更高的版本（推荐3.1版本）覆盖的原来的头文件，那我这篇博客就对你有帮助了。
问题原因：
当我们idea使用maven创建web项目时，idea默认提供的web.xml非常古老，功能不完善。如果我们只是单纯替换其头文件的话是没有用的，idea中web.xml的配置还是没有变。
如何解决：
1.将原来的web.x]]></description><category></category></item></channel></rss>