<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[wang_shu_mo_ran的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/wang_shu_mo_ran</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; wang_shu_mo_ran]]></copyright><item><title><![CDATA[SpringBoot配置文件详解]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/167586423</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/167586423</guid><author>wang_shu_mo_ran</author><pubDate>Sat, 17 Oct 2026 14:51:15 +0800</pubDate><description><![CDATA[本文从配置文件的作用、快速入手，到properties与yml的语法、读取方式，最后通过一个验证码案例进行综合实践。]]></description><category></category></item><item><title><![CDATA[Spring IoC和DI（二）]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/166736548</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/166736548</guid><author>wang_shu_mo_ran</author><pubDate>Sun, 11 Oct 2026 10:49:44 +0800</pubDate><description><![CDATA[其中BeanFactory提供了基础的访问容器的能力，而ApplicationContext属于BeanFactory的子类，它除了继承了BeanFactory的所有功能外，还添加了对国际化支持、资源访问支持、以及事件传播等方面的支持。也就是让Spring调用这个方法，把它的返回值纳入IoC容器管理，方法只是一个工厂，真正的Bean是方法return出来的那个对象。依赖注入是一个过程，是指IoC容器在创建Bean时，去提供运行时所依赖的资源，而资源指的就是对象。指定当前要注入的Bean对象。]]></description><category></category></item><item><title><![CDATA[Spring IoC和DI概念篇]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/166688964</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/166688964</guid><author>wang_shu_mo_ran</author><pubDate>Sat, 26 Sep 2026 16:49:54 +0800</pubDate><description><![CDATA[Spring：核心框架，提供IoC、DI、AOP等Spring MVC：基于Spring的Web框架Spring Boot ：基于Spring的快速开发整合包。Spring MVC 和Spring Boot都属于Spring ，Spring MVC是基于Spring的一个MVC框架，而Spring Boot是基于Spring的一套快速开发整合包。像之前接触到的        List/Map-->数据存储容器、Tomcat-->Web容器、Spring-->IoC容器。]]></description><category></category></item><item><title><![CDATA[Spring MVC 常用注解和用法（二）——url，cookie，session]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/165870129</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/165870129</guid><author>wang_shu_mo_ran</author><pubDate>Sun, 20 Sep 2026 18:10:26 +0800</pubDate><description><![CDATA[注意：这里必须使用@Controller，不能使用@RestController。否则index.html会被当作数据返回，而不是视图。JSON是一种轻量的数据交互格式，本质是字符串，负责在不同语言中数据传递和交换。如果类中有方法返回页面，有方法返回数据，可以将@ResponseBody加到对应方法上。1.1@PathVariable：获取url中参数。1.2@RequestBody：传递JSON数据。作用在类上：该类中的所有方法返回的都是数据。2.2@ResponseBody：返回数据。]]></description><category></category></item><item><title><![CDATA[Spring MVC的常用注解和用法（一）]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/165120622</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/165120622</guid><author>wang_shu_mo_ran</author><pubDate>Wed, 16 Sep 2026 17:31:37 +0800</pubDate><description><![CDATA[Spring Web MVC是基于Servlet API构建的原始Web框架，从一开始就包含在Spring框架中。MVC：是一种软件架构设计模式；Web框架：用于处理浏览器与Java程序之间的交互。MVC（Model View Controller），把软件系统分为三个基本部分：View（视图）：与浏览器交互，展示数据。Model（模型）：处理业务逻辑和数据Cotroller（控制器）：接收请求，选择模型处理，并决定返回哪个视图这是MVC的定义。]]></description><category></category></item><item><title><![CDATA[网络编程（二）：UDP数据报在客户端与服务端之间的传输]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/162700268</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/162700268</guid><author>wang_shu_mo_ran</author><pubDate>Sat, 11 Jul 2026 22:24:52 +0800</pubDate><description><![CDATA[发送一个数据报，该方法不会阻塞，直接发送若网卡队列满，可能丢包。]]></description><category></category></item><item><title><![CDATA[网络编程（一）：网络编程初识]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/162664151</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/162664151</guid><author>wang_shu_mo_ran</author><pubDate>Tue, 07 Jul 2026 15:51:45 +0800</pubDate><description><![CDATA[Socket是操作系统提供的一组用于网络通信的编程接口。它封装了TCP/IP协议栈的细节，让我们可以通过简单的函数调用来发送和接收数据。在Java中，java.net包提供了Socket相关的类，我们无需关心底层协议实现，直接使用即可。]]></description><category></category></item><item><title><![CDATA[Java网络原理初识——原理、分层模型与一次HTTP请求的全链路]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/162150469</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/162150469</guid><author>wang_shu_mo_ran</author><pubDate>Sat, 20 Jun 2026 21:16:25 +0800</pubDate><description><![CDATA[封装：应用数据自上而下，每层加一个头部。数据——>段（TCP头+数据）——>数据报（IP头+段）——>帧（MAC头+数据报+帧尾）。分用：自上而下，每层剥掉对应的头部，根据头部中的“类型/协议”字段，将载荷交给正确的上层模块。]]></description><category></category></item><item><title><![CDATA[Java文件操作和IO（三）——深入理解数据流与文件内容读写]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/162118279</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/162118279</guid><author>wang_shu_mo_ran</author><pubDate>Fri, 19 Jun 2026 12:52:43 +0800</pubDate><description><![CDATA[例如，中文字符在UTF-8中可能占3个字节，若用字节流著俄国字节读取，无法得到正确的字符。Java提供了字符流（Reader/Writer），它们以字符（16-bit Unicode）为单位，自动处理字节与字符之间额转换，前提是必须指定正确的字符集。当你调用write时，数据往往没有真正写在硬盘或网络上，而是被放在了缓冲区，只有缓冲区满了或者流被关闭了，数据才会真正被flush到目标设备上。Java将所有的I/O抽象为流，无论数据源是文件、内存、网络还是其他设备，开发者都可以使用统一的API进行读写。]]></description><category></category></item><item><title><![CDATA[Java文件操作和IO（二）——File类]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/162074813</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/162074813</guid><author>wang_shu_mo_ran</author><pubDate>Wed, 17 Jun 2026 20:46:37 +0800</pubDate><description><![CDATA[java.io.File是一个抽象路径表示。它既可以表示一个文件，可以代表一个目录，甚至可以代表一个不存在的路径。File对象仅仅是对路径的封装，它的创建不会在磁盘上产生任何文件，真正的文件操作需要调用对应的方法才会触发。]]></description><category></category></item><item><title><![CDATA[Java文件操作和IO（一）：文件的基础概念]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/162045567</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/162045567</guid><author>wang_shu_mo_ran</author><pubDate>Tue, 16 Jun 2026 21:46:20 +0800</pubDate><description><![CDATA[当我们谈论计算机中的文件时，实际上是在讨论一种逻辑抽象。物理层面，我们的数据存储在硬盘、固态硬盘等持久化设备上，这些设备以扇形、块为单位存储二进制数据。如果直接面向这些物理地址，用户和程序都将寸步难行。于是操作系统引入文件这个概念，将分散的存储块组织成一个独立的单位，就像办公桌上的一份份纸质文件。每个文件拥有自己的内容和标签，用户可以按名称访问，而无序关心它具体在磁盘的哪个磁道上。]]></description><category></category></item><item><title><![CDATA[多线程初阶（四）：单例、阻塞队列、定时器、线程池]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/161983134</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/161983134</guid><author>wang_shu_mo_ran</author><pubDate>Mon, 15 Jun 2026 20:53:55 +0800</pubDate><description><![CDATA[通过前面学习，最后我们来梳理一下保证线程安全地整体思路。]]></description><category></category></item><item><title><![CDATA[Java多线程初阶（三）——线程安全问题以及synchronized与voltile如何解决线程安全]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/161971375</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/161971375</guid><author>wang_shu_mo_ran</author><pubDate>Sun, 14 Jun 2026 13:14:24 +0800</pubDate><description><![CDATA[在之前文章中，我们学会了如何创建线程、使用Thread的核心方法以及线程的生命周期。但是，当我们真正让多个线程同时操作同一个共享变量时，问题来了——两个线程各自加50000次，结果却不是100000？这是经典的线程安全问题。今天这篇文章，从这个问题出发，一步步分析原因，然后介绍synchronized和volatile的应用。目录前言一、问题现场——一个进店的线程不完全案例二、线程安全的三大原因2.1.原子性被破坏2.2.内存可见性问题——Java内存模型（JMM）2.3指令重排序。]]></description><category></category></item><item><title><![CDATA[Java多线程初阶（二）：核心方法与生命周期]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/161928051</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/161928051</guid><author>wang_shu_mo_ran</author><pubDate>Sun, 14 Jun 2026 09:41:33 +0800</pubDate><description><![CDATA[1.isAlive()返回true当线程状态未RUNABLE、BLOCKED、WAITING、TIMED_WAITING。WAITING ←── notify/notifyAll/线程结束 ──→ RUNNABLE。2.线程正在运行，仅设置中断标志，需要线程自己检查isInterrupted()并退出。注意：interrupted()是静态方法，判断当前线程是否是中断，且清除标志位；4.interrupt()——中断线程。│ wait() / join() (无超时)2.join()——等待线程结束。]]></description><category></category></item><item><title><![CDATA[Java多线程初阶（一）：认识线程、创建方式]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/161865225</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/161865225</guid><author>wang_shu_mo_ran</author><pubDate>Wed, 10 Jun 2026 19:40:12 +0800</pubDate><description><![CDATA[线程是程序中的一条执行路径，可以理解为“一个独立干活的人”。一个进程可以包含多个线程，这些线程并发地执行不同任务。]]></description><category></category></item><item><title><![CDATA[计算机是如何工作的]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/161849905</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/161849905</guid><author>wang_shu_mo_ran</author><pubDate>Wed, 10 Jun 2026 13:43:26 +0800</pubDate><description><![CDATA[现在回头看，一个简单的System.out.println("Hello")经历了什么？1.编写Java源代码2.Javac编译成字节码3.JVM加载字节码，解释/JIT编译成机器指令4.操作系统创建进程，分配内存，建立页表5.CPU的PC指向第一条指令6.控制单元取指令、译码7.ALU执行计算8.写回到显存9.时钟终端可能发生，操作系统切换进程10最终，显示器出现你想要的输出。]]></description><category></category></item><item><title><![CDATA[Java数据结构——Map&Set]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/161725242</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/161725242</guid><author>wang_shu_mo_ran</author><pubDate>Sun, 07 Jun 2026 15:04:13 +0800</pubDate><description><![CDATA[二叉搜索树（Binary Search Tree）满足：1.若左子树不为空，那左子树上所有节点的值都小于根节点的值2.若右子树不为空，则右子树上所有节点的值都大于根节点的值3.左右子树本身也是一个二叉搜索树中序遍历可以得到一个递增序列哈希表（Hash Table）是一种通过哈希函数将键映射到数组中某个位置。从而实现快速存取的数据结构。理想情况下，插入、删除、查找的时间复杂度都是O(1)。在HashMap中，判断两个Key是否相等的逻辑是：1.先比较hashCode是否相等。]]></description><category></category></item><item><title><![CDATA[Java——从插入排序到归并排序]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/161557795</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/161557795</guid><author>wang_shu_mo_ran</author><pubDate>Sun, 31 May 2026 12:58:20 +0800</pubDate><description><![CDATA[本文将详细介绍七大排序插入排序：直接插入排序，希尔排序选择排序：直接选择排序，堆排序交换排序：冒泡排序，快速排序归并排序此外，还会拓展介绍非比较排序（计数排序，基数排序，桶排序），分析各算法的时间复杂度，空间复杂度与稳定性。排序：是将一串记录（或数据元素）按照某个或某些关键字的大小，递增（升序）或递减（降序）排列的操作。]]></description><category></category></item><item><title><![CDATA[Java数据结构——优先级队列]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/161545025</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/161545025</guid><author>wang_shu_mo_ran</author><pubDate>Sat, 30 May 2026 19:42:00 +0800</pubDate><description><![CDATA[优先级队列是一种特殊的队列，它支持两种核心操作：1.返回最高优先级对象2.插入新的对象与普通队列不同，优先级队列不是先进先出，而是高优先级的先出。如果优先级相同，则通常按插入顺序或元素自然顺序决定对于集合K={……}，将其按完全二叉树的顺序存储在一维数组中。小根堆：任意节点Ki<=K2i+1且Ki<=K2i+2大根堆：任意节点KI>=K2i+1且Ki>=K2i+2堆的两个重要性质：堆中的某个节点的值总是不大于（或不小于）其父节点的值。堆总是一个完全二叉树。]]></description><category></category></item><item><title><![CDATA[Java数据结构——二叉树（一）]]></title><link>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/161399110</link><guid>https://blog.youkuaiyun.com/wang_shu_mo_ran/article/details/161399110</guid><author>wang_shu_mo_ran</author><pubDate>Tue, 26 May 2026 21:05:38 +0800</pubDate><description><![CDATA[树是由n个有限节点组成的层次关系的集合。当n=0时称为空树。树的特点：有一个特殊的节点称为根节点，根节点没有前驱。除根节点外，其余节点被分成M个不相交的集合，每个集合又是一个子树。每个子树的根节点有且只有一个父节点，可以有0个或多个子节点。子树直接不能有交集，否则就不是树二叉树是n个节点的有限集合：可以是空树（n=0）或者由一个根节点和两棵互不相交的左子树，右子树组成，左，右子树本身也是二叉树。二叉树的特点：每个节点最多有两个子节点（度<=2）。]]></description><category></category></item></channel></rss>