Java编码技巧之高效代码50例

  • 时间:
  • 浏览:1
  • 来源:uu快3app_uu快3预测苹果

使用系统程序安全类,比买车人实现的同步代码更简洁更高效。

正例:

正例:

正例:

反例:

JDK提供的土办法都可否 一步指定集合的容量,处置多次扩容浪费时间和空间。并肩,哪几种土办法的底层也是调用System.arraycopy土办法实现,进行数据的批量拷贝效率更高。

反例:

同步代码块是有性能开销的,怎样才能让 选用都可否 合并为同并肩步代码块,就应该尽量合并为同并肩步代码块。

正例:

在有兩个土办法中,怎样才能让 必须一小要素的逻辑是时要同步控制的,怎样才能让 同步控制了整个土办法会影响执行效率。有些有些,尽量减少同步代码块的范围,只对时要进行同步的代码进行同步。

反例:

反例:

注意:使用Spring的AOP行态时,时要对Bean进行动态代理,怎样才能让 Bean类加进去去了final修饰,会是因为异常。

反例:

正例:

正例:

推荐使用System.arraycopy拷贝数组,也都可否 使用Arrays.copyOf拷贝数组。

直接赋值常量值,怎样才能让创建了有兩个对象引用,而你本身 对象引用指向常量值。

反例:

正例:

反例:

建议:集合应该提供有兩个toArray(Class<T> clazz)土办法,处置无用的空数组初始化(new T[0])。

正则表达式匹配效率较低,尽量使用字符串匹配操作。

正例:

相对于条件表达式,异常的处置效率更低。

直接捕获对应的异常,处置用instanceof判断,效率更高代码更简洁。

反例:

反例:

正例:

正例:

反例:

正例:

正例:

正例:

不可变的静态常量,真是时要支持多系统程序访问,也都可否 使用非系统程序安全类。

正例:

世界上必须本身物质:高效率和低效率;世界上必须本身人:高效率的人和低效率的人。——萧伯纳

反例:

JSON提供把对象转化为JSON字符串、把JSON字符串转为对象的功能,于是被有些人用来转化对象。你本身 对象转化土办法,真是在功能上那么问題,怎样才能让 在性能上却存在问題。

使用缓冲流BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream等,都可否 大幅减少IO次数并提升IO效率。

正例:

针对缓冲区,Java虚拟机时要花时间生成对象,时要花时间进行垃圾回收处置。有些有些,尽量重复利用缓冲区。

土办法调用会引起入栈和出栈,是因为消耗更多的CPU和内存,应当尽量处置暂且要的函数封装。当然,为了使代码更简洁、更清晰、更易维护,增加一定的土办法调用所带来的性能损耗是值得的。

正例:

注意:使用Spring的AOP行态时,时要对Bean进行动态代理,怎样才能让 土办法加进去去了final修饰,将还会被代理。

正例:

同理,世界上必须本身代码:高效代码和低效代码;世界上必须本身人:编写高效代码的人和编写低效代码的人。怎样才能编写高效代码,是每个研发团队都面临的有兩个重大问題。有些有些,作者根据实际经验,查阅了血块资料,总结了"Java高效代码100例",让每有兩个Java系统程序员都能编写出"高效代码"。

使用size土办法来检测空逻辑上那么问題,但使用isEmpty土办法使得代码更易读,怎样才能让 都可否 获得更好的性能。任何isEmpty土办法实现的时间复杂性度都会O(1),怎样才能让 有些size土办法实现的时间复杂性度有怎样才能让 是O(n)。

用移位操作都可否 极大地提高性能。对于乘除2^n(n为正整数)的正整数计算,都可否 用移位操作来代替。

用反射赋值对象,主要优点是节省了代码量,主要缺点却是性能有所下降。

反例:

反例:

土办法指定final修饰符,都可否 让土办法不都可否 被重写,Java编译器会寻找怎样才能让 内联所有的final土办法。内联对于提升Java运行效率作用重大,具体可参见Java运行期优化,都都都可否 使性能平均提高100%。

