- 博客(80)
- 收藏
- 关注
原创 运行时系统
在计算机编程中,运行时系统是既存在于创建程序的计算机中,也存在于打算运行程序的计算机中的子系统。大多数编程语言都有某种形式的运行时系统,提供程序运行的环境。该环境可以解决很多问题,包括应用程序内存的管理、程序如何访问变量、在函数之间传递参数的机制、与操作系统的接口等等。编译器根据特定的运行时系统做出假设以生成正确的代码。通常,运行时系统将负责管理堆和栈,并且可能包括垃圾回收、线程或语言中内置的其它动态特性等特性。每种编程语言都指定了一个执行模型,并且许多语言在运行时系统中至少实现了该模型的一部分。运行时系统
2022-06-26 19:00:44
1262
原创 Rust Vec 源码分析
Vec 内存大小 24 字节,包括一个指向堆上的 ptr,一个 cap,一个 len,每个都是 8 字节大小的 u64。2 扩容以 2 的 n 次幂的方式进行扩容,在第一次扩容的时候会有些特殊 (一个小优化)。
2022-06-12 13:34:18
567
原创 Rust HashMap 源码分析
Rust HashMap 源码分析1 HashMap 数据结构1 HashMap 数据结构use hashbrown::hash_map as base;#[derive(Clone)]pub struct RandomState { k0: u64, k1: u64,}pub struct HashMap<K, V, S = RandomState> { base: base::HashMap<K, V, S>,}HashMap 有三个
2022-06-03 18:13:07
1753
原创 Rust impl Trait和dyn Trait
impl Trait:静态分发dyn Trait:动态分发静态分发:在编译期就确定了具体返回类型,函数只能返回一种类型。动态分发:在运行时才能确定具体返回类型,函数可以返回多种类型。Trait Object:指向trait的指针,假设Animal是一个triait,那么&Animal和Box<Animal>都是一种Trait Object。胖指针:用于指代动态大小类型(DST)的引用和原始指针(切片或特征对象)。胖指针包含一个指针以及一些使DST完成(例如长度)的信息。示例代
2022-03-22 17:38:11
1889
原创 Mac终端美化 iTerm2+oh-my-zsh
效果图:iTerm2下载:官网:https://iterm2.combrew:brew cask install iterm2oh-my-zsh下载:$ sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"下载完成后,将~/.zshrc中的ZSH_THEME="agnoster"中的ZSH_THEME改成你想要的主题就可以了,主题在/Users/guozhenwei/.oh-my-
2022-02-13 15:49:52
1393
原创 Rust 将泛型转换为具体类型
可以考虑是否能用enum替代use std::any::Any;trait Trait { fn test<T: Trait + Any>(v: T) -> Self;}#[derive(Clone)]struct Special;impl Trait for Special { fn test<T: Trait + Any>(v: T) -> Self { let any = &v as &dyn Any
2022-02-11 12:57:12
1262
原创 Rust RadixTree
github: https://github.com/Ilqjx/radixtreeuse radixtree::{Node, Method};fn main() { let mut tree = Node::new(); tree.insert(Method::GET, "/hello", "hello"); tree.insert(Method::GET, "/user/$id", "user"); tree.insert(Method::GET, "/image/
2022-01-28 16:53:09
643
原创 Rust 标准库中的RwLock和tokio中的区别
标准库中的锁定策略取决于操作系统的实现:1.Windows和macOS,读者和作家公平排队。2.Linux,读者优先,作家会出现饥饿现象。tokio中的锁定策略是读者和作家公平排队,与操作系统无关。还有最重要的一点,tokio的RwLock在挂起的时候,会让出执行权,标准库的不会。...
2022-01-19 16:34:24
807
原创 Rust 内部可变性之UnsafeCell
UnsafeCell是构建内部可变性Cell、RefCell、Mutex和RwLock的基础。UnsafeCell在文档中被定义为Rust内部可变性的核心原语。#[lang = "unsafe_cell"]#[stable(feature = "rust1", since = "1.0.0")]#[repr(transparent)]#[repr(no_niche)] // rust-lang/rust#68303.pub struct UnsafeCell<T: ?Sized> {
2022-01-19 15:11:29
874
原创 Rust 内部可变性之线程安全
线程安全的内部可变性包括Mutex、RwLock和Atomic*1.Mutex一次只允许一个线程,可以被认为只提供可变引用。2.RwLock允许多个读者或一个作者3.Arc是线程安全版本的Rc4.在Rust中,我们锁定的是数据,而不是代码。Atomic类型依赖于汇编指令来防止数据竞争AtomicBool 布尔类型AtomicSize 有符号整数类型AtomicUsize 无符号整数类型AtomicPtr 原始指针类型多线程中使用Arc<RwLock<T>>代替Rc
2022-01-19 10:57:54
1033
原创 Rust 内部可变性之Cell和RefCell
内部可变性是指当你有一个不可变引用,但是你可以改变内部值。Cell和RefCell可以实现内部可变性:1.Cell包装Copy值,并且没有借用检查;2.RefCell包装任何类型的值,有运行时借用检查,并且需要用borrow或borrow_mut锁定,分别提供一个不可变或可变引用;3.Cell和RefCell都不是线程安全的。Cell和RefCell的区别:pub struct Cell<T: ?Sized> { value: UnsafeCell<T>,}
2022-01-18 16:29:17
1367
原创 Rust 全局变量
全局不可变变量use std::collections::HashMap;use lazy_static::lazy_static;lazy_static! { static ref MAP: HashMap<u32, &'static str> = { let mut map = HashMap::new(); map.insert(1, "a"); map.insert(2, "b"); map.inse
2022-01-17 21:18:36
2303
原创 Rust 文件
创建文件use std::fs::{self, File};use std::io::{self, Write};use std::path::Path;/// 支持相对路径和绝对路径/// 相对路径是相对于当前 crate 所在的目录fn create_file(path: &str) -> io::Result<File> { let file = File::create(path); if file.is_err() { if
2022-01-13 20:09:11
1669
原创 Rust 时间
SystemTime获取时间对应的秒/毫秒/微秒/纳秒use std::time::{UNIX_EPOCH, SystemTime};fn main() { let now = SystemTime::now().duration_since(UNIX_EPOCH).unwrap(); let time = now.as_secs(); let time = now.as_millis(); let time = now.as_micros(); let ti
2022-01-10 21:55:32
2339
1
原创 Rust Actix Web 中关于 HttpServer 的一点思考
1.为什么App::new().app_data(data.clone())中的data需要调用clone()?2.为什么app闭包需要加上move关键字?我的思考是这样的,如有不对,欢迎指出。第一个问题:因为HttpServer::new()需要的闭包类型是Fn,如果不调用clone(),则是FnOnce,因为app_data(self)函数需要获取所有权。第二个问题:在这之前,我们需要知道一点,闭包只是定义了代码,并不是执行。当app闭包执行的时候,data应该存在,观察代码其实data一直
2022-01-09 16:19:27
614
原创 Rust 闭包
Rust的闭包类型分为三种:1.Fn2.FnMut3.FnOnce不同之处:1.它们的调用方法分别采用&self、&mut self和self,这意味着Fn对其捕获具有不可变的访问权限,FnMut获得可变的访问权限,FnOnce可以获得所有权。2.Fn和FnMut类型的闭包可以执行多次,而FnOnce类型的闭包只能执行一次。move关键字:1.如果没有实现Copy,就是move语义,会发生移动。2.如果实现Copy,则是copy语义,会发生拷贝。值得注意的是move与闭包
2022-01-09 14:46:48
1841
原创 Rust 程序设计语言 web server (tokio)
Rust 程序设计语言 web server1 web server 源码2 web server (tokio)1 web server 源码// src/bin/main.rsuse std::fs;use std::io::prelude::*;use std::net::{TcpListener, TcpStream};use web_server::ThreadPool;fn main() { let listener = TcpListener::bind("127.0.
2021-12-20 22:45:41
753
1
原创 折半插入排序
/** * @author upfly * @create 2021-06-18 16:50 */public class InsertSort { /** * 折半插入排序(从小到大) * * @param arr */ public void insertSort(int[] arr) { for (int i = 1; i < arr.length; i++) { // 1、寻找插入位置
2021-06-18 17:12:40
124
原创 直接插入排序
/** * @author upfly * @create 2021-06-17 16:33 */public class InsertSort { /** * 直接插入排序(从小到大) * * @param arr */ public void insertSort(int[] arr) { for (int i = 1; i < arr.length; i++) { // 如果当前元素小于有序
2021-06-17 16:52:51
105
原创 KMP算法
/** * @author upfly * @create 2021-06-16 19:20 */public class KMP { /** * 计算 next 数组 * * @param p 模式串 * @return next 数组 */ public int[] getNext(String p) { int[] next = new int[p.length()]; next[0] = -1
2021-06-17 16:16:03
105
原创 SpringBoot Rest使用与原理
SpringBoot Rest使用与原理1、Rest使用2、Rest原理1、Rest使用1、表单method=post、隐藏域_method=put/delete(不区分大小写)2、SpringBoot手动开启spring: mvc: hiddenmethod: filter: enabled: true2、Rest原理核心Filter:HiddenHttpMethodFilterprotected void doFilterInternal(Http
2021-05-13 21:42:33
244
原创 SpringBoot静态资源配置原理
SpringBoot静态资源配置原理1、WebMvcAutoConfiguration2、WebMvcAutoConfigurationAdapter2.1、WebMvcAutoConfigurationAdapter构造器3、资源处理的默认规则4、欢迎页的处理规则5、favicon1、WebMvcAutoConfigurationSpringBoot启动默认加载xxxAutoConfiguration(自动配置类)WebMvcAutoConfiguration:SpringMVC功能的自动配置类p
2021-05-13 20:55:11
131
原创 @EnableConfigurationProperties注解的作用
@EnableConfigurationProperties注解的作用:让使用@ConfigurationProperties注解的类生效,并将该类注入到IOC容器中。@ConfigurationProperties的作用:将配置文件中的相关属性与Java Bean进行动态绑定// 注解作用:使WebMvcProperties、ResourceProperties、ResourceProperties上标注的@ConfigurationProperties注解生效,并将其注入到IOC容器中@Enabl
2021-05-13 20:21:34
953
原创 简单分析Spring MVC源码
简单分析Spring MVC源码一、DispatcherServlet的继承关系二、DispatcherServlet收到请求的一个大致流程三、测试代码1、springmvc.xml2、success.jsp3、HelloController四、确定目标方法和目标页面的调用位置1、DispatcherServlet#doDispatch源码2、目标方法和目标页面的调用位置五、分析DispatcherServlet#doDispatch1、分析2、小总结六、细节分析1、getHandler()细节:如何根据当
2021-01-23 11:31:05
161
原创 简单分析spring ioc源码
spring ioc源码分析一、环境搭建1、java bean2、applicationContext.xml3、测试代码二、ioc容器的启动过程1、创建ioc容器2、ClassPathXmlApplicationContext构造器3、refresh()3.1、beanFactory 保存所有 bean 的配置信息3.2、finishBeanFactoryInitialization(beanFactory);4、初始化所有单实例 bean5、创建 bean5.1、getSingleton()5.2、创建
2021-01-17 10:29:16
333
原创 Excel快捷键
1、Ctrl + 数字快捷键描述Ctrl+0隐藏列Ctrl+1显示“设置单元格格式”窗口Ctrl+2添加或取消加粗Ctrl+3添加或取消字体倾斜Ctrl+4添加或取消下划线Ctrl+5添加或取消删除线Ctrl+6切换Ctrl+8显示或隐藏大纲符号Ctrl+9隐藏行Ctrl+F1展开或折叠功能区Ctrl+F4关闭选定的工作簿窗口Ctrl+F5恢复选定工作簿窗口的窗口大小Ctrl+F6切换到下
2020-11-17 13:28:38
439
原创 EXCEL常用函数汇总
EXCEL常用函数汇总(以Excel 2016版举例)根据自己的习惯分为七大类: EXCEL常用函数 第一类:文本处理函数 Trim函数: 作用:除了单词之间的单个空格之外,移除文本中的所有空格。
2020-11-17 13:24:59
2578
原创 ArrayList和LinkedList的区别
ArrayList底层使用的是数组,LinkedList底层使用的是链表。对于随机访问 get / set,ArrayList 要优于 LinkedList,因为 LinkedList 要移动指针,而 ArrayList 是个数组,直接返回就好了。对于插入、删除的效率就不太好说了对于 ArrayList 而言:插入、删除要移动数据对于 LinkedList 而言:插入、删除要移动指针主要有两个因素决定它们的效率,插入的数据量和插入的位置。其实只要分析一下源码就什么都明白了ArrayList.
2020-10-29 21:34:09
135
原创 LinkedList源码分析
目录一、创建一个 LinkedList 的对象二、添加一个元素三、移除一个元素四、插入一个元素一、创建一个 LinkedList 的对象LinkedList list = new LinkedList();当实例化 LinkedList 时,构造器什么也没做。public LinkedList() {}二、添加一个元素LinkedList list = new LinkedList();... // 可能添加很多个元素了list.add(new Object());看一下源码pu
2020-10-29 20:45:05
119
原创 ArrayList源码分析
目录一、创建一个 ArrayList 的对象二、添加一个元素三、移除一个元素一、创建一个 ArrayList 的对象ArrayList list = new ArrsyList();当实例化 ArrayList 时,我们看一下构造器内部都做了什么。// transient Object[] elementData;// private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};public ArrayList()
2020-10-29 16:06:07
277
2
原创 IP地址的分类和指派范围
目录一、IP地址的分类二、IP地址的指派范围一、IP地址的分类 IP地址分类 网络号 主机号 A 0开头 8位 24位 B 10开头 16位 16位 C 110开头 24位 8位 D 1110开头 多播地址 E 1111开头 保留为今后使用二、IP地址的指派范围网络类别最大可指派的网络数第一个可指派的网络号最后一个可指派的网路号每个
2020-10-23 15:10:55
5805
5
原创 判断对称二叉树
目录一、思路二、代码实现一、思路递归过程是这样的,只有到叶子节点才会有返回值,当一个节点的左右子节点都递归之后,接着会继续递归当前节点的父节点的右子节点,然后在继续…二、代码实现public boolean determineSymmetricalBinaryTree(TreeNode root) { return determineSymmetricalBinaryTree(root.left, root.right);}public boolean determineSymmetri
2020-10-22 21:30:41
175
1
原创 大数素数判定
/*根据数论可以把数字分为六大部分,6i、6i + 1、6i + 2、6i + 3、6i + 4、6i + 5,其中 6i、6i + 2、6i + 3、6i + 4 一定是合数,只有 6i + 1、6i + 5 才有可能是素数,所以一个数 x 对 6 取余,余数一定是 0、1、2、3、4、5 这六个数字,只有当余数为 1 或 5 时才有可能是素数,余数为 0、2、3、4 的一定是合数 */public boolean isPrimary(long num) { // 特殊处理 i
2020-10-22 17:39:31
656
原创 Statement 和 PreparedStatement 的使用
目录一、sql 语句二、获取数据库连接三、Statement四、PreparedStatement一、sql 语句CREATE DATABASE mytest DEFAULT CHARACTER SET UTF8;USE mytest;CREATE TABLE users ( user_id INT(32) PRIMARY KEY, user_name VARCHAR(50) UNIQUE, password VARCHAR(50)) ENGINE = INNODB DEFAULT CH
2020-10-22 13:30:31
228
原创 二叉树遍历
目录一、树的遍历分类二、代码实现一、树的遍历分类1.深度优先(DFS)前序遍历中序遍历后序遍历2.广度优先(BFS)层序遍历二、代码实现首先创建二叉树的节点 TreeNode 类public class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode(int val) { this.val = val;
2020-10-19 21:15:47
129
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人