`

java代码优化 -转

 
阅读更多

1、
For循环的优化
Replace...
for( int i = 0; i < collection.size(); i++ ) {
...
}
with...
for( int i = 0,int  n = collection.size(); i < n; i++ ) {
...
}
2、
字符串操作优化
在对字符串实行+操作时,最好用一条语句
// Your source code looks like...
String str = "profit = revenue( " + revenue +
") - cost( " + cost + ")";

// 编译方法
String str = new StringBuffer( ).append( "profit = revenue( " ).
append( revenue ).append( ") - cost( " ).
append( cost ).append( ")" ).toString( );
在循环中对字符串操作时改用StringBuffer.append()方法
String sentence = "";
for( int i = 0; i < wordArray.length; i++ ) {
sentence += wordArray[ i ];
}
优化为
StringBuffer buffer = new StringBuffer( 500 );
for( int i = 0,int n=
wordArray.length; i <n ; i++ ) {
buffer.append( wordArray[ i ] );
}
String sentence = buffer.toString( );


StringBuffer类可以用StringBuilder来代替
StringBuffer 和StringBuilder的区别:
java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。StringBuilder。与该类相比,通常应该优先使用 java.lang.StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。为了获得更好的性能,在构造 StirngBuffer 或 StirngBuilder 时应尽可能指定它的容量。当然,如果你操作的字符串长度不超过 16 个字符就不用了。 相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%-15% 左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因 此:除非你能确定你的系统的瓶颈是在 StringBuffer 上,并且确定你的模块不会运行在多线程模式下,否则还是用 StringBuffer 吧。
StringBuffer表示了可变的、可写的字符串。
有三个构造方法 :

StringBuffer (); //默认分配16个字符的空间
StringBuffer (int size); //分配size个字符的空间
StringBuffer (String str); //分配16个字符+str.length()个字符空间

你可以通过StringBuffer的构造函数来设定它的初 始化容量,这样可以明显地提升性能。这里提到的构造函数是StringBuffer(int length),length参数表示当前的StringBuffer能保持的字符数量。你也可以使用ensureCapacity(int minimumcapacity)方法在StringBuffer对象创建之后设置它的容量。首先我们看看StringBuffer的缺省行为,然后再找 出一条更好的提升性能的途径。
StringBuffer在内部维护一个字符数组,当你使用缺省的构造函数来创建StringBuffer对象 的时候,因为没有设置初始化字符长度,StringBuffer的容量被初始化为16个字符,也就是说缺省容量就是16个字符。当 StringBuffer达到最大容量的时候,它会将自身容量增加到当前的2倍再加2,也就是(2*旧值+2)。如果你使用缺省值,初始化之后接着往里面 追加字符,在你追加到第16个字符的时候它会将容量增加到34(2*16+2),当追加到34个字符的时候就会将容量增加到70(2*34+2)。无论何 事只要StringBuffer到达它的最大容量它就不得不创建一个新的字符数组然后重新将旧字符和新字符都拷贝一遍――这也太昂贵了点。所以总是给 StringBuffer设置一个合理的初始化容量值是错不了的,这样会带来立竿见影的性能增益。
StringBuffer初始化过程的调整的作用由此可见一斑。所以,使用一个合适的容量值来初始化StringBuffer永远都是一个最佳的建议。


3、关于乘法与除法
我有太多的东东适用于摩尔法则——它声明CPU功率每年成倍增长。"摩尔法则"表明每年由开发者所写的差劲的代码数量三倍增加,划去了摩尔法则的任何好处。
考虑下面的代码:
for (val = 0; val < 100000; val +=5) { shiftX = val * 8; myRaise = val * 2; }
如果我们狡猾的利用位移(bit),性能将会六倍增加。这是重写的代码:
for (val = 0; val < 100000; val += 5) { shiftX = val << 3; myRaise = val << 1; }
代替了乘以8,我们使用同等效果的左移3位。每一个移动相当于乘以2,变量myRaise对此做了证明。同样向右移位相当于除以2,当然这会使执行速度加快,但可能会使你的东东以后难于理解;所以这只是个建议,
,若用最好加上一些注释。
4、
array(数组) 和 ArryList的使用
array([]):最高效;但是其容量固定且无法动态改变;
ArrayList:容量可动态增长;但牺牲效率;
基于效率和类型检验,应尽可能使用array,无法确定数组大小时才使用ArrayList!
ArrayList是Array的复杂版本
ArrayList内部封装了一个Object类型的数组,从一般的意义来说,它和数组没有本质的差别,甚至于ArrayList的许多方法,如Index、IndexOf、Contains、Sort等都是在内部数组的基础上直接调用Array的对应方法。
ArrayList存入对象时,抛弃类型信息,所有对象屏蔽为Object,编译时不检查类型,但是运行时会报错。
注:jdk5中加入了对泛型的支持,已经可以在使用ArrayList时进行类型检查。
从这一点上看来,ArrayList与数组的区别主要就是由于动态增容的效率问题了
5、
不用new关键词创建类的实例
用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法。clone()方法不会调用任何类构造函数。
在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实例非常简单。例如,下面是Factory模式的一个典型实现:
上面的思路对于数组处理同样很有用。

Java代码 复制代码
  1. public static Credit getNewCredit() {   
  2. return new Credit();   
  3. }   
  4. 改进后的代码使用clone()方法,如下所示:   
  5. private static Credit BaseCredit = new Credit();   
  6. public static Credit getNewCredit() {   
  7. return (Credit) BaseCredit.clone();   
  8. }  

6、代码重构:增强代码的可读性。
例如:

Java代码 复制代码
  1. public class ShopCart {   
  2. private List carts ;   
  3. …   
  4. public void add (Object item) {   
  5. if(carts == null) {   
  6. carts = new ArrayList();   
  7. }   
  8. crts.add(item);   
  9. }   
  10. public void remove(Object item) {   
  11. if(carts. contains(item)) {   
  12. carts.remove(item);   
  13. }   
  14. }   
  15. public List getCarts() {   
  16. //返回只读列表   
  17. return Collections.unmodifiableList(carts);   
  18. }   
  19.   
  20. //不推荐这种方式   
  21. //this.getCarts().add(item);   
  22. }  

7、
当复制大量数据时,使用System.arraycopy()命令。

System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制。其函数原型是:
public static void arraycopy(Object src,
                             int srcPos,
                             Object dest,
                             int destPos,
                             int length)
src:源数组; srcPos:源数组要复制的起始位置;
dest:目的数组; destPos:目的数组放置的起始位置; length:复制的长度。
注意:src and dest都必须是同类型或者可以进行转换类型的数组.
有趣的是这个函数可以实现自己到自己复制,比如:
int[] fun ={0,1,2,3,4,5,6}; 
System.arraycopy(fun,0,fun,3,3);
则结果为:{0,1,2,0,1,2,6};
实现过程是这样的,先生成一个长度为length的临时数组,将fun数组中srcPos 
到srcPos+length-1之间的数据拷贝到临时数组中,再执行System.arraycopy(临时数组,0,fun,3,3).
分享到:
评论

相关推荐

    JAVA代码优化工具

    Java代码优化是提升应用程序性能的关键步骤,尤其是在大型企业级应用或者高性能服务中。优化能够减少内存消耗,提高程序运行速度,降低CPU使用率,并改善整体的用户体验。在Java开发领域,有多种工具可以帮助开发者...

    java2python--java代码转python工具

    Java到Python的转换工具,如"java2python",是一个重要的软件开发辅助工具,它能够帮助程序员将已有的Java代码转换成Python代码,以便在Python环境中执行或进行进一步的开发工作。这种转换过程涉及到多种语言特性和...

    java-WebSocket-1.3.7.jar和java-WebSocket-1.3.4.jar

    压缩包中的"Java-WebSocket-master"可能是该库的源代码仓库主分支,通常包含完整的源代码、测试用例、构建脚本等,这对于开发者来说非常有价值。通过查看源代码,开发者可以了解库内部的工作原理,定制自己的实现,...

    JAVA代码优化.txt

    JAVA代码优化 JAVA代码优化 JAVA代码优化 JAVA代码优化 JAVA代码优化

    mysql-connector-java-5.1.7-bin.jar

    在上述代码中,我们连接到本地的MySQL服务器(假设其正在3306端口上运行),并访问名为"mydatabase"的数据库。我们还执行了一个简单的SELECT查询,并打印出结果集中的数据。 值得注意的是,随着时间的推移,MySQL ...

    eclipse-java-2023-09-R-linux-gtk-aarch64.tar.gz

    Eclipse Java提供强大的代码编辑器,支持自动完成、代码分析和重构。内置的调试器允许逐行执行代码,设置断点,查看变量值,以及进行单元测试,确保代码质量。 8. **社区支持与扩展** Eclipse拥有庞大的开发者...

    java-1.8.0-openjdk.linux.x86_64

    OpenJDK项目的目标是提供一个免费、开放源代码的Java平台,使得开发者可以自由地查看、修改和分发代码,推动Java技术的发展。 在Linux环境下,Java 1.8.0 OpenJDK 包括了运行Java应用程序所需的全部组件,如Java...

    mysql-connector-java-5.1.40-bin.jar连接器

    MySQL Connector/J是MySQL数据库系统与Java应用程序之间的重要桥梁,它是一个实现了JDBC(Java Database Connectivity)规范的驱动程序,使得Java开发者能够通过编写Java代码来访问、操作MySQL数据库。在这个特定的...

    java-8-openjdk-amd64

    Java 8 OpenJDK AMD64 是一个针对64位AMD...总之,Java 8 OpenJDK AMD64是一个为64位AMD处理器优化的开源Java开发和运行环境,它结合了Java 8的诸多创新特性和OpenJDK的开源优势,为开发者提供了高效、灵活的开发选择。

    ckeditor-java-core-3.5.3

    此版本是"ckeditor-java-core-3.5.3",专门针对Java平台进行了优化,允许开发者在Java应用程序中集成CKEditor的功能。 1. **CKEditor简介** CKEditor是一款基于JavaScript的WYSIWYG(所见即所得)文本编辑器,最初...

    eclipse-java-2020-09-R-win32-x86_64.zip

    Eclipse是一个强大的平台,提供了一整套工具,如源代码编辑器、调试器、构建工具等,以帮助开发者高效地编写、测试和调试Java代码。它支持多种插件,可以扩展其功能以适应不同的开发需求,比如Web应用、移动应用或者...

    sonar-java-plugin-5.12.1.17771.rar

    总的来说,"sonar-java-plugin-5.12.1.17771.rar"是一个强大的Java代码质量检查工具,它通过FindBugs插件增强了SonarQube的分析能力,是构建高效、安全代码审查体系的重要组成部分。对于注重代码质量和安全性的公司...

    java代码优化大全

    ### Java代码优化技巧详解 #### 一、引言 在软件开发过程中,为了提升应用程序的性能,我们需要对Java代码进行优化。这是因为计算机系统的资源(如内存、CPU时间、网络带宽等)是有限的,而优化的目标就是使程序...

    java代码优化简介

    Java代码优化是对程序进行改进的过程,旨在提升程序的运行效率,减少资源的消耗。优化主要关注两个方面:减小代码体积和提高代码执行效率。在Java中,性能问题往往源于编程习惯而非语言本身。以下是一些针对Java代码...

    mysql-connector-java-5.1.15-bin.jar

    MySQL Connector/J是MySQL数据库与Java应用程序之间的重要桥梁,它是一个实现了Java Database Connectivity (JDBC) API的驱动程序,使得Java开发者能够通过编写Java代码来访问和操作MySQL数据库。"mysql-connector-...

    java代码优化编程

    【Java代码优化编程】 在Java编程中,代码优化是一个关键环节,目的是使程序在有限的资源下更高效地运行。优化主要包括两个方面:减小代码体积和提高代码执行效率。以下是一些关于如何提高Java代码效率的具体策略:...

    mysql-connector-java-5.1.22-bin.jar

    MySQL Connector/J是MySQL数据库与Java应用程序之间的重要桥梁,它是一个实现了Java Database Connectivity (JDBC) API的驱动程序,使得Java开发者能够通过编写Java代码来访问和操作MySQL数据库。标题中的"mysql-...

    java-sizeof-0.0.4:一个查看java对象占用内存大小

    Java 是一种广泛使用的编程语言,以其跨平台的特性、丰富的类库和强大的性能著称。在Java中,理解和管理...通过"java-sizeof-0.0.4"这样的工具,开发者可以更准确地评估和优化代码,从而提升整个系统的效率和稳定性。

    java代码-amr转换mp3.rar

    本示例中的"java代码-amr转换mp3.rar"文件提供了一个Java程序,用于将AMR编码的音频文件转换为更通用的MP3格式。下面我们将深入探讨这个过程涉及的关键知识点。 1. **AMR与MP3格式**: - AMR(Adaptive Multi-Rate...

Global site tag (gtag.js) - Google Analytics