hashmap负载因子扩容为啥是2倍 JAVA开发常用的性能优化有哪些?
JAVA开发常用的性能优化有哪些?
如果你还没有 t没有系统整理,只是说一些共性的东西,说说自己的想法,有一些关于代码的细节,有的可能是一些方法和习惯。
避免创建过多的Java对象:例如,在循环中创建对象需要时间来创建和回收;
尽量使用局部变量,或者换句话说,根据变量的作用域在适当的地方定义变量;
最小化计算/运算:这里其实有很多需要注意的点。举个简单的例子,如果给定10个id查询数据库,是执行where id 10次还是执行where id in(list) 1次;
使用StringBuffer和Collection时,如果可以确认元素的长度/个数,尽量指定元素的长度/个数;因为默认值比较小,所以它们在扩展的时候会有一些性能损失;
基本数据类型转换为字符串,使用toString()而不是;
关闭finally块中的流,养成好习惯;
尽量少用正则表达式;如果非要用,尽量缓存模式;
如果要多线程,请使用线程池;
如果没有必要,用HashMap和ArrayList代替HashTable和Vector;根据需要选择是使用ArrayList还是Link
lru置换算法实现方法?
LRU是一种页面替换算法。对于内存中不被使用的数据块,称为LRU,操作系统会根据那些属于LRU的数据,将它们移出内存,腾出空间来加载其他数据。
LRU算法:最近最少使用。简单来说,就是把数据块中每次使用过的数据放在数据块的前端,然后它会存在最长的时间。剔除长数据,即数据块末尾的数据。这是LRU算法。
LRU的全称最近才被使用,这意味着它没有被使用的时间最长。
LRU算法的设计原则是,如果一个数据最近没有被访问过,那么将来也不太可能被访问。也就是说,当有限的空间被数据填满时,最长时间没有被访问的数据应该被淘汰。
实施LRU:
1.数组用于存储数据,每个数据项都标有访问时间戳。每次插入新数据项时,数组中现有数据项的时间戳都会递增,新数据项的时间戳设置为0并插入数组。每次访问数组中的数据项时,被访问数据项的时间戳被设置为0。当数组空间已满时,删除时间戳最大的数据项。
2.使用链表,每次插入新数据时,都会在链表的头部插入新数据;每次缓存命中(即数据被访问),数据被移动到链表的头部;然后当链表写满时,链表末尾的数据会被丢弃。
3.使用链表和散列表。当需要插入新数据项时,如果新数据项存在于链表中(一般称为hit),将节点移动到链表的头部;如果不存在,创建一个新的节点,放在链表的头部;如果缓存已满,删除链表的最后一个节点。访问数据时,如果数据项存在于链表中,则将节点移动到链表的头部,否则返回-1。这样,链表末尾的节点就是最长时间没有被访问的最后一个数据项。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。