`

Java代码中可以优化性能的小细节

阅读更多

避免对boolean类型的判定
反例:

<figure class="highlight smalltalk"><table><tr> <td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td> <td class="code"><pre><span class="line">if(<span class="comment">"a"</span>.equles(<span class="comment">"a"</span>)==<span class="keyword">true</span>)`{</span><br><span class="line">}</span><br></pre></td> </tr></table></figure>

正例:

<figure class="highlight stylus"><table><tr> <td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td> <td class="code"><pre><span class="line"><span class="function"><span class="title">if</span><span class="params">(Objects.equles(<span class="string">"a"</span>,<span class="string">"a"</span>)</span></span>)`{</span><br><span class="line">}</span><br></pre></td> </tr></table></figure>

**多用条件判断符 **

反例:

<figure class="highlight coffeescript"><table><tr> <td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td> <td class="code"><pre><span class="line"><span class="keyword">if</span>(a&lt;<span class="number">0</span>)`<span class="javascript">{</span></span><br><span class="line"><span class="javascript"> <span class="keyword">return</span> <span class="number">0</span>;</span></span><br><span class="line"><span class="javascript">}<span class="keyword">else</span>{</span></span><br><span class="line"><span class="javascript"> <span class="keyword">return</span> <span class="number">1</span>;</span></span><br><span class="line"><span class="javascript"> }</span></span><br><span class="line"><span class="javascript"></span>``<span class="javascript"></span>` </span><br><span class="line">正例:</span><br></pre></td> </tr></table></figure>

a<0?0:1;

<figure class="highlight asciidoc"><table><tr> <td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td> <td class="code"><pre><span class="line"></span><br><span class="line">*<span class="strong">*避免使用instanceof、避免把子类向父类转型*</span><span class="strong">*</span></span><br><span class="line"><span class="strong">掌握好多态即可</span></span><br><span class="line"><span class="strong"></span></span><br><span class="line"><span class="strong"></span></span><br><span class="line"><span class="strong"></span></span><br><span class="line"><span class="strong">*</span><span class="strong">*建议多使用局部变量*</span><span class="strong">*</span></span><br><span class="line"><span class="strong">局部变量保存在栈中,占用的内存随着方法的执行完毕而被释放</span></span><br><span class="line"><span class="strong"></span></span><br><span class="line"><span class="strong">*</span><span class="strong">*多使用位运算代替算术运算*</span><span class="strong">*</span></span><br><span class="line"><span class="strong">就是可读性差点</span></span><br><span class="line"><span class="strong"></span></span><br><span class="line"><span class="strong">*</span><span class="strong">*一维数组和二维数组的恩怨情仇*</span><span class="strong">*</span></span><br><span class="line"><span class="strong">保存同样的数据使用一维数组和二维数组的区别是前者以时间换空间后者是以空间换时间</span></span><br><span class="line"><span class="strong"></span></span><br><span class="line"><span class="strong">*</span><span class="strong">*不要经常使用取反操作符*</span><span class="strong">*</span></span><br><span class="line"><span class="strong"></span></span><br><span class="line"><span class="strong">反例:</span></span><br></pre></td> </tr></table></figure>

if(!a<0)`{
return 0;
}else{
return 1;
}

<figure class="highlight plain"><table><tr> <td class="gutter"><pre><span class="line">1</span><br></pre></td> <td class="code"><pre><span class="line">正例:</span><br></pre></td> </tr></table></figure>

