风起小岛,把一片浅海留在此刻
继雨夜便利店之后,博客里又多了一处可以停留的小地方。这一次,街角的雨声换成了浅海,暖黄色的灯光换成了沙滩上的日光。
它叫「风起小岛」。一块沙滩、几棵椰树、石头和珊瑚,被装进一个透明的方形容器。你可以从不同的角度看它,也可以轻轻摇晃,让海水追着容器的动作慢半拍,再慢慢平静下来。
去岛上坐坐 →
它没有任务,也没有需要完成的进度。绕着小岛看一圈,点一下海面,或者观察水波碰到边界后的回响,就已经是一小段完整的停留。
进入后有三种操作方式:
随心:拖动背景可以环游,拖动容器侧面可以轻摇;点击海面会点起涟漪,在水上拖动可以连续拨动海水。
环游:在任何位置拖动,都用来旋转视角,适合慢慢看看岛上的细节。
轻摇:在任何位置拖动,都用来轻摇容器;松手后,小岛会自然回正,海水还会继续晃一会儿。
鼠标右键拖动始终可以旋转视角,滚轮可以缩放,按住 Shift 拖动可以直接摇晃。想重新开始时,点击重置按钮,或按一下 R。触屏上可以单指拖动,也可以双指缩放。
进入前可以选择「轻盈」「均衡」或「细腻」画质,默认是均衡。设备运行较慢时,可以先选轻盈;细腻档会增加水面分辨率和画面开销。进入后也能在设置里调整水波 ...
把雨夜便利店,放进博客里
这次给博客添了一个有点特别的地方:一间雨夜里的日系便利店。
之前做这个场景时,我想留下的就是那种感觉——夜已经很深,路面被雨水打湿,街角却还有一小片暖光。路过的人可以暂时停下,看看橱窗,绕着店铺走一走,不必急着去哪里。
现在,我把它搬进了博客。以前文章里放的是文字和图片,这次也想留下一处可以亲自走进去的空间。它没有复杂的任务,也不用追赶进度;换一个角度看看店铺,或者在街角待一会儿,就是这趟散步的全部内容。
→ 进入雨夜便利店
进入前可以选择「流畅」或「精致」画质。第一次来,建议先选流畅;电脑上浏览会更舒服。场景支持旋转、缩放,也可以切换到探索模式,具体按键请看画面中的提示。想结束散步时,点击左上角「退出场景」,就能回到入口。
以后有新的小作品,我也会继续放进博客的「作品」页面。文章记录想法,场景留住气氛。希望这间小店,能给偶然路过这里的你,留下一点雨夜里的温暖。
博客交给 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为 ...