正例:

协议编程,都可否 @NonNull和@Nullable标注参数,否有有遵循全凭调用者自觉。

反例:

反例:

在JDK类库的土办法中,有些有些土办法返回值都采用了基本数据类型,首先是为了处置暂且要的装箱和拆箱,其次是为了处置返回值的空指针判断。比如:Collection.isEmpty()和Map.size()。

反例:

正例:

正例:

反例:

Java集合初始化时都会指定有兩个默认大小,当默认大小不再满足数据需求时就会扩容,每次扩容的时间复杂性度有怎样才能让 是O(n)。有些有些,尽量指定预知的集合大小,就能处置或减少集合的扩容次数。

正例:

字符串的长度不选用,而字符的长度固定为1,查找和匹配的效率自然提高了。

正例:

在老版JDK中,建议“尽量暂且在循环体内定义变量”,怎样才能让 在新版的JDK中怎样才能让 做了优化。通过对编译后的字节码分析,变量定义在循环体外和循环体内那么本质的区别,运行效率基本上是一样的。反而,根据“ 局部变量作用域最小化 ”原则,变量定义在循环体内更科学更便于维护,处置了延长大对象生命周期是因为延缓回收问題 。

使用""+进行字符串转化,使用方便怎样才能让 效率低,建议使用String.valueOf.

多系统程序中有兩个必要的开销:系统程序的创建和上下文切换。采用系统程序池,都可否 尽量地处置哪几种开销。

加进去每个转化土办法中的缓冲区申请,申请有兩个缓冲区给每个转化土办法使用。从时间上来说,节约了血块缓冲区的申请释放时间;从空间上来说,节约了血块缓冲区的临时存储空间。

正例:

反例:

反例:

反例:

正例:

正例:

反例:

反例:

if-else语句,每个if条件语句都会加装计算,直到if条件语句为true为止。switch语句进行了跳转优化,Java中采用tableswitch或lookupswitch指令实现,对于多常量选用分支处置效率更高。经过试验证明:在每个分支经常出现概率相同的状况下,低于兩个分支时if-else语句效率更高,高于兩个分支时switch语句效率更高。

正例:

正例:

其中,都可否 根据实际状况手动指定缓冲流的大小,把缓冲流的缓冲作用发挥到最大。

对于列表,可分为随机访问和非随机访问两类,都可否 用否有有实现RandomAccess接口判断。随机访问列表,直接通过get获取数据不影响效率。而非随机访问列表,通过get获取数据效率极低。

初始化时,指定缓冲区的预期容量大小,处置多次扩容浪费时间和空间。

其中,使用setLength土办法让缓冲区重新从0结束了了。

正例:

反例:

多有兩个类就时要多一份类加载,有些有些尽量处置定义暂且要的子类。

反例:

String是final类,内容不可修改,有些有些每次字符串拼接都会生成有兩个新对象。StringBuilder在初始化时申请了一块内存,很久的字符串拼接都会这块内存中执行,还会申请新内存和中成新对象。

反例:

反例:

反例:

不可变的成员变量,真是时要支持多系统程序访问,也都可否 使用非系统程序安全类。

反例:

正例:

正例:

反例:

正例:

反例:

正例:

正例:

Java 中的基本数据类型double、float、long、int、short、char、boolean,分别对应包装类Double、Float、Long、Integer、Short、Character、Boolean。 JVM支持基本类型与对应包装类的自动转换,被称为自动装箱和拆箱。装箱和拆箱都会时要CPU和内存资源的,有些有些应尽量处置使用自动装箱和拆箱。

正例:

反例:

正例:

反例:

正例:

正例:

反例:

正例:

正例:

使用!取反会多一次计算,怎样才能让 那么必要则优化掉。

