主页

算法基础(一)

1 基础算法 1.1 快速排序 1.1.1 AcWing 785. 快速排序 题目链接 核心是分治,每次以 j 为分界点。难点在于初始化的“后撤步”,即 i = l - 1 和 j = r + 1,以及在交换元素时的前置判定容易遗漏。 #include <iostream> using namespace std; const int N = 1e6 + 10; int q[N]; int n; void quick_sort(int q[], int l, int r) { if (l >= r) return; int i = l - 1, j = r + 1, x = q[l + r >> 1]; //...

阅读更多

Spring——bean(一)

1 创建 bean 1.1 创建一个简单的 bean 在 Spring IOC 容器中创建一个简单(指不包含任何其他对象的引用)的 bean,有 XML 配置和注解配置(后面会讲)两种方式。 举个栗子,我们以 Person.java 为例: public class Person { String name; int age; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } @Override public String ...

阅读更多

算法办没——排序算法

1 初级排序算法 1.1 选择排序 首先,找到数组中最小的元素,然后将它同数组的第一个元素交换位置,再然后找到剩余元素中最小的元素同第二个元素交换位置,循环往复直至整个数组有序。 public class Selection { public static void sort(Comparable[] a) { int N = a.length; for (int i = 0; i < N; i++) { int min = i; for (int j = i + 1; j < N; j++){ if (less(a[j], a[min])) min...

阅读更多

并发编程伪实战——任务执行

“喜欢蓝色,等以后学会配图了,就用黄、蓝、白、灰或者红、蓝、黑配色吧!” 1.在线程中执行任务 1.1 为任务创建线程 这里是一个串行处理服务器请求的 Web 服务器程序: public class SingleThreadWebServer { public static void main(String[] args) throws IOException { ServerSocket socket = new ServerSocket(80); while(true){ Socket connection =socket.accept(); handleRequest(connect...

阅读更多

并发编程伪实战——并发基础构建模块

1. 同步容器类 同步容器类包括 Vector 和 Hashtable,二者是早期 JDK 的一部分,此外还包括一些由 Collections.synchronizedXxx 等工厂方法创建的封装类。它们实现线程安全的方式是:对每个公有方法都进行同步,使得每次只能有一个线程能访问容器。 1.1 同步容器类的问题 同步容器类在某些情况下需要在客户端加锁以保护复合操作。 这些复合操作通常包括迭代、跳转以及条件运算等,尽管在多线程环境下它们仍是“线程安全”的,但当有其他线程并发修改容器时,就有可能会出现一些意料之外的问题。 public static Object getLast(Vector list) { int lastIndex = list.size() - 1;...

阅读更多

来自4月12日

今天是 4 月 12 日,希望自己从今以后能够不要偷懒。 我很聪明,我可以成功,我必将胜利。付出汗水很辛苦,看不下去书也很痛苦,花费了很多精力结果全部忘记也很绝望,但是路在脚下,只能自己走,不能活在假设里。出现问题就要分析并解决,我不是天才型选手,但是我是努力型天才,只需要复制以前的成功就可以了,三个月、六个月。 好吧,虽然看着很热血,但是未来的你也不会听进去的,蠢狗。

阅读更多

浅入理解JVM(四)—— 线程安全与锁优化

1.Java 语言中的线程安全 我们可以将 Java 语言中的各种操作共享的数据按照“安全程度”由强至弱分为五类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。 1.1 不可变 在 Java 中,不可变的对象一定是线程安全的。 这种不可变是由 final 关键字实现的,而之前我们有讲过关于 final 关键字带来的可见性。只要一个不可变的对象被正确地构建出来(没有发生 this 引用逃逸的情况),那么其外部的可见状态永远都不会改变。 在 Java 中,如果共享的数据是一个基本数据类型,那么只要在定义时使用 final 关键字去修饰它就可以保证它是不可变的。至于对象类型,就需要其自行保证其行为不会对其状态产生任何影响。比如 String 类的对象实例,无论调用它的哪种...

阅读更多

浅入理解JVM(三)—— 内存模型与线程

写在之前:一点碎碎念,反正没人看。对于知识点的总结,我应该尽量用“奥卡姆剃刀”去把大量内容去精简,然后言简意赅地复述一遍。对于这种总结性的语句,可以放在知识节点的开头,而大量进行阐述的内容则应该“傻瓜化”。努力让自己的语言浅显易懂,虽然可能达不到隔壁张奶奶听懂的水平,至少也要遵循费曼学习法的思路走吧。 1.Java 内存模型 Java 内存模型就是对内存或缓存进行读写访问的过程抽象。 由于计算机的运算速度远远高于它的存储和通信的速度,大量的时间都被花在了磁盘 I/O、网络通信或者数据库访问上了,因此我们必须让计算机并发执行多个任务,减少电脑的“发呆”时间。但是绝大多数运算任务都不可能只靠处理器“计算”就能搞定的,任务处理过程必然还伴随有内存交互,比如读取运算数据、存储运算结果...

阅读更多