Java SE API know how
集合API
根据算法访选择合适集合
linkedlist不适合搜索
随机访问数据用hashmap
数据保持有序使用treemap
通过索引访问使用数组集合
同步和非同步
访问性能统计
与简单的非同步访问相比,使用任何数据保护技术都会有较小的损失
设置集合大小
清楚数据的量然后分配大小,扩容也许是好的选择,如果不确定的话
集合与内存效率
元素稀疏的集合调整大小和确认是否需要一个集合存储数据
关于数组排序的快排和插入排序的选择通过确认数组的大小
Lambda和匿名类
lambda在编程上的受益很难量化
性能分析
匿名类会每次创建一个新对象,并不会造成性能
但是会被类加载进行加载使用
lambda并不会在循环中每次迭代创建新的对象
lambda工作方式 在JVM层面
函数描述符和invokedynamic指令
函数描述符是Lambda表达式类型,包括方法签名和返回类型
(int, int) -> int
两个参数类型和一个返回类型结果
invokedynamic 是一种动态调用指令
在运行时动态解析方法,并将其绑定到一个方法句柄(method handle)上
在lambda表达式的实现中,编译器会将表达式转换为invokedynamic指令,
让后将其绑定到一个方法句柄上
Lambda表达式的编译过程
解析表达式的参数和返回类型,生成函数描述符
将描述符转换为方法句柄类型,例如MethodType类型
根据描述符和方法句柄类型,使用MethodHandles.lookup()方法获取一个方法句柄
将方法句柄和invokedynamic指令结合起来,生成一个LambdaMetafactory对象
调用LambdaMetafactory的buildCallSite()方法生成一个CallSite对象
调用CallSite的getTarget方法获取一个方法句柄
将方法句柄绑定到表达式上得到一个函数式接口实例
real truth happening in your jvm
TIPS
类加载的性能在类路径很长的情况下会非常耗时
如果使用lambda在启动有很多类加载的时候会有显著的性能提升