普通人如果想比别人更上一层楼,就要多按一层电梯。
RecordShit 关键记录
一切的一切源于那烦人的“便了么”,从去年年底到今年五月,我已经用了半年,却总是忘记点击“拉完了”按钮,导致一拉就拉了十几分钟,于是我决定自己写一个。 ...
云服务器 OOM
前一阵子,原来的云服务器快到期了,续费还不如买个新的,正好用来部署博客,想着负载不大,就选了实惠的规格,2核2G。 最近想要部署一个项目,后端是 docker 化的,在我换好镜像源,执行 docker-compose up -d ,一分钟后,我的 ide 和服务器断开了远程连接。重新连接依然不行。当我打开云厂商的监控页面时,看到恐怖的一幕,我的服务器好像要不行了。 ...
十种排序算法整理
十种排序算法 冒泡排序 一共进行 n - 1 轮,在每一轮排序中对相邻两元素进行比较,大的排在后面。 /** * 冒泡排序 * 时间复杂度:最优 O(n),最坏 O(n²),平均 O(n²) * 空间复杂度:O(1),原地排序 * 稳定性:稳定 */ private static void bubbleSort(int[] arr) { int n = arr.length; boolean flag = true; for (int i = 0; i < n - 1; i++) { flag = true; for (int j = 0; j < n - 1 - i; j++) { if (arr[j] > arr[j + 1]) { swap(arr, j, j + 1); flag = false; } } if (flag) break; } } 选择排序 同样进行 n - 1 轮,每一轮从待排序序列中挑出最小的元素,将其放至已排序序列的末尾。 ...
笔试收获
参加了一次笔试,收获颇多。 不同的输入方法 和力扣不一样,一些大厂的笔试包括面试时的算法题都是 ACM 模式,也就是需要自己处理输入,然后对输入处理并输出,而力扣是核心代码模式,不用你管输入,只需要实现指定方法,平台自会调用你的方法。在参加之前,我去卡码网上了解了一下,发现还是 Scanner 那一套,也就没在意,但当我真正开始做的时候感到有点不对,Scanner 恐怕不太够用。这篇博客主要讲一下 Java 里的输入流。 ...
权限模型
常见的权限模型有两种:RBAC 和 ABAC。 两种模型介绍 RBAC 模型 Role-Based Access Control,翻译为基于角色的访问控制。角色拥有某些权限,通过赋予用户某种角色来达到给用户授予相关权限的目的,这就是基于角色。实现较简单。在一些大型组织中,角色可能爆炸式增长,导致管理复杂、权限冗余。 ...
手写简单IoC容器
学习 Spring,跟着二哥简单写个 IoC 容器。 Java · 90 行 · 点击展开 @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @interface MyAutowired { } @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @interface MyComponent { } public class SimpleIoC { Map<Class<?>, Object> beans = new HashMap<>(); //扫描 public void scan(String packageName) { List<Class<?>> classes = getClassesInPackage(packageName); for (Class<?> clazz : classes) { if (clazz.isAnnotationPresent(MyComponent.class)) { registerBean(clazz); } } di(); } //获取包下的类,简化实现 private List<Class<?>> getClassesInPackage(String packageName) { // 实际实现需要扫描classpath,这里简化处理. return Arrays.asList(UserDao.class, UserService.class); } //注册bean private void registerBean (Class<?> clazz) { try { Object instance = clazz.getDeclaredConstructor().newInstance(); beans.put(clazz, instance); } catch (Exception e) { throw new RuntimeException("创建bean失败"); } } //获取bean @SuppressWarnings("unchecked") public <T> T getBean(Class<T> clazz) { return (T)beans.get(clazz); } //依赖注入 private void di() { for (Object bean : beans.values()) { Field[] fields = bean.getClass().getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(MyAutowired.class)) { field.setAccessible(true); Object dependency = getBean(field.getType()); try { field.set(bean, dependency); } catch (Exception e) { throw new RuntimeException("依赖注入失败"); } } } } } } //DAO层 @MyComponent class UserDao { public void save(String user) { System.out.println("保存用户: " + user); } } // Service层 @MyComponent class UserService { @MyAutowired private UserDao userDao; public void createUser(String name) { userDao.save(name); System.out.println("用户创建完成"); } } class Test { public static void main(String[] args) { SimpleIoC ioc = new SimpleIoC(); ioc.scan("package"); UserService bean = ioc.getBean(UserService.class); bean.createUser("dong"); } } 参考链接: ...
LeetCode155.最小栈
第二次碰到这道题了,又学了两种解题方法,记录一下。 题目介绍 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop() 删除堆栈顶部的元素。 int top() 获取堆栈顶部的元素。 int getMin() 获取堆栈中的最小元素。 解法一:使用辅助栈 这个也是最简单的,题目没有空间限制,考虑使用两个栈,主栈正常记录元素进出,辅助栈记录每个元素对应最小值的进出,辅助栈的栈顶保持为主栈所有元素的最小值。 ...
LeetCode8.字符串转换整数
一切源于一道题目:8. 字符串转换整数 (atoi) - 力扣(LeetCode) 考虑这样一个问题:给你一个数字字符串,如何在32位环境下安全的处理可能超过[-2^31, 2^31 - 1]范围的数字,不能使用64位变量临时存储。 ...
Java集合源码阅读
先附上二哥网站上关于集合框架的结构图 版本为JDK21 ArrayList 扩容机制 先介绍一下 ArrayList 中的关键变量: transient Object[] elementData 底层用来存储元素的数组 private int size; 表示集合中元素的实际数量 private static final int DEFAULT_CAPACITY = 10; 默认初始容量 private static final Object[] EMPTY_ELEMENTDATA = {}; 当用户调用 new ArrayList(0) 时,elementData 会引用该数组。 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; 当用户调用默认构造参数时会引用该数组。 private Object[] grow(int minCapacity) { int oldCapacity = elementData.length; if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { int newCapacity = ArraysSupport.newLength(oldCapacity, minCapacity - oldCapacity, /* minimum growth */ oldCapacity >> 1 /* preferred growth */); return elementData = Arrays.copyOf(elementData, newCapacity); } else { return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)]; } } private Object[] grow() { return grow(size + 1); } 上面是有关扩容的源代码。 ...
MySQL锁机制八股整理
整理一下MySQL锁的八股,全文整理自二哥博客。 在MySQL数据库中,锁是用来协调多个进程或线程并发访问同一资源的机制。锁不仅保证了数据的一致性和有效性,而且是影响数据库并发访问性能的一个重要因素。 ...