??xml version="1.0" encoding="utf-8" standalone="yes"?>
的块:(x)
的块降低块竞争Q因为每个块中的行较?yu)?
的块对于小的行有益.
的块对于随意的讉K较好.如果一个块不太可能在读入内存后被修改,那么块的大小小使用buffer cache有效率。当内存资源很珍贉|ؓ(f)重要Q因为数据库的buffer cache是被限制大小的?br />
劣势Q?br />
块的管理消费相对大.
因ؓ(f)行的大小你可能只在块中存储很数目的行,q可能导致额外的I/O?br />
块可能D更多的烦(ch)引块被读?/p>
大的?br />
好处Q?br />
更少的管理消费和更多存储数据的空?
大块对于有顺序的d较好. 譬如说全表扫?br />
大块对很大的行较?br />
大块改进?jin)?ch)引读取的性能.大的块可以在一个块中容Ux多的索引条目,降低?jin)大的?ch)引的数?少的index level意味着在遍历烦(ch)引分支的时候越的I/O?br />
劣势Q?br />
大块不适合在OLTP中用作烦(ch)引块,因ؓ(f)它们增加?jin)在索引叶块上的块竞争?br />
如果你是随意的访问小的行q有大的块,buffer cachep费?jin)。例如,8 KB的block size ?0 byte row size,你浪费了(jin)7,950
如:(x)自动装箱Q它可以直接把基本类型赋值给装cd
Integer num = 10 ;
Double d = 2d ;
自动拆箱Q它可以把封装类型赋值给基本cd
int num = new Integer(10);
double d = new Double(2d);
自动装箱与拆q功能事实上是~译器来帮?zhn)的忙Q编译器在编译时期依(zhn)所~写的语法,军_是否q行装箱或拆动作。在自动装箱时对于g-128?27之间的|它们被装׃ؓ(f)Integer对象后,?x)存在内存中被重用,所以范?.6中?=q行比较Ӟi1 ?i2实际上参考至同一个对象。如果超q了(jin)?128?27之间的|被装后的Integer对象q不?x)被重用Q即相当于每ơ装时都新Z个Integer对象Q所以范?.7使用==q行比较Ӟi1与i2参考的是不同的对象。所以不要过分依赖自动装׃拆箱Q?zhn)q是必须知道基本数据cd与对象的差异?/span>
public void testBoxingUnboxing() {
int i = 10;
Integer inta = i;
inta++;
inta += 1;
int j = inta;
assertTrue(j == inta);l果是:(x)true//junit里面的方?/span>
assertTrue(j == new Integer(j)); l果是:(x)true
assertTrue(10000 == new Integer(10000)); l果是:(x)true
}
Integer i = 100.相当于编译器自动为?zhn)作以下的语法~译Q?/span>
Integer i = new Integer(100).所以自动装׃拆箱的功能是所谓的“~译器蜜p?#8221;(Compiler Sugar)Q虽然用这个功能很方便Q但在程序运行阶D|得了(jin)解Java的语义。例如下面的E序是可以通过~译的:(x)
Integer i = null.int j = i.q样的语法在~译时期是合法的Q但是在q行时期?x)有错误Q因U写法相当于Q?/span>
Integer i = null.int j = i.intValue().null表示i没有参考至M的对象实体,它可以合法地指定l对象参考名U。由于实际上iq没有参考至M的对象,所以也׃可能操作intValue()Ҏ(gu)Q这样上面的写法在运行时?x)出现NullPointerException错误?/span>
自动装箱、拆q功能提供?jin)方便性,但隐藏了(jin)一些细节,所以必d?j)。再来看范例4.6Q?zhn)认?f)l果是什么呢Q?/span>
Ü. 范例4.6 AutoBoxDemo2.java
public class AutoBoxDemo2 {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
if (i1 == i2)
System.out.println("i1 == i2");
else
System.out.println("i1 != i2").
}
}
从自动装׃拆箱的机制来看,可能?x)觉得结果是昄i1 == i2Q?zhn)是对的。那么范?.7的这个程序,(zhn)觉得结果是什么?
Ü. 范例4.7 AutoBoxDemo3.java
public class AutoBoxDemo3 {
public static void main(String[] args) {
Integer i1 = 200;
Integer i2 = 200;
if (i1 == i2)
System.out.println("i1 == i2");
else
System.out.println("i1 != i2");
}
}
l果是显C?/span>i1 != i2Q?/span>q有些o(h)人惊Ӟ两个范例语法完全一P只不q改个数D已Q结果却相反?/span>
其实q与==q算W的比较有关Q在W?章中介绍q?=是用来比较两个基本数据类型的变量值是否相{,事实?=也用于判断两个对象引用名U是否参考至同一个对象?/span>
在自动装时对于g–128?/span>127之间的|它们被装׃ؓ(f)Integer对象后,?x)存在内存中被重用,所以范?/span>4.6中?/span>==q行比较Ӟi1 ?/span> i2实际上参考至同一个对象。如果超q了(jin)?/span>–128?/span>127之间的|被装后?/span>Integer对象q不?x)被重用Q即相当于每ơ装时都新Z?/span>Integer对象Q所以范?/span>4.7使用==q行比较Ӟi1?/span>i2参考的是不同的对象?/span>
所以不要过分依赖自动装׃拆箱Q?zhn)q是必须知道基本数据cd与对象的差异。范?.7最好还是依正规的方式来写,而不是依赖编译器蜜糖(Compiler Sugar)。例如范?.7必须改写?.8才是正确的?/span>
Ü. 范例4.8 AutoBoxDemo4.java
public class AutoBoxDemo4 {
public static void main(String[] args) {
Integer i1 = 200;
Integer i2 = 200;
if (i1.equals(i2))
System.out.println("i1 == i2");
else
System.out.println("i1 != i2");
}
}
l果q次是显C?span style="color: red">i1 == i2?/strong>使用q样的写法,怿也会(x)比较攑ֿ(j)一些,对于q些方便但隐藏细节的功能到底要不要用呢?基本上只有一个原则:(x)如果(zhn)不定׃要用?/span>
.fnm的文件格式:(x) QF(tun)ield的信息)(j)
int: Field的个敎ͼ最ؓ(f)1Q最有一个Field("",false)Q在初始化的时候写?暂时不知道原?; 名称为空字符Ԍ未烦(ch)引, ?nbsp; ?nbsp; 量化。readVInt()d
String: byte String?nbsp;Field的名U?nbsp; byte指示该Field 是否被烦(ch)引,是否向量?Q值有Q?1Q?0Q?1Q第一?代表被烦(ch)引,W二个代表被向量?br />
String: byte Field 同上
.fdx的文件格式:(x)主要是提供对.fdt中存储的document的随卌?br />
long : W一个document?fdt文g中的位置
long: W二个document?fdt文g中的位置
.fdt的文件格式:(x) .fdt文g存储?jin)一pddocument的信?br /> VInt: 该document中的isStored属性ؓ(f)true的域的个?br /> (VInt:) 如果该field的isStored属性ؓ(f)true则得到该field的fieldNumberQ暂时不知道q个fieldNumber是怎么产生的,有什么用Q初步估计是按照field创徏的顺序生的Q每ơ再上一个field的fieldNumber基础上加1?br /> byte: 如果该field的isTokenized属性ؓ(f)true写入1否则写入false?br /> String: 该field的stringValue()倹{?br /> 一个documentl束Q下面的数据会(x)开始一个新的documentQ每个新的document的开始点的文件位|都?x)?fdx中有记蝲Q便于随卌?/span>