「Java」CRUD是我的核心战斗力,复制粘贴是我的左膀右臂。( 二 )


(1)在4096 的基础上 , 再申请8194个大小的字符数组 , 加起来相当于一次申请了12290个大小的字符数组 , 如果一开始能指定5000个大小的字符数组 , 就节省了一倍以上的空间;
(2)把原来的4096个字符拷贝到新的字符数组中去 。
这样 , 既浪费内存空间又降低代码运行效率 。 所以 , 给底层以数组实现的集合、工具类设置一个合理的初始化容量是错不了的 , 这会带来立竿见影的效果 。 但是 , 注意 , 像HashMap这种是以数组+链表实现的集合 , 别把初始大小和你估计的大小设置得一样 , 因为一个table上只连接一个对象的可能性几乎为0 。 初始大小建议设置为2的N次幂 , 如果能估计到有2000个元素 , 设置成new HashMap(128)、new HashMap(256)都可以 。
10、及时清除不再需要的会话为了清除不再活动的会话 , 许多应用服务器都有默认的会话超时时间 , 一般为30分钟 。 当应用服务器需要保存更多的会话时 , 如果内存不足 , 那么操作系统会把部分数据转移到磁盘 , 应用服务器也可能根据MRU(最近最频繁使用)算法把部分不活跃的会话转储到磁盘 , 甚至可能抛出内存不足的异常 。 如果会话要被转储到磁盘 , 那么必须要先被序列化 , 在大规模集群中 , 对对象进行序列化的代价是很昂贵的 。 因此 , 当会话不再需要时 , 应当及时调用HttpSession的invalidate方法清除会话 。
11、实现RandomAccess接口的集合比如ArrayList , 应当使用最普通的for循环而不是foreach循环来遍历这是JDK推荐给用户的 。 JDK API对于RandomAccess接口的解释是:实现RandomAccess接口用来表明其支持快速随机访问 , 此接口的主要目的是允许一般的算法更改其行为 , 从而将其应用到随机或连续访问列表时能提供良好的性能 。 实际经验表明 , 实现RandomAccess接口的类实例 , 假如是随机访问的 , 使用普通for循环效率将高于使用foreach循环;反过来 , 如果是顺序访问的 , 则使用Iterator会效率更高 。 可以使用类似如下的代码作判断:
foreach循环的底层实现原理就是迭代器Iterator , 参见Java语法糖1:可变长度参数以及foreach循环原理 。 所以后半句”反过来 , 如果是顺序访问的 , 则使用Iterator会效率更高”的意思就是顺序访问的那些类实例 , 使用foreach循环去遍历 。
12、使用同步代码块替代同步方法这点在多线程模块中的synchronized锁方法块一文中已经讲得很清楚了 , 除非能确定一整个方法都是需要进行同步的 , 否则尽量使用同步代码块 , 避免对那些不需要进行同步的代码也进行了同步 , 影响了代码执行效率 。
13、程序运行过程中避免使用反射关于 , 请参见反射 。 反射是Java提供给用户一个很强大的功能 , 功能强大往往意味着效率不高 。 不建议在程序运行过程中使用尤其是频繁使用反射机制 , 特别是Method的invoke方法 , 如果确实有必要 , 一种建议性的做法是将那些需要通过反射加载的类在项目启动的时候通过反射实例化出一个对象并放入内存—-用户只关心和对端交互的时候获取最快的响应速度 , 并不关心对端的项目启动花多久时间 。
14、不要创建一些不使用的对象 , 不要导入一些不使用的类
这毫无意义 , 如果代码中出现”The value of the local variable i is not used”、”The import java.util is never used” , 那么请删除这些无用的内容 。
【「Java」CRUD是我的核心战斗力,复制粘贴是我的左膀右臂。】15、使用带缓冲的输入输出流进行IO操作带缓冲的输入输出流 , 即BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream , 这可以极大地提升IO效率
16、不要让public方法中有太多的形参public方法即对外提供的方法 , 如果给这些方法太多形参的话主要有两点坏处:1、违反了面向对象的编程思想 , Java讲求一切都是对象 , 太多的形参 , 和面向对象的编程思想并不契合2、参数太多势必导致方法调用的出错概率增加至于这个”太多”指的是多少个 , 3、4个吧 。 比如我们用JDBC写一个insertStudentInfo方法 , 有10个学生信息字段要插如Student表中 , 可以把这10个参数封装在一个实体类中 , 作为insert方法的形参 。


推荐阅读