算法基础(一)
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;...
浅入理解JVM(四)—— 线程安全与锁优化
1.Java 语言中的线程安全
我们可以将 Java 语言中的各种操作共享的数据按照“安全程度”由强至弱分为五类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。
1.1 不可变
在 Java 中,不可变的对象一定是线程安全的。
这种不可变是由 final 关键字实现的,而之前我们有讲过关于 final 关键字带来的可见性。只要一个不可变的对象被正确地构建出来(没有发生 this 引用逃逸的情况),那么其外部的可见状态永远都不会改变。
在 Java 中,如果共享的数据是一个基本数据类型,那么只要在定义时使用 final 关键字去修饰它就可以保证它是不可变的。至于对象类型,就需要其自行保证其行为不会对其状态产生任何影响。比如 String 类的对象实例,无论调用它的哪种...
浅入理解JVM(三)—— 内存模型与线程
写在之前:一点碎碎念,反正没人看。对于知识点的总结,我应该尽量用“奥卡姆剃刀”去把大量内容去精简,然后言简意赅地复述一遍。对于这种总结性的语句,可以放在知识节点的开头,而大量进行阐述的内容则应该“傻瓜化”。努力让自己的语言浅显易懂,虽然可能达不到隔壁张奶奶听懂的水平,至少也要遵循费曼学习法的思路走吧。
1.Java 内存模型
Java 内存模型就是对内存或缓存进行读写访问的过程抽象。
由于计算机的运算速度远远高于它的存储和通信的速度,大量的时间都被花在了磁盘 I/O、网络通信或者数据库访问上了,因此我们必须让计算机并发执行多个任务,减少电脑的“发呆”时间。但是绝大多数运算任务都不可能只靠处理器“计算”就能搞定的,任务处理过程必然还伴随有内存交互,比如读取运算数据、存储运算结果...
共计 12 篇文章,2 页。