if(a>=0)`{
return 0;
}else{
return 1;
}

<figure class="highlight zephir"><table><tr> <td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td> <td class="code"><pre><span class="line"></span><br><span class="line">**快速操作一个超大<span class="keyword">List</span>的连续性数据**</span><br><span class="line"></span><br><span class="line">使用集合的`<span class="keyword">List</span>&lt;E&gt; subList(<span class="keyword">int</span> fromIndex,<span class="keyword">int</span> toIndex)`方法可以返回一个超大<span class="keyword">List</span>的一段连续性数据,此时对这个subList的所有操作比如`clear()`等操作都会影响到原<span class="keyword">List</span></span><br><span class="line"></span><br><span class="line">**当一个方法的返回值是<span class="keyword">List</span>的时候请返回一个size为<span class="number">0</span>的<span class="keyword">list</span>而不是<span class="keyword">null</span>从而避免空指针异常**</span><br><span class="line"></span><br><span class="line">**单个字符串连接时使用单引号代替双引号**</span><br><span class="line">反例:</span><br></pre></td> </tr></table></figure>

“abc”+“d”;

<figure class="highlight plain"><table><tr> <td class="gutter"><pre><span class="line">1</span><br></pre></td> <td class="code"><pre><span class="line">正例:</span><br></pre></td> </tr></table></figure>

“abc”+‘d’;

<figure class="highlight asciidoc"><table><tr> <td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td> <td class="code"><pre><span class="line">*<span class="strong">*大量字符串拼接时使用StringBuffer代替+*</span><span class="strong">*</span></span><br><span class="line"><span class="strong"></span></span><br><span class="line"><span class="strong">*</span><span class="strong">*切割字符串的时候使用StringTokenizer代替split*</span><span class="strong">*</span></span><br><span class="line"><span class="strong"></span></span><br><span class="line"><span class="strong">*</span><span class="strong">*提前计算出需要循环的次数*</span><span class="strong">*</span></span><br><span class="line"><span class="strong">反例:</span></span><br></pre></td> </tr></table></figure>

for(int i=0i<a.size();;i++){
}

<figure class="highlight plain"><table><tr> <td class="gutter"><pre><span class="line">1</span><br></pre></td> <td class="code"><pre><span class="line">正例:</span><br></pre></td> </tr></table></figure>

for(int i=0,n=a.size();i<n;i++){
}

<figure class="highlight asciidoc"><table><tr> <td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td> <td class="code"><pre><span class="line"></span><br><span class="line">*<span class="strong">*减少不必要的需要循环的次数*</span><span class="strong">*</span></span><br><span class="line"><span class="strong">反例:</span></span><br></pre></td> </tr></table></figure>

int index=-1;
for(int i=0,n=a.size();i<n;i++){
if(a.get(i)==3){
index=i;
}
}

<figure class="highlight plain"><table><tr> <td class="gutter"><pre><span class="line">1</span><br></pre></td> <td class="code"><pre><span class="line">正例:</span><br></pre></td> </tr></table></figure>

int index=-1;
for(int i=0,n=a.size();i<n;i++){
if(a.get(i)==3){
index=i;
break;
}
}

**不要在循环中改变数组/List的大小**

**使用`System.arrayCopy`进行复制数组**

**使用Buffer进行IO操作**

**释放资源的代码要放在finally代码块中**

**多用java.util.Obects工具类**




<h4 style="color:red">推荐阅读</h4>
 


1. [SpringCloud学习系列汇总](https://mp.weixin.qq.com/s/TL4w0u6QA-wFx19IH9Xs6A)    
2. [为什么一线大厂面试必问redis,有啥好问的?](https://mp.weixin.qq.com/s/NSojCEA-lF8ocR1XeuXbsg)    
3. [多线程面试必备基础知识汇总](https://mp.weixin.qq.com/s/c3ngvdAc6lAs4d1sIdg16Q/)  
4. [Java集合源码分析汇总-JDK1.8](https://mp.weixin.qq.com/s/UAGihOEUPmFnwrgkSJZqpQ)      
5. [Linux常用命令速查-汇总篇](https://mp.weixin.qq.com/s/WG4ZWfId-MRslWtcDtx0aA)      
6. [JVM系列文章汇总](https://mp.weixin.qq.com/s/uDftoMTwJqk7H9bfQaa0sw)      
7. [MySQL系列文章汇总](https://mp.weixin.qq.com/s/SUV1DRSFhOIksj9C_qC7aA) 
7. [RabbitMQ系列文章汇总](https://mp.weixin.qq.com/s/rDqhdBk879neFM_CZzK9Yw)    


<h4 style="color:red">博客所有文章首发于公众号《Java学习录》转载请保留
扫码关注公众号即可领取2000GJava学习资源 </h4>



![1](https://shiyujun.cn/img/gongzhonghao.jpg)
0
0
分享到:
评论

相关推荐

    35个Java代码性能优化总结

    代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,...

    [Java算法-排序练习]小范围排序.java

    此外,文档还包括一个逐步指南,介绍了如何在Java中实现小范围排序,包括详细的代码示例和实现细节。 文档还涵盖了高级主题,如如何优化代码以提高性能以及如何处理大的数组。该资源包括实用练习,让读者可以练习在...

    自己动手写Java虚拟机 (Java核心技术系列)@

    本书摒弃了传统的以解读枯燥的Java虚拟机规范文档和分析繁琐的Java虚拟机源代码的方式来讲解Java虚拟机,取而代之的是,以实践的方式,引导读者如何从零开始构建和实现一个Java虚拟机,整个过程不仅能让读者做到对...

    java版飞机大战源码-java-performance:Java系统性能优化实战

    看了李兄的第4章“代码性能优化”,里面提到了很多代码优化技巧,非常实用,很多技巧也是t-io经常在用的,比如预编译、预编码、批处理、压缩等。 高性能的程序,都没有容易二字,都是一个细节一个细节抠出来的,希望...

    [Java算法设计]-递归阶乘.java

    此外,文档还包括一个逐步指南,介绍如何在Java中实现递归阶乘的代码,包括详细的代码示例和实现细节。 文档还涵盖了高级主题,如如何优化代码以提高性能以及如何处理大的阶乘。该资源包括实用练习,让读者可以练习...

    [Java算法-排序]希尔排序.java

    此外,文档还包括一个逐步指南,介绍如何在Java中实现希尔排序代码,包括详细的代码示例和实现细节。 文档还涵盖了高级主题,如如何优化代码以提高性能以及如何处理大的数组。该资源包括实用练习,让读者可以练习在...

    [Java算法-排序练习]重复值判断.java

    此外,文档还包括一个逐步指南,介绍了如何在Java中实现重复值判断代码,包括详细的代码示例和实现细节。 文档还涵盖了高级主题,如如何优化代码以提高性能以及如何处理大的数组。该资源包括实用练习,让读者可以...

    基于Vue的电影在线预订与管理系统-后台java代码(ssm)(毕业设计).zip

    笔记资料:整理了Java毕业设计中常见的问题和解决方案,包括数据库设计、界面美化、性能优化等方面的技巧。这些笔记资料均由经验丰富的程序员撰写,可为您提供宝贵的经验分享和指导。 视频教程:为了帮助您更好地...

    [Java算法-排序]冒泡排序.java

    此外,文档还包括一个逐步指南,介绍了如何在Java中实现冒泡排序,包括详细的代码示例和实现细节。 文档还涵盖了高级主题,如如何优化代码以提高性能以及如何处理大的数组。该资源包括实用练习,让读者可以练习在...

    [Java算法设计]-二叉树打印联系.java

    文档还涵盖了高级主题,如如何处理二叉树中的空节点以及如何优化代码以提高性能。该资源包括实用练习,让读者可以练习在Java中实现二叉树打印,并提供解决方案以帮助读者检查自己的工作并深入理解所学内容。 无论您...

    [Java算法-排序]选择排序.java

    此外,文档还包括一个逐步指南,介绍了如何在Java中实现选择排序,包括详细的代码示例和实现细节。 文档还涵盖了高级主题,如如何优化代码以提高性能以及如何处理大的数组。该资源包括实用练习,让读者可以练习在...

    [Java算法设计]-阶乘求和.java

    此外,文档还包括一个逐步指南,介绍如何在Java中实现代码,包括详细的代码示例和实现细节。 文档还涵盖了高级主题,如如何优化代码以提高性能以及如何处理大的阶乘。该资源包括实用练习,让读者可以练习在Java中...

    [Java算法-排序]快速排序.java

    此外,文档还包括一个逐步指南,介绍了如何在Java中实现快速排序,包括详细的代码示例和实现细节。 文档还涵盖了高级主题,如如何优化代码以提高性能以及如何处理大的数组。该资源包括实用练习,让读者可以练习在...

    [Java算法设计]-逆序数字.java

    此外,文档还包括一个逐步指南,介绍如何在Java中实现逆序数字的代码,包括详细的代码示例和实现细节。 文档还涵盖了高级主题,如如何处理大的数字以及如何优化代码以提高性能。该资源包括实用练习,让读者可以练习...

    [Java算法-排序]-堆排序.java

    此外,文档还包括一个逐步指南,介绍了如何在Java中实现堆排序,包括详细的代码示例和实现细节。 文档还涵盖了高级主题,如如何优化代码以提高性能以及如何处理大的数组。该资源包括实用练习,让读者可以练习在Java...

    [Java算法-排序]-插入排序.java

    此外,文档还包括一个逐步指南,介绍了如何在Java中实现插入排序,包括详细的代码示例和实现细节。 文档还涵盖了高级主题,如如何优化代码以提高性能以及如何处理大的数组。该资源包括实用练习,让读者可以练习在...

    [Java算法-排序]归并排序.java

    此外,文档还包括一个逐步指南,介绍如何在Java中实现归并排序,包括详细的代码示例和实现细节。 文档还涵盖了高级主题,如如何优化代码以提高性能以及如何处理大的数组。该资源包括实用练习,让读者可以练习在Java...

    [Java算法-排序练习]有序矩阵查找.java

    此外,文档还包括一个逐步指南,介绍了如何在Java中实现有序矩阵查找,包括详细的代码示例和实现细节。 文档还涵盖了高级主题,如如何优化代码以提高性能,以及如何处理大的矩阵。该资源包括实用练习,让读者可以...

    [Java算法-排序练习]计数排序.java

    此外,文档还包括一个逐步指南,介绍了如何在Java中实现计数排序,包括详细的代码示例和实现细节。 文档还涵盖了高级主题,如如何优化代码以提高性能以及如何处理大的数组。该资源包括实用练习,让读者可以练习在...

Global site tag (gtag.js) - Google Analytics