自己总结的在编程中的一些小技巧

来源:互联网 发布:sportsdt体育大数据 编辑:程序博客网 时间:2024/05/29 19:25
此贴不定时更新

1、 在循环中不要新建引用,放到循环外建立,循环内使用,虽然对象是存在堆里面,但引用会压入栈,So……

2 、同样是循环,在设立循环条件时,不要以重复访问对象为条件,缓存进栈,虽然是个小细节,养成习惯总是好的,例如:

    Object[] temp=new Object[100];    for(int i=0,n=temp.length;i<n;i++){        ......    }

3、 对于final的使用,在数组上其实很没意义,数组的引用不可再变,但是成员仍然可以变化,但是,此时数组内容也不会变,只不过变化的那个成员不再属于数组了而已,如例

    String str="old";    final String[] temp={str};    // a error    // temp=new String[3];    str=new String("new");    /**     * now      * temp[0]=="old"     * str=="new";     */

如上,

4、 继续上面,对于经常使用的常量请加上final,JVM在运行时会缓存final变量,并且在多线程的共享不需要增加同步开销,不可变性相对就提高了安全性。

5、 说到多线程,对于同步synchronized关键字,尽量使用同步代码块,不要同步方法,synchronized实现原理自行百度,总之synchronized同步的代码越少越好。

6、 如果仅仅是一个变量的同步请不要使用同步代码块,直接用volatile修饰变量即可。

7、 继续线程安全,在我们平时码代码是时,除非明确要求使用线程安全类,不然别去使用,线程安全类就是增加了同步开销,以StringBuffer和StringBuilder为例,前者属于线程安全,但实际情况下我们使用需要线程安全的情况微乎其微(至少我没遇到),所以StringBuilder更为效率。

8、 继续StringBuilderx相关,在字符串拼接,不要直接使用+拼接,此种方法效率最差,而字符串的concat方法实质就是现分解为char数组,在复制重新生成字符串,效率只比+好一点,StringBuilder和StringBuffer通常选取前者最为拼接字符串的优先考虑。

9、 接上面,String 重载了+ 和 +=,但是在字符串用+连接时,实质JVM运行也是编译了一个临时的StringBuilder来执行append,也就是说,即使你用了+,其实还是用的StringBuilder,只不过是由JVM代替了你使用而已。

10、 在循环内除非必要,否则不要处理异常,原因在于异常基类Throwable中的public synchronized native Throwable fillInStackTrace(),如你所见,是个同步方法,So……。

11、 接上,尽量不要使用try-catch处理业务流程,虽然看起来更OOP,但是实质上是try-catch的性能处理上肯定不如传统的if-else,虽然看起来只是一点点性能的浪费。

12、 对于确定的死循环,for(;;)优于while(true),原因在于前者编译后执行的汇编代码更少,如例:
    for(;;)

jmp wmain+29h

    while(true)

mov eax,1test eax,eaxje wmain+29hjmp wmain+1Eh

13、 在传统的大小判断上,尽量直接使用(x>y)而非(x-y>0),试想一下x=MAX,y=MIN,如果相减是否会溢出呢?

14、 foreach语法能够遍历任何实现了Iterable接口的类。

15、 多看书吧,虽然可能情况不同,我在学习中只看过唯一一次视频,一个简单的知识点拖了一大截才讲到关键,看书几下就看明白了,无论看书还是视频,重要的不是看,是练。

16、 《Java编程思想》真的是本很不错的书(机械工业大法好),相比于国内的某些书(我深受其害),这本书让我欲罢不能,每重看一遍,总有不一样的领悟。

17、 泛型有坑(万恶的泛型擦除),但泛型好用,特别是在编写自己的类库的时候,泛型总能让你的类库突出某层局限。

原创粉丝点击