将集合转换为数组有2种形式:toArray(new T[n])和toArray(new T[0])。在旧的Java版本中,建议使用toArray(new T[n]),怎样才能让 创建数组时所需的反射调用非常慢。在OpenJDK6后,反射调用是内在的,使得性能得以提高,toArray(new T[0])比toArray(new T[n])效率更高。此外,toArray(new T[n])比toArray(new T[0])多获取一次列表大小,怎样才能让 计算列表大小耗时过长,也会是因为toArray(new T[n])效率降低。

在Java集合类库中,List的contains土办法普遍时间复杂性度是O(n),而HashSet的时间复杂性度为O(1)。怎样才能让 时要频繁调用contains土办法查找数据,都可否 先将List转加进去HashSet。

转化Object数组时,那么必要使用toArray[new Object[0]],都可否 直接使用toArray()。处置了类型的判断,也处置了空数组的申请,有些有些效率会更高。

备注:怎样才能让 业务复杂性,都可否 采用Map实现策略模式。

反例:

反例:

反例:

为了提高系统程序效率,在设计上尽量使用同一缓冲区。

正例:

静态土办法的好处怎样才能让还会生成类的实例就都可否 直接调用。静态土办法不再属于某个对象,怎样才能让属于它所在的类。只时要通过其类名就都可否 访问,不时要再消耗资源去反复创建对象。即便在类内部内部结构的私有土办法,怎样才能让 那么使用到类成员变量,也应该声明为静态土办法。

反例:

正例:

真是,不管列表支不支持随机访问,都应该使用迭代进行遍历。

反例:

反例:

反例:

在函数内,基本类型的参数和临时变量都保存在栈(Stack)中,访问效率较快;对象类型的参数和临时变量的引用都保存在栈(Stack)中,内容都保存在堆(Heap)中,访问效率较慢。在类中,任何类型的成员变量都保存在堆(Heap)中,访问效率较慢。

反例:

正例:

提取公共表达式,只计算一次值,怎样才能让 重复利用值。

正例:

反例:

正例:

怎样才能让 时要先判断存在再进行获取,都可否 直接获取并判断空,从而处置了二次查找操作。

反例:

反例:

正例:

反例:

当循环体抛出异常后,还会循环继续执行时,那么必要在循环体中捕获异常。怎样才能让 ,越多的捕获异常会降低系统程序执行效率。

为类指定final修饰符,都可否 让该类不都可否 被继承。怎样才能让 指定了有兩个类为final,则该类所有的土办法都会final的,Java编译器会寻找怎样才能让 内联所有的final土办法。内联对于提升Java运行效率作用重大,具体可参见Java运行期优化,都都都可否 使性能平均提高100%。

本文是《 Java编程技巧之数据行态 》的姊妹篇,作者在这里怎样才能让抛砖引玉,希望大伙进行补充完善。

反例:

正例:

反例:

在类的每个对象实例中,每个成员变量都会一份副本,而成员静态常量必须一份实例。

使用非系统程序安全类,处置了暂且要的同步开销。

反例:

正例:

正例:

正例:

正例:

反例:

正例:

反例:

反例:

正例:

协议编程,都可否 @NonNull和@Nullable标注参数,否有有遵循全凭实现者自觉。

反例:

反例:

对于大多数刚接触JDK8的同学来说,都会认为Lambda表达式怎样才能让匿名内部内部结构类的语法糖。实际上, Lambda表达式在大多数虚拟机中采用invokeDynamic指令实现,相对于匿名内部内部结构类在效率上会更高有些。

正例:

正例:

注意:所有的private土办法会隐式地被指定final修饰符,有些有些暂且再为其指定final修饰符。

反例:

原理与"暂且使用循环拷贝集合,尽量使用JDK提供的土办法拷贝集合"例如。

作为一名长期奋战在业务一线的"IT民工",那么怎样才能让 去研究哪几种高深莫测的"理论",必须专注于身旁看得见摸得着的"技术",致力于做到"干一行、爱一行、专一行、精一行"。

直接迭代时要使用的集合,还会通过其它操作获取数据。