Java 8 -- Optional
本文主要介绍Java 8的 Optional 的简单使用
Address1234567@Data@AllArgsConstructor@NoArgsConstructorpublic class Address { private String province; private String city;}
of + ofNullable相关代码托管在java8_demo
123456789101112131415161718@Test(expected = NoSuchElementException.class)public void emptyTest() { // 声明一个空的Optional对象 Optional<Address> nameOptional = Optional.empty(); // java.util.NoSuchElementException: No value present nameOptional.get();}@Test(expected = NullPointerExceptio ...
Java 8 -- Default Method
本文主要介绍Java 8的 default 方法的简单使用
简介
default方法作为接口的一部分由实现类继承
default方法的目标用户是类库设计者
以兼容的方式解决类库的演进问题
冲突解决一个类可以实现多个拥有默认方法的接口,从而实现行为的多继承,按照下列步骤解决冲突
类或父类中声明的方法的优先级高于任何声明为默认方法的优先级
子接口的default方法优先级高于父接口的default方法
显式选择使用哪一个default方法
类与接口定义相关代码托管在java8_demo
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647interface A { default String hello() { return "Hello From A"; }}interface B extends A { @Override default String hello ...
Java 8 -- Stream
本文主要介绍Java 8的 Stream的简单使用
简介流与集合的区别计算的时机
是否全部载入内存
能否添加或删除元素
类似于
集合
是
能
DVD
流
否,按需计算
不能
网络流媒体
消费一次流只能遍历一次,遍历后即被消费,类似于网络流相关代码托管在java8_demo
12345List<String> strs = Arrays.asList("zhong", "ming", "mao");Stream<String> stream = strs.stream();stream.forEach(s -> System.out.println(s)); // Lambda// throw java.lang.IllegalStateException: stream has already been operated upon or closedstream.forEach(System.out::println); // 方法引用,相关内容请参照「Java8回忆录 - Lambda」
...
Java 8 -- Lambda
本文主要介绍Java 8的 Lambda 表达式的简单使用
基本语法12(parameters) -> expression(parameters) -> {statements;}
Apple相关代码托管在java8_demo
123456789@Data@AllArgsConstructor@NoArgsConstructorpublic class Apple { public static enum COLOR { GREEN, RED } public static final int HEAVY_WEIGHT = 200; private COLOR color; private Integer weight;}
实例12345678910111213141516171819202122232425(String s) -> s.length()// 等价于int f(String s){ return s.length(); }(Apple a) -> a.g ...
Java 8 -- 行为参数化
本文主要介绍行为参数化
基础概念
行为参数化:将方法或代码作为参数或值进行传递
谓词:一个返回 boolean 值的函数,在 Java8 中是一个函数式接口(java.util.function.Predicate)
代码实例目录结构如下,相关代码托管在java8_demo
12345678910111213141516171819202122├── main│ └── java│ └── me│ └── zhongmingmao│ ├── domain│ │ └── Apple.java│ ├── filter│ │ ├── FilterJava7.java│ │ └── FilterJava8.java│ └── predicate│ ├── java7│ │ ├── ColorPredicate.java│ ...
InnoDB -- 事务隔离级别
本文主要介绍InnoDB的事务隔离级别关于Next-Key Lock的内容,请参照「InnoDB备忘录 - Next-Key Lock」,这里不再赘述
脏读、不可重复读、幻读脏读在不同的事务下,当前事务可以读到其它事务中尚未提交的数据,即可以读到脏数据
不可重复读在同一个事务中,同一个查询在T1时间读取某一行,在T2时间重新读取这一行时候,这一行的数据已经发生修改,不可重复读的重点是修改(Update)
幻读在同一事务中,同一查询多次进行,由于包含插入或删除操作的其他事务提交,导致每次返回不同的结果集,幻读的重点在于插入(Insert)或者删除(Delete)
两类读操作一致性非锁定读
InnoDB通过行多版本控制的方式来读取当前执行时间数据中行的数据,如果读取的行正在执行DELETE或UPDATE操作,这时读操作不会等待行上锁的释放,而是读取行的一个快照数据
非锁定读机制极大地提高了数据库的并发性,这是InnoDB默认的读取方式
READ COMMITED和REPEATABLE READ支持一致性非锁定读:在READ COMMITED下,总是读取被锁定行的最新的快照数据,在REPEATABLE RE ...
InnoDB -- Next-Key Lock
本文主要介绍InnoDB存储引擎的Next-Key Lock
MVCC
InnoDB支持MVCC,与之MVCC相对的是LBCC
MVCC中读操作分两类:Snapshot Read(不加锁)和Current Read(加锁)
MVCC的好处:**Snapshot Read不加锁**,并发性能好,适用于常规的JavaWeb项目(OLTP应用)
隔离级别InnoDB支持4种事务隔离级别(Isolation Level)
隔离级别
描述
READ UNCOMMITTED (RUC)
可以读取到其他事务中尚未提交的内容,生产环境中不会使用
READ COMMITTED (RC)
可以读取到其他事务中已经提交的内容,Current Read会加锁,存在幻读现象,Oracle和SQL Server的默认事务隔离级别为RC
REPEATABLE READ (RR)
保证事务的隔离性,Current Read会加锁,同时会加Gap Lock,不存在幻读现象,InnoDB的默认事务隔离级别为RR
SERIALIZABLE
MVCC退化为LBCC,不区分Snapshot Read和Current ...
InnoDB -- B+Tree索引
本文主要介绍InnoDB存储引擎的B+Tree索引
B+Tree数据结构
所有叶子节点出现在同一层
叶子节点包含关键字信息
叶子节点本身构成单向有序链表
叶子节点内部的记录也构成单向有序链表
索引节点不包含关键字信息,这样能容纳更多的索引信息,B+Tree的高度很低,查找效率很高
关于B+Tree的更多内容请查看维基百科
MyISAM与InnoDBMyISAM
索引文件与数据文件是**分离**的
MyISAM的索引文件采用B+Tree索引
叶子节点data域记录的是**数据存放的地址**
主索引(唯一)与辅助索引(可重复)在结构上没有任何区别
InnoDB
数据文件本身是按照B+Tree组织的索引结构(主索引:Primary Index或聚集索引:Clustered Index),而叶子节点data域记录的是**完整的数据信息**
InnoDB**必须有主键**,如果没有显式定义主键或非NULL的唯一索引,InnoDB会自动生成6 Bytes的ROWID作为主键
辅助索引(Secondary Index)也是按B+Tree组织,叶子节点data域记录的是**主键值**,因此主键不宜定义太大 ...
InnoDB -- 数据页结构
本文主要介绍InnoDB存储引擎的数据页结构
数据页结构
File Header参考链接:Fil Header
总共38 Bytes,记录页的头信息
名称
大小(Bytes)
描述
FIL_PAGE_SPACE
4
该页的checksum值
FIL_PAGE_OFFSET
4
该页在表空间中的页偏移量
FIL_PAGE_PREV
4
该页的上一个页
FIL_PAGE_NEXT
4
该页的下一个页
FIL_PAGE_LSN
8
该页最后被修改的LSN
FIL_PAGE_TYPE
2
该页的类型,0x45BF为数据页
FIL_PAGE_FILE_FLUSH_LSN
8
独立表空间中为0
FIL_PAGE_ARCH_LOG_NO
4
该页属于哪一个表空间
Page Header参考链接:Page Header
总共56 Bytes,记录页的状态信息
名称
大小(Bytes)
描述
PAGE_N_DIR_SLOTS
2
在Page Directory中Slot的数量,初始值为2
PAGE_HEAP_TOP
2
堆中第一个记录的指针
PA ...
InnoDB -- 行记录格式
本文主要介绍InnoDB存储引擎的行记录格式ROW_FORMAT
分类
Named File Format
InnoDB早期的文件格式(页格式)为Antelope,可以定义两种行记录格式,分别是Compact和Redundant
Named File Format为了解决不同版本下页结构的兼容性,在Barracuda可以定义两种新的行记录格式Compressed和Dynamic
变量为innodb_file_format和innodb_default_row_format
123456789101112131415mysql> SHOW VARIABLES LIKE 'innodb_file_format';+--------------------+-----------+| Variable_name | Value |+--------------------+-----------+| innodb_file_format | Barracuda |+--------------------+-----------+1 row in set ( ...