1、减少对变量的重复计算--》for循环的优化
for(int i=0;i
例如以下的方法:
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");
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而不是==,比如下面的截图
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代码优化(长期更新) - 五月的仓颉 - 博客园