socket 发送100个数据 完整性
可以在包头加个字段表示数据的长度, 验证数据的长度值
或者将数据实体转换为hashcode, 利用一些数据验证算法
比如MD5,是一个将任意长度的数据字符串转化成短的固定长度的值的单向操作
ArrayList 性能问题
Vector 是线程安全的, ArrayList不是线程安全的
在更多元素添加进来时会请求更大的空间
超过预定义大小时, 会扩容, Vector每次请求其大小的双倍空间,ArrayList请求其大小的1.5倍空间
若可以预估数据量的话,分配一个较大的初始值属于最佳实践, 可以减少调整大小的开销。
可以用代码测试一下
public class Main {
public static void main(String[] args) {
int size = 1000000;
long time = System.currentTimeMillis();
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < size; i++) {
list.add(i);
}
System.out.println("bad------" + (System.currentTimeMillis() - time));
time = System.currentTimeMillis();
List<Integer> alist = new ArrayList<Integer>(size);
for (int i = 0; i < size; i++) {
list.add(i);
}
System.out.println("good-----" + (System.currentTimeMillis() - time));
}
}
输出结果为
bad——256
good—–203Note
但是我试了上面的size值, 发现有时候bad的性能反而比good好
sql 语句查询处理 (query processing) 底层执行过程
它指从数据库中提取数据时涉及的一系列活动, 这些活动包括 将用高层数据库语言表示的查询语句翻译为能在文件系统的物理层使用的表达式, 为优化查询而进行各种转换, 以及查询的实际执行
基本步骤为:
1. 语言分析以及翻译
2. 优化
3. 执行
语言分析以及翻译
类似于编译器的语法分析器所做的工作, 检查查询的语法, 验证查询中出现的关系名是数据库中的关系名
如果查询用视图表示的, 翻译阶段还用定义该视图的关系式替换对该视图的引用
优化
给定查询的不同执行计划会有不同的代价, 我们不能寄希望用户写出最高效率执行计划的查询语句, 构造具有最小查询代价的查询执行代价的查询执行计划应当是系统的责任