转换符 | 类型 |
---|---|
d | 十进制整数 |
x | 十六进制整数 |
o | 八进制整数 |
f | 定点浮点数 |
e | 指数浮点数 |
g | 通用浮点数 |
a | 十六进制浮点数 |
s | 字符串 |
c | 字符 |
b | 布尔 |
h | 散列码 |
tx | 日期时间 |
% | % |
n | 与平台有关的行分隔符 |
标志 | 目的 |
---|---|
+ | 打印正数和负数的符号 |
空格 | 在正数之前添加空格 |
0 | 数字前补0 |
- | 左对齐 |
( | 将负数括在括号内 |
转换符 | 类型 |
---|---|
d | 十进制整数 |
x | 十六进制整数 |
o | 八进制整数 |
f | 定点浮点数 |
e | 指数浮点数 |
g | 通用浮点数 |
a | 十六进制浮点数 |
s | 字符串 |
c | 字符 |
b | 布尔 |
h | 散列码 |
tx | 日期时间 |
% | % |
n | 与平台有关的行分隔符 |
标志 | 目的 |
---|---|
+ | 打印正数和负数的符号 |
空格 | 在正数之前添加空格 |
0 | 数字前补0 |
- | 左对齐 |
( | 将负数括在括号内 |
objc[7997]: Class JavaLaunchHelper is implemented
java在mac上的老bug,不影响正常运行。
8种基本类型: 4种整型 2种浮点型 字符类型char(用于表示Unicode编码的字符单元) boolean类型
整型 | 存储需求 | 范围 | 特殊说明 |
---|---|---|---|
int | 4字节 | 20亿 | |
short | 2字节 | ||
long | 8字节 | 后缀L | |
byte | 1字节 |
浮点类型 | 存储需求 | 范围 | 特殊说明 |
---|---|---|---|
float | 4字节 | 后缀F | |
double | 8字节 | 后缀D |
|
|
char类型 表示单个字符
boolean类型: true false
数组
java中的数据没有指针运算。数组的操作使用java.util库中的Arrays。
|
|
java中不区分变量的声明与定义。
使用final关键字定义的为常量,被赋值后不能再修改。
使用static final关键字定义的为类常量。
|
|
关系运算符: == != < <= > >=
逻辑运算符: && ||
位运算符: &(与) |(或) ~(非) ^(异或) <<(左移,使用符号位填充) >>(右移) >>>(右移,使用0填充)
java中的字符串也是不可变字符串。
字符串的比较用equals方法,千万不要使用==,因为==比较的是引用地址。
|
|
java中有块(block)的概念。形式上就是使用一对花括号括起来的多条语句。块可以嵌套,但是不可以重复定义变量。
|
|
java不支持运算符重载。
类之间的关系: 依赖(uses-a)、聚合(has-a)和继承(is-a)。
|
|
在一个源文件中,只能有一个公有类,但可以有任意数目的非公有类。原文件名必须有公有类类名相同。
有关构造器:
提供get和set方法的好处:
警告: 不要编写返回可变引用可变对象的访问器方法
基于类的访问权限:方法可以访问所属类的私有属性,而不仅限于访问隐式参数的私有属性。
final关键字的用途:
static关键字:
方法参数:java中采用按值传递方式。但是参数又分为两种类型: 1. 基本数据类型(数字,布尔值) 2. 对象引用
当参数是对象引用时,传递的是对象引用的副本,调用对象的方法将直接修改对象。
属性若未被初始化,则会执行默认初始化。但是局部变量必须得执行初始化。
在类定义时可以直接初始化属性。
this关键字的用途:
初始化块在构造器之前执行。初始化块可用static修饰,为静态初始化块,只能初始化静态属性,在类第一次加载的时候执行。
java不支持析构函数,但finalize方法保证在对象回收之前调用。但不能过多依赖该方法。
包的支持:
|
|
没有public或private修饰的属性或方法具有包作用域。
类路径:
javac编译器总是在当前的目录中查找文件,但java虚拟机仅在类路径中有”.”目录的时候才查看当前目录。若类路径中忘记设置当前目录,则程序仍然可以编译通过,但是不能运行。
设置类路径的方法:
|
|
extends关键字表示继承关系,java中都是公有继承。
super关键字的用途:
若子类的构造器没有显式的调用超类的构造器,则默认调用无参构造器。若父类没有无参构造器,则编译报错。
多态:一个对象变量可以指示多种实际类型的现象
动态绑定:在运行时能够自动选择调用哪个方法的现象
斜变
|
|
强制类型转换:
abstract关键字:
Object类
方法 | 解释 | |
---|---|---|
equales | 检测两个对象是否相等 | |
hashCode | 对象的存储地址 一个整数值 | |
toString | 返回对象所属类名和散列码 |
对象包装器与自动装箱
装箱与拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时,插入必要的方法调用。虚拟机只是执行这些字节码。
重要:自动装箱规范要求boolean、byte、char<=127、介于-128到127之间的short和int被包装到固定的对象中。
可变参数方法
|
|
枚举类
|
|
反射
反射的作用:
虚拟机为每个类型管理着一个Class对象,即每个类只有一个Class对象,该类的对象共享该Class对象。
重点在java.lang.reflect库。
java设计者认为多继承会使语言本身变得复杂,效率也会降低。(好像是这么回事)
对象克隆
接口与回调
在面向过程的编程语言(比如C)中,通常使用函数实现回调机制。但在像java这种纯面向对象的编程语言中,也可以通过传递Method对象,但由于使用复杂,速度和安全性问题,所以使用接口来实现回调机制。
接口中定义需要被回调的方法,实现回调机制的类实现接口中的方法,然后传递对象。这些接口一般称为标记接口
内部类
内部类是定义在另一个类中的类。
使用内部类的原因如下:
匿名内部类
|
|
静态内部类
使用staitc修饰的内部类为静态内部类,静态内部类没有指向外围类的引用。
一个jar文件既可以包含类文件,也可以包含图像和声音这些其他类型的文件。jar文件使用zip压缩格式进行压缩。
jar文件中还包含一个清单文件MANIFEST.MF
|
|
RuntimeException有如下几种:
unchecked exceptions 和 checked exceptions
断言
|
|
泛型使程序具有更好的可读性和安全性。
通配符类型(wildcard type)
泛型类
|
|
泛型方法
|
|
类型变量的限定
|
|
对虚拟机来说不存在泛型之说,所有的类都是普通类。
无论何时定义一个泛型类型,都自动提供了一个相应的原始类型。原始类型通过将类型变量替换为限定类型来获得。若类型变量是一个无限定的变量,则直接用Object类替换。若类型变量是一个有限定的变量,则用第一个限定的类型变量来替换。
翻译泛型表达式时编译器插入强制类型转换
翻译泛型方法时会使用桥方法(bridge method)的技巧。其中桥方法的技巧在斜变中也被应用到。
|
|
关于泛型的tips:
使用的基础数据结构有: 数组、链表、哈希表、堆、红黑树
集合 | 类 | 数据结构 |
---|---|---|
List | ArrayList | 数组 |
List | LinkedList | 链表 |
Set | HashSet | 哈希表 |
Set | TreeSet | 红黑树 |
Set | LinkedHashSet | 哈希表 链表 |
Map | HashMap | 哈希表 对key进行哈希 |
Map | TreeMap | 红黑树 对key进行排序 |
Map | LinkedHashMap | 哈希表 链表 |
Queue | ArrayDeque | 循环数组 |
Queue | PriorityQueue | 堆 |
集合框架的接口
|
|
集合框架中的类
|
|
视图与包装器???
创建一个线程的方法:
线程状态
|
|
线程优先级
当虚拟机依赖于宿主机平台的线程实现机制时,java线程的优先级被映射到宿主机平台的优先级上,优先级个数也许更多,也许更少。比如Windows有7个线程优先级,而Linux没有线程优先级。
守护线程
当只剩下守护线程的时候,虚拟机就退出了。所以,守护线程不应该访问固有资源,如文件,数据库等,因为他们会在任何时候发生中断。
线程同步
java里面提供了两种同步机制: 1. synchronized关键字 2. ReentrantLock和Condition类
可重入锁指的是拥有某个锁的线程可以再次拥有该锁。该机制通过计数器实现。
Lock和Condition:
|
|
synchronized关键字是java语言实现的一种内部机制: 每个对象都有一个内部锁。
|
|
|
|
同步阻塞
同步阻塞更像是一种显式利用对象锁的方式。
|
|
监视器
监视器是一种解决方案,该方案的目标是在程序员不考虑锁的情况下,也能保证多线程的安全性。
监视器必须满足如下特性:
java实现了不严格的监视器。
volatile域
使用锁机制的开销很大,有时候仅仅为了访问一个或两个实例域,就没必要使用锁,所以出现了volatile域,该关键字为实例域的同步访问提供了一种免锁机制。
造成不同步的根源:
使用锁的情况下,不用考虑以上问题。详见(java内存模型和线程规范 JSR133)
如果声明一个域为volatile,那么编译器和虚拟机就知道该域是可能被另一个线程并发更新的。但该关键字并不提供原子性,只对变量的赋值和访问起作用。
final变量
|
|
其他线程会在构造函数完成构造之后才看到这个accounts变量。
死锁
死锁产生的条件: 1. 由于逻辑错误导致 2. 由于并发工具使用错误导致(比如notify())
线程本地数据
ThreadLocal
锁测试与超时
在尝试获取一个锁或等待某个条件时,可以加一个等待时间。该机制可以避免由于并发工具使用错误导致的死锁的发生。
读写锁
|
|
阻塞队列
使用底层的锁机制有很大的灵活性,但是也带来了一定的复杂性。所以,java提供了阻塞队列,程序员不需要关心底层的锁机制,就可以实现多线程的管理。
并发安全的集合
java也提供了一些线程安全的数据结构。在java.util.concurrent包中。
|
|
同步包装器
java提供的大部分集合不是线程安全的,但是可以通过同步包装器将其变为线程安全的。
|
|
Callable和Future
线程池
使用线程池的步骤:
控制任务组
与python对比:
python中没有私有公有属性之分,并且鼓励直接调用属性,因为有其他机制可以控制对属性的访问操作。python中也有类属性或类方法。python中也采用按值传递的方式。python中的super是一个内建函数。
python中的相等性比较:
python中不同类型的比较方法如下:
与C++的对比:
C++中有值传递和引用传递两种方式。
在C++中不能直接初始化属性,所有域必须在构造器中设置。
在C++中一个构造器不能调用另一个构造器。必须将公共初始化代码抽象出来。
在C++中继承分为公有继承,保护继承和私有继承三种。
在C++中为了实现多态,需要显式的将某个方法指定为虚拟方法。
|
|
内置异常分类
内置异常 | 解释 | 特殊说明 |
---|---|---|
BaseException | 异常的顶级根类 | |
Exception | 与应用相关的异常顶级根超类 | 用户定义的异常应该继承此类 |
ArithmeticError | 所有数值错误的超类 | Exception的子类 |
OverflowError | 识别特定数值错误的子类 |
python支持的数据类型有Number, String, File
python支持的数据结构有list, dict, tuple, set
|
|
由于python是强类型语言,所以类型之间不行互相自动转换。
python支持的控制结构:
|
|
相关的内建函数: range zip map
迭代协议: __iter__ __next__
序列协议: __getitem__
|
|
语法 | 解释
def func(name) | 常规参数
def func(name=value) | 默认参数值
def func(*name) | 匹配并收集(在元组中)所有包含位置的参数
def func(**name) | 匹配并收集(在字典中)所有包含位置的参数
lambad表达式:
|
|
LEGB法则:
L: 本地作用域
E: 嵌套作用域
G: 全局作用域
B: 内置作用域
global语句的作用, nonlocal(py3.0之后)语句的作用
|
|
import执行过程:
搜索
搜索路径:
重新导入模块: reload
包含__init__.py文件的目录即是包
|
|
|
|
环境管理协议:
实际开发中用的比较多,必须掌握。
在写框架代码的时候用的较多。
ORM框架的理论基础:
python | mysql |
---|---|
Model class | Database table |
Field instance | Column on a table |
Model instance | Row in a database table |
|
|
peewee将连接存储到线程的本地数据上,因此每个线程持有一个数据库连接。如果你想自己管理连接,可以在初始化数据库的时候加上参数threadlocals=False
有时候数据的配置直到运行时才知道,因为这些值可能从配置文件中加载。此种情况下,使用如下代码:
|
|
多个数据库使用一个数据模型的场景下,使用Proxy
|
|
在web应用中,为了提高程序的性能,必须使用连接池。连接池提供了如下两个功能:
|
|
为了提高数据库的性能,写入主库,但是从从库中读取。
|
|
|
|
使用pwiz库
该方法不推荐使用,因为效率极低。
|
|
|
|
使用Using语句
|
|
|
|
|
|
目前peewee支持Postgres, MySQL and SQLite,但也可以手动添加其他数据库的支持。
cpu | 内存 |
---|---|
4 | 4GB |
|
|
进程数: 1
请求数 | 并发数 | QPS | time(s) | 特殊说明 |
---|---|---|---|---|
10000 | 1 | 796 | 12 | 单核cpu: 100% |
10000 | 2 | 815 | 12 | 单核cpu: 100% |
10000 | 4 | 819 | 12 | 单核cpu: 100% |
10000 | 8 | 817 | 12 | 单核cpu: 100% |
50000 | 16 | 818 | 61 | 单核cpu: 100% |
50000 | 32 | 818 | 61 | 单核cpu: 100% |
50000 | 64 | 813 | 61 | 单核cpu: 100% |
进程数: 4
请求数 | 并发数 | QPS | time(s) | 特殊说明 |
---|---|---|---|---|
10000 | 1 | 386 | 25 | cpu: 40% |
10000 | 2 | 1295 | 7 | cpu: 70% |
10000 | 4 | 1683 | 6 | cpu: 100% |
10000 | 8 | 1681 | 6 | cpu: 100% |
50000 | 16 | 1677 | 30 | cpu: 100% |
50000 | 32 | 1675 | 30 | cpu: 100% |
50000 | 64 | 1675 | 30 | cpu: 100% |
进程数: 4 连接池: 4
请求数 | 并发数 | QPS | time(s) | 特殊说明 |
---|---|---|---|---|
10000 | 1 | 213 | 46 | cpu: 40% |
10000 | 2 | 631 | 15 | cpu: 60% |
10000 | 4 | 893 | 11 | cpu: 88% |
10000 | 8 | 890 | 11 | cpu: 88% |
备注: 由于数据库与服务部署在同一台机器上,数据库也占用了部分计算资源,所以整个机器的cpu利用率达到了100%,但是服务占用的只有88%。
tornado是以事件和协程为基础的服务器。由于python中并未实现真正的协程,所以使用生成器实现协程的功能。
以下代码是tornado框架的核心,读懂了该代码,对tornado框架也应该就清楚了。
|
|
tag:
缺失模块。
1、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
2、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: true raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true