<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[buttterfly的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/buttterfly</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; buttterfly]]></copyright><item><title><![CDATA[Java学习路线（1.搭环境）]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/125703283</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/125703283</guid><author>buttterfly</author><pubDate>Sun, 10 Jul 2022 11:05:46 +0800</pubDate><description><![CDATA[Java环境搭建]]></description><category></category></item><item><title><![CDATA[锁（想办法避免线程进入内核态的阻塞状态是分析和理解锁设计的关键）]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/123732903</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/123732903</guid><author>buttterfly</author><pubDate>Fri, 25 Mar 2022 12:51:00 +0800</pubDate><description><![CDATA[锁（想办法避免线程进入内核态的阻塞状态是分析和理解锁设计的关键）
悲观锁
实例对象

对象头（占用内存大小与虚拟机位长一致，32位JVM -&gt; MarkWord是32位，64位JVM -&gt; MarkWord是64位）

类型指针：方法区地址，指向当前对象类型所在方法区中的类型信息，表明是哪个类的实例对象
MarkWord：hashcode值，锁相关信息，分代信息

1.6对锁的优化

无锁（检查对象头中是否存储了线程ID，若没有，CAS替换MarkWord将自己的线程ID存储在对象头中，无锁升级]]></description><category></category></item><item><title><![CDATA[为什么wait方法必须在同步（synchronized）代码块方法中调用]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/123708659</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/123708659</guid><author>buttterfly</author><pubDate>Thu, 24 Mar 2022 13:22:53 +0800</pubDate><description><![CDATA[为什么wait方法必须在同步（synchronized）代码块/方法中调用
调用wait就是释放锁，释放锁的前提是必须先获得锁，先获得锁才能释放锁。
为什么notify，notifyall必须在同步（synchronized）代码块/方法中调用
notify，notifyall是让入口队列中的线程竞争锁，如果自身没有锁，怎么能让入口队列中的线程竞争锁呢。
wait后的代码会执行
class BlockingQueue {
    Queue&lt;String&gt; buffer = new Linked]]></description><category></category></item><item><title><![CDATA[浅谈hashcode与equals]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/123594591</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/123594591</guid><author>buttterfly</author><pubDate>Sat, 19 Mar 2022 14:34:22 +0800</pubDate><description><![CDATA[浅谈hashcode与equals
基本类型
基本类型封装类型的hashcode方法重写为直接输出该基本类型的值，基本类型无hashcode方法
引用类型
每个引用类型会重写hashcode方法，得到一个int整数
object类型
顶层类的hashcode方法是一个native方法，标志这个方法是一个本地方法。
重点
hashcode()会返回int类型的哈希码，使用不同的哈希函数所得到的哈希码也是不一样的。
和equals的联合使用，主要使用在SET，MAP中。
存取元素时，加快效率，首先使用哈希函数，]]></description><category></category></item><item><title><![CDATA[Java中抽象类和接口的区别]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/123591375</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/123591375</guid><author>buttterfly</author><pubDate>Sat, 19 Mar 2022 11:26:19 +0800</pubDate><description><![CDATA[Java中抽象类和接口的区别
抽象类
包含抽象方法的一定是抽象类，但抽象类中不一定有抽象方法。抽象类只能被继承，不能被实例化。
接口
接口是一个抽象类型，是抽象方法的集合，不能被实例化
相同点

接口和抽象类都不能够被实例化
抽象类和接口都可以定义抽象方法，子类和实现类必须对这些抽象方法重写

不同点


抽象类有构造方法，主要用于子类实例化的时候，接口没有构造方法


抽象类中可以包含普通方法，接口在1.8以前只能定义抽象方法


抽象类只能单继承，而接口可以多继承


变量：抽象类中可以定义各种类型的成]]></description><category></category></item><item><title><![CDATA[static与final关键字在Java中的使用]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/123590965</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/123590965</guid><author>buttterfly</author><pubDate>Sat, 19 Mar 2022 11:05:05 +0800</pubDate><description><![CDATA[static与final关键字在Java中的使用


修饰类


static修饰类

static修饰类的时候只有一种情况，那就是静态内部类。



final修饰类

final修饰类表示这个类是不可以被继承的，





修饰方法


static修饰方法

static方法的时候，标志这个方法是一个静态方法，随着类的加载而加载



final修饰方法

final修饰方法的时候，表示这个方法不能够被重写，在早期，还用来提升方法的运行效率，内嵌调用





修饰变量


final修饰变量

修饰]]></description><category></category></item><item><title><![CDATA[Java代码块执行顺序]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/122014577</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/122014577</guid><author>buttterfly</author><pubDate>Sat, 18 Dec 2021 17:16:36 +0800</pubDate><description><![CDATA[单类


静态代码块-》普通代码块-》构造方法


public class Person {
    static {
        System.out.println("静态代码块");
    }
    {
        System.out.println("普通代码块");
    }

    public Person() {
        System.out.println("构造方法");
    }

    public static void main(String[..]]></description><category></category></item><item><title><![CDATA[Java中类的生命周期]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/119605599</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/119605599</guid><author>buttterfly</author><pubDate>Wed, 11 Aug 2021 14:30:24 +0800</pubDate><description><![CDATA[大的流程
类加载-》使用-》卸载
加载-》连接-》初始化-》使用-》卸载
加载-》验证-》准备-》解析-》初始化-》使用-》卸载

加载的过程（过程使用类加载器进行加载）

会根据类的全限定名找到定义这个类的二进制字节流，即.class文件。
2.将字节流代表的静态存储结构转化成方法区的运行时数据结构
3.在内存中生成一个代表该类的Class对象，作为方法区这些数据的访问入口

虚拟机规范上面这 3 点并不具体，因此是非常灵活的。比如：“通过全类名获取定义此类的二进制字节流” 并没有指明具体从哪里获取、怎.]]></description><category></category></item><item><title><![CDATA[如何得出字符串中一共有多少个不同的字符]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/108998042</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/108998042</guid><author>buttterfly</author><pubDate>Sat, 10 Oct 2020 16:10:54 +0800</pubDate><description><![CDATA[双层for循环，很low
int count=0;
        for (int i=0;i&lt;s.length();i++){
            int j=0;
            for ( j=0;j&lt;i;j++){
                if (c[j]==c[i]){
                    break;
                }
            }
            if (j==i){
                ]]></description><category></category></item><item><title><![CDATA[springboot集成mybatis踩坑]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/108210210</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/108210210</guid><author>buttterfly</author><pubDate>Mon, 24 Aug 2020 22:27:18 +0800</pubDate><description><![CDATA[在spring boot里集成mybatis的时候，当你的mysqlb版本过低又引用较高的驱动jar包是可能会遇到以下错误
Cause: org.springframework.jdbc.CannotGetJdbcConnectionException
我的MySQL版本是5.1.49，引用驱动jar包是8.0.21
然后引用低版本的jar包，问题解决

...]]></description><category></category></item><item><title><![CDATA[关于在jsp中无法采用el表达式获取值]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/108181910</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/108181910</guid><author>buttterfly</author><pubDate>Sun, 23 Aug 2020 12:58:42 +0800</pubDate><description><![CDATA[方法一：在jsp页面中加上
&lt;%@ page isELIgnored=“false” %&gt;（实测可用）
其他方法：
方法二
web.xml中加上，简单，但是还不是好的解决办法。
&lt;jsp-config&gt;  
    &lt;jsp-property-group&gt;  
        &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;  
        &lt;el-ignored&gt;false&lt;/el-ignored&gt;  ]]></description><category></category></item><item><title><![CDATA[错误java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/108172061</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/108172061</guid><author>buttterfly</author><pubDate>Sat, 22 Aug 2020 17:59:37 +0800</pubDate><description><![CDATA[原因：没有将jar导出到lib中
解决办法

File &gt; Project Structure &gt; Artifacts &gt; 在右侧Output Layout右击项目名，选择Put into Output Root,见下面截图：

执行后，在WEB-INF在增加了lib目录，里面是项目引用的jar包，点击OK。

重启项目就可以啦

...]]></description><category></category></item><item><title><![CDATA[javaweb部署到服务器踩坑]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/108071703</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/108071703</guid><author>buttterfly</author><pubDate>Tue, 18 Aug 2020 10:42:47 +0800</pubDate><description><![CDATA[1.在服务器上安装jdk,tomcat,mysql(好像也可以使用远程数据库）
2.将本地的数据库文件导出成sql文件，在服务器端使用source命令导入。
3.将项目打war包发送到服务器，我就是这一步搞了好大的坑，
首先，maven的命令是用不了，maven的artifactId，不能是中文，这一步卡了不少时间。
第二，在打包之前，你得运行自己的项目，我之前就是测试maven的时候，用maven clean搞的classes下的资源文件没有了，部署到服务器的时候就会有空指针异常。
最后，我把已经有资源文]]></description><category></category></item><item><title><![CDATA[maven踩坑]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/108070775</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/108070775</guid><author>buttterfly</author><pubDate>Tue, 18 Aug 2020 10:02:20 +0800</pubDate><description><![CDATA[maven的artifactId项不能有中文，可以是大写字母和小写字母，


]]></description><category></category></item><item><title><![CDATA[IDEA中导入javaweb项目]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/108064366</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/108064366</guid><author>buttterfly</author><pubDate>Mon, 17 Aug 2020 21:06:58 +0800</pubDate><description><![CDATA[1.导入项目或者打开项目（我用的是打开项目）
2.在工程结构里修改相关选项
1.在Project项中配置JDK版本和编译等级

2.在Modules项的Sources标签页中配置项目结构（主要配置需编译的Java文件和配置文件

3.在Modules项的Paths标签页中配置编译后文件输出路径
*******主要修改的就是这一项，idea默认目录是web,修改为webapp,

4.在Artifacts项中设置项目的部署配置,添加WebApplication:Exploded.
转成tomcat可以部署的格]]></description><category></category></item><item><title><![CDATA[记录一下遇到的错误，在监听器中实例业务层对象，调用业务层方法，出现错误]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/107997712</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/107997712</guid><author>buttterfly</author><pubDate>Fri, 14 Aug 2020 09:41:07 +0800</pubDate><description><![CDATA[八月 14, 2020 9:38:09 上午 org.apache.catalina.core.StandardContext listenerStart
严重: 异常将上下文初始化事件发送到类的侦听器实例.[com.jiabin.crm.web.listener.SysInitListener]
java.lang.ExceptionInInitializerError
at com.jiabin.crm.settings.service.impl.DicServiceImpl.(DicServiceIm]]></description><category></category></item><item><title><![CDATA[无重复字符的最长字串]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/107606815</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/107606815</guid><author>buttterfly</author><pubDate>Mon, 27 Jul 2020 11:37:04 +0800</pubDate><description><![CDATA[使用队列实现
队列是先进先出的，先判断队列中是否有当前字符，如果有，队头出队，知道队列中没有重复元素，并将每次队列中的元素存在一个变量中，如果大于之前的值，就赋值给变量，最后，判断变量和队列长度，大的即为无重复字符的最长子串。
public class lengthOfLongestSubstring {
    /**
     * 找出一个字符串中最长的没有重复元素的字串，返回子串长度
     */
    public static void main(String[] args) {
      ]]></description><category></category></item><item><title><![CDATA[IDEA遇到的问题总结]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/107597897</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/107597897</guid><author>buttterfly</author><pubDate>Sun, 26 Jul 2020 19:03:29 +0800</pubDate><description><![CDATA[1.包名不能够层级显示

2. project下项目结构消失
1）关闭IDEA，
2）删除项目文件夹下的.idea文件夹
3）重新用IDEA工具打开项目
（具体原因未知）

]]></description><category></category></item><item><title><![CDATA[Java数组拷贝及遍历总结]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/107587092</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/107587092</guid><author>buttterfly</author><pubDate>Sat, 25 Jul 2020 23:33:00 +0800</pubDate><description><![CDATA[public class ArrayCopy {
    public static void main(String[] args) {
        int[] source={1,5,6,8,4,5,2,565,56};
        int[] target=new int[source.length];
        //数组的拷贝
        //1. 通过遍历赋值拷贝数组
        for(int i=0;i&lt;source.length;i++){
           ]]></description><category></category></item><item><title><![CDATA[Java--用队列实现栈的基本功能]]></title><link>https://blog.youkuaiyun.com/buttterfly/article/details/107550062</link><guid>https://blog.youkuaiyun.com/buttterfly/article/details/107550062</guid><author>buttterfly</author><pubDate>Thu, 23 Jul 2020 23:10:51 +0800</pubDate><description><![CDATA[队列（Queue)是先进先出的一种数据结构。
Queue接口与List、Set同一级别，都是继承了Collection接口。LinkedList实现了Queue接口。
首先，将队列作为自己的属性。
class MyStack {

    Queue&lt;Integer&gt; queue;

    /**
     * Initialize your data structure here.
     */
    public MyStack() {
        queue = new Link]]></description><category></category></item></channel></rss>