代码优化篇

1、减少对变量的重复计算--》for循环的优化

for(int i=0;i

例如以下的方法:

代码优化篇_第1张图片

2、String类尽量使用StringBuffer、StringBuilder

这个涉及到jvm的内存分配,举个例子

/*
    而这种写法呢,实现的过程是
    jvm会在堆内存中开辟3个空间,1为“abc”,2为“def”,3为“abcdef”,最终str2指向3,
    1和2因为没有被引用,会在GC回收机制内被回收,而GC的开销是相当大的,所以应尽量避免
*/
String str = "abc";
String str2 = str + "def";
/*
    因此建议使用StringBuffer、StringBuilder
    jvm只会在堆空间中开辟一个空间“abc”,执行append时只会在“abc”的空间上+“def”
    因此避免了GC的回收,也避免了内存的浪费
    同样是为了获取到“abcdef”,但第二种方式明显更有效率
    那怎么判断是使用StringBuffer还是StringBuilder的呢?
    如果有线程安全的考虑使用StringBuffer,无则使用StringBuilder,线程安全也是一个比较高的开销
*/
StringBuffer str3 =new StringBuffer("abc");
str3.append("def");

代码优化篇_第2张图片

3、使用equals方法尽量写前面

比如下面这个方法:
@Test
public void test(){
    SysUserEntity user = new SysUserEntity();
    String ss = "HFanss";

    if (user.getUsername().equals(ss)) {
        System.err.println("相同");
    }else {
        System.err.println("不相同");
    }
}

执行会抛出空指针异常,修改为:

if (ss.equals(user.getUsername()))

这个是时候执行就不会出现异常了;

equals的源码解释 当比较对象(常量ss)为空时,抛出空指针异常,

而被比较对象(user.getUsername())为空时,则直接以 false结束

在这里,顺便说一句,当我们进行两个字符串判断相等的时候,最好使用StringUtil.equals(str1,str2)

例如刚才的判断,改成下面这样子会更好

if(StringUtil.equals(ss,user.getUsername()))

当我们进行两个包装类型判断的时候,最好使用equals而不是==,比如下面的截图

代码优化篇_第3张图片

4、当前端页面传过来的参数为字符串时,我们最好还是使用一下.trim()方法去掉空格

例如下面:

就是我们自己项目中的查询,都有一个共有的key;

这个是之前的写法,然后进行测试的时候,条件加入一个空格;

这样子查询出来的结果就为空,但其实数据库是有这个数据库的,所以最好还是进行一个.trim()方法

5、常用日志:这个是之前也说过很多次的,多打日志对于后期查找bug还是有很大的好处,可以优先查到问题出在哪里,更加快捷的解决

6、long或者Long初始赋值时,使用大写的L而不是小写的l,因为字母l极易与数字1混淆,这个点非常细节,值得注意,不过现在一般idea工具会自动识别是否正确,比如下图

7、循环体内不要使用"+"进行字符串拼接,而直接使用StringBuilder不断append

因为在使用  “+” 进行字符串拼接的时候,每次虚拟机碰到"+"这个操作符对字符串进行拼接的时候,

会new出一个StringBuilder,然后调用append方法,最后调用toString()方法转换字符串赋值给字符串对象,即循环多少次,就会new出多少个StringBuilder()来,这对于内存是一种浪费。

所以在循环里面,最好是使用StringBuilder直接append

常用的字符串拼接方式有五种,分别是使用+、使用concat、使用StringBuilder、使用StringBuffer以及使用StringUtils.join。

由于字符串拼接过程中会创建新的对象,所以如果要在一个循环体中进行字符串拼接,就要考虑内存问题和效率问题。

直接使用StringBuilder的方式是效率最高的。因为StringBuilder天生就是设计来定义可变字符串和字符串的变化操作的。

如果不是在循环体中进行字符串拼接的话,直接使用+就好了。

8、我们的一些公有的方法,能够提取成公有的,就写成公有的,在同一个类里面,一个方法不要写太长,可以提成成私有方法的则提取成私有方法
 

9、将常量声明为static final,并以大写命名

这样在编译期间就可以把这些内容放入常量池中,避免运行期间计算生成常量的值。另外,将常量的名字以大写命名也可以方便区分出常量与变量

10、不要创建一些不使用的对象,不要导入一些不使用的类

这些并没得什么意义,在IDEA中可以使用Ctrl+Alt+O 优化导入的类和包 

11、使用带缓冲的输入输出流进行IO操作

带缓冲的输入输出流,即BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream,这可以极大地提升IO效率

12、循环里面,对象引用的优化,如下:

其实就可以写成如下所示:

原理:我们的目的只是dataList.add(map)这一步,前者map引用会在栈空间中有size那么多个,如果size为1000,那么引用就会有1000,但是最终只会用到1个,后者map引用在栈空间只有1个

java代码的优化_幻凡ss的博客-CSDN博客_java代码优化

Java代码优化(长期更新) - 五月的仓颉 - 博客园

你可能感兴趣的:(java,jvm,java,开发语言)