把雨夜便利店,放进博客里
这次给博客添了一个有点特别的地方:一间雨夜里的日系便利店。
之前做这个场景时,我想留下的就是那种感觉——夜已经很深,路面被雨水打湿,街角却还有一小片暖光。路过的人可以暂时停下,看看橱窗,绕着店铺走一走,不必急着去哪里。
现在,我把它搬进了博客。以前文章里放的是文字和图片,这次也想留下一处可以亲自走进去的空间。它没有复杂的任务,也不用追赶进度;换一个角度看看店铺,或者在街角待一会儿,就是这趟散步的全部内容。
→ 进入雨夜便利店
进入前可以选择「流畅」或「精致」画质。第一次来,建议先选流畅;电脑上浏览会更舒服。场景支持旋转、缩放,也可以切换到探索模式,具体按键请看画面中的提示。想结束散步时,点击左上角「退出场景」,就能回到入口。
以后有新的小作品,我也会继续放进博客的「作品」页面。文章记录想法,场景留住气氛。希望这间小店,能给偶然路过这里的你,留下一点雨夜里的温暖。
博客交给 Codex 打理了
隔了一段时间,我把「格 致」的源文件重新找了回来,也终于准备继续往这里写东西了。以前搭博客时折腾过 Hexo、主题和部署,时间一长,很多细节都忘得差不多。再次打开项目,得先弄清依赖是否齐全、配置是否还有效,以及文章究竟该从哪里开始写。
这次重新整理,我找了一个帮手:Codex。
从今天开始,博客的日常维护会交给 Codex 协助处理,包括检查配置、整理文章、调整格式,以及生成发布前的静态页面。网站继续托管在 GitHub Pages,地址还是 gllxgllx.github.io。大家打开的仍然是这个熟悉的小站,只是维护它的方式有了一点变化。
对我来说,这样安排最直接的好处,是重新开始写文章时少一些阻力。有时想记录一个问题,却会先被环境、命令和零散的配置打断。有了 Codex 帮忙,我可以先把思路写下来,再一起把标题、段落和代码块整理清楚。遇到构建问题,也能顺着报错检查原因,把需要修的地方处理好。
文章里的经历、判断和观点,仍然由我负责。我会检查整理后的内容,确认代码和描述符合自己的意思,再决定是否发布。Codex 参与维护,也需要我保留对内容的判断;这个博客最终记录的,还是我自己的学 ...
常用方法
以下是 Java 中 String、List、Map 和 Set 的常用方法总结:
1. String 常用方法构造方法• String() 创建一个空字符串。• String(String original) 根据指定字符串创建新字符串。• String(char[] value) 根据字符数组创建新字符串。
常用方法查询和比较• int length() 返回字符串的长度。• boolean isEmpty() 判断字符串是否为空。• boolean equals(Object anObject) 比较字符串内容是否相等。• boolean equalsIgnoreCase(String anotherString) 忽略大小写比较字符串内容。• int compareTo(String anotherString) 按字典顺序比较字符串。• int compareToIgnoreCase(String str) 忽略大小写按字典顺序比较字符串。
查找和截取• char charAt(int index) 返回指定索引处的字符。• int indexOf(St ...
数据机构java案例
一、数组(Array)与集合(Collection)的转换1. 数组 → 集合• 固定大小 List(不可增删): Integer[] arr = {1, 2, 3};List<Integer> list = Arrays.asList(arr); // 注意:list 是 Arrays 内部类,不能增删元素• 可变 List(推荐): List<Integer> list = new ArrayList<>(Arrays.asList(arr)); // 可增删
• 基本类型数组(需手动转换): int[] arr = {1, 2, 3};List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList()); // Java 8+
2. 集合 → 数组• List → 数组: List<Integer> list = new ArrayList<>();Integer[] arr ...
数据结构java
一、数据结构与核心操作1. 数组(Array)• 核心操作: • 遍历:for (int num : arr) { ... } • 快速访问:arr[i](时间复杂度 O(1)) • 长度:arr.length • 排序:Arrays.sort(arr)(快排,O(n log n)) • 二分查找:Arrays.binarySearch(arr, key)(需先排序)
2. 字符串(String)• 核心方法: • 长度:s.length() • 转字符数组:s.toCharArray()(便于修改字符) • 截取子串:s.substring(start, end) • 分割:s.split(regex) • 拼接:用 StringBuilder(避免频繁创建 String 对象)
3. 动态数组(ArrayList)• 核心方法: • 添加元素:list.add(element)(尾部 O(1),中间 O(n)) • 获取元素:list.get(index)(O(1)) • 删除元素:list.remove(index)(O(n)) ...
高频八股总结4
系统调用过程系统调用是用户程序与操作系统内核交互的核心机制,其过程可分为以下步骤:
一、基本流程
用户程序发起调用用户程序通过标准库(如glibc)调用系统调用封装函数(如open()、read())。
参数准备• 将系统调用号(如SYS_open)存入指定寄存器(如x86的EAX)。• 参数按顺序存入其他寄存器(如x86的EBX、ECX、EDX)。
触发模式切换• 通过软中断(x86的int 0x80)或专用指令(x86-64的syscall)切换到内核态。
内核处理• 中断向量表跳转到系统调用入口(如system_call函数)。• 根据系统调用号查找内核的sys_call_table,执行对应服务例程(如sys_open)。
执行内核操作• 执行权限检查(如文件访问权限)。• 完成请求操作(如打开文件、分配内存)。
返回用户空间• 将结果存入指定寄存器(如EAX)。• 通过iret或sysret指令切换回用户态。
二、关键细节1. 系统调用号• 作用:唯一标识内核服务(如Linux中SYS_read=0, SYS_write=1)。• 映射方式:内核维护系统调用 ...
高频八股总结3
进程和线程进程与线程的对比解析1. 定义与核心区别• 进程:是操作系统进行资源分配的最小单位。每个进程拥有独立的内存空间(代码段、数据段、堆栈等)和系统资源(如文件句柄、CPU时间片),进程之间相互隔离,一个进程崩溃不会直接影响其他进程。• 线程:是CPU调度的最小单位,属于进程的一部分。同一进程内的多个线程共享进程的内存和资源(如全局变量、文件描述符),但每个线程拥有独立的栈空间和寄存器状态。
2. 资源分配与隔离性• 进程: • 资源隔离性强,进程间通信需通过IPC机制(如管道、共享内存、消息队列等)。 • 创建和切换成本高,涉及独立地址空间的分配和上下文保存。• 线程: • 共享进程资源,通信可直接读写共享内存,效率更高。 • 创建和切换开销小,仅需保存线程的栈和寄存器状态。
3. 执行与调度• 进程:由操作系统内核调度,采用抢占式策略(如分时调度)。• 线程: • 调度可由用户程序控制(协作式调度)或由内核控制(抢占式调度)。 • 同一进程内的线程并发执行,适合处理I/O密集型任务或高并发场景。
4. 稳定性与容错性• 进程:崩溃后不影响其他进 ...
高频八股总结2
TCP和UDP的区别TCP(Transmission Control Protocol) 和 UDP(User Datagram Protocol) 是两种常用的传输层协议,它们在数据传输方式、可靠性和适用场景等方面有显著区别。以下是它们的详细对比:
1. 连接方式• TCP: • 面向连接,需要先建立连接(三次握手),再传输数据,传输完成后断开连接(四次挥手)。 • 适用于需要可靠传输的场景。• UDP: • 无连接,直接发送数据,不需要建立连接。 • 适用于对实时性要求高的场景。
2. 可靠性• TCP: • 提供可靠的数据传输,通过确认机制、重传机制、流量控制和拥塞控制确保数据不丢失、不重复、按序到达。 • 适用于对数据完整性要求高的场景,如文件传输、邮件发送等。• UDP: • 不保证可靠性,数据可能丢失、重复或乱序。 • 适用于对实时性要求高、允许少量数据丢失的场景,如视频流、在线游戏等。
3. 数据传输方式• TCP: • 基于字节流,将数据分成多个数据包按序传输,接收端按序重组。 • 适合传输大量数据。• UDP: • 基于数据报,每个数据包独 ...
高频八股总结1
线程池的原理,核心线程与非核心线程的区别?线程池是一种多线程处理形式,其核心思想是预先创建一定数量的线程,这些线程存放在一个“池”里,当有任务提交时,就从池中选取一个空闲线程来执行任务。执行完毕后,线程并不会销毁,而是回到池中等待下一次的任务。线程池的好处在于减少在创建和销毁线程上所花的时间和资源消耗,提高了程序响应速度和并发量。
线程池的原理
任务提交:当有任务提交到线程池时,线程池会首先检查核心线程是否都在执行任务。如果核心线程有空闲,则直接使用核心线程执行任务;如果核心线程都在忙,则将任务放入任务队列中等待。
任务队列:如果任务队列未满,任务会被放入队列中等待执行;如果任务队列已满,线程池会检查当前线程数是否小于最大线程数。如果小于,则创建非核心线程执行任务;如果已达到最大线程数,则根据拒绝策略处理任务。
线程复用:线程执行完任务后,会继续从任务队列中获取新的任务执行,而不是销毁。这样可以避免频繁创建和销毁线程的开销。
线程回收:非核心线程在空闲超过一定时间(keepAliveTime)后会被回收,而核心线程默认会一直存活,除非设置了allowCoreThreadTimeOut为 ...
项目分布式Session知识点拷打
技术点拆解:分布式Session(Redis + Hash)以下是对该技术点的详细拆解,帮助你应对面试中的深度追问:
1. 核心实现原理技术要点:• 传统Session的问题: • 单机Session:集群环境下用户请求可能路由到不同服务节点,导致登录态丢失。 • Session复制:同步开销大(如Tomcat Session Replication),性能差。• Redis分布式Session方案: • 用户登录后生成唯一Token(如JWT),Token作为Key,用户信息作为Value存入Redis。 • 每次请求通过Token从Redis获取用户信息,实现无状态会话。• Hash结构优化: • String存储:SET session:token1 '{"userId":1,"name":"Alice"}' → 内存占用高,修改需全量更新。 • Hash存储:HSET session:token1 userId 1 name Alice → 支持字段级读写,内存更省(z ...








