代码优化,一个很重要的课题。
I hope all of you can be good programmers.
代码优化的目标是:
1、减小代码的体积
2、提高代码运行的效率
对如果一直想往程序员道路上行走的朋友们给你推荐一本书叫《程序员修炼之道》,作者从多方面维度描述了项目开发的中我们应该具备的好习惯、好的思维方式、乐观的讲解问题的态度。希望对大家有帮助。
Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大
,具体参见Java运行期优化。此举能够使性能平均提高50%。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理
,因此,生成过多的对象将会给程序的性能带来很大的影响。调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中速度较快
,其他变量,如静态变量、实例变量等,都在堆中创建,速度较慢。另外,栈中创建的变量,随着方法的运行结束,这些内容就没了,不需要额外的垃圾回收。Java编程过程中,进行数据库连接、I/O流操作时务必小心,在使用完毕后,及时关闭以释放资源。
因为对这些大对象的操作会造成系统大的开销,稍有不慎,将会导致严重的后果。for (int i = 0; i < list.size(); i++)
{...}
for (int i = 0, int length = list.size(); i < length; i++)
{...}
String str = "aaa";if (i == 1)
{
list.add(str);
}
if (i == 1)
{
String str = "aaa";
list.add(str);
}
只要有异常被抛出,Java虚拟机就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。
异常只能用于错误处理,不应该用来控制程序流程。for (val = 0; val < 100000; val += 5)
{
a = val * 8;
b = val / 2;
}
for (val = 0; val < 100000; val += 5)
{
a = val << 3;
b = val >> 1;
}
移位操作虽然快,但是可能会使代码不太好理解,因此最好加上相应的注释。
for (int i = 1; i <= count; i++)
{
Object obj = new Object();
}
Object obj = null;
for (int i = 0; i <= count; i++) {
obj = new Object();
}
注意: 循环内不要不断创建对象引用“这个说法针对老的JVM是适用的,随着版本迭代JVM已经优化的很智能了,经过测试两种写法在cpu和内存占用上几乎接近了。
15、不要将数组声明为public static final
因为这毫无意义,这样只是定义了引用为static final,数组的内容还是可以随意改变的,将数组声明为public更是一个安全漏洞,这意味着这个数组可以被外部类所改变
public class A{
private static B b = new B();
}
假如是随机访问的,使用普通for循环效率将高于使用foreach循环;反过来,如果是顺序访问的,则使用Iterator会效率更高。
if (list instanceof RandomAccess)
{
for (int i = 0; i < list.size(); i++){}
}
else{
Iterator<?> iterator = list.iterable();
while (iterator.hasNext())
{
iterator.next()
}
}
将常量的名字以大写命名也可以方便区分出常量与变量
。反射是Java提供给用户一个很强大的功能,功能强大往往意味着效率不高
。不建议在程序运行过程中使用尤其是频繁使用反射机制,特别是Method的invoke方法,如果确实有必要,一种建议性的做法是将那些需要通过反射加载的类在项目启动的时候通过反射实例化出一个对象并放入内存—用户只关心和对端交互的时候获取最快的响应速度,并不关心对端的项目启动花多久时间。27、不要让public方法中有太多的形参
public方法即对外提供的方法,如果给这些方法太多形参的话主要有两点坏处:
1、 违反了面向对象的编程思想,Java讲求一切都是对象,太多的形参,和面向对象的编程思想并不契合
2、 参数太多势必导致方法调用的出错概率增加
至于这个”太多”指的是多少个,3、4个吧。比如我们用JDBC写一个insertStudentInfo方法,有10个学生信息字段要插如Student表中,可以把这10个参数封装在一个实体类中,作为insert方法的形参
String str = "123";if (str.equals("123")) {
...
}
String str = "123";if ("123".equals(str))
{
...
}
这么做主要是可以避免空指针异常
public static void main(String[] args)
{
int[] is = new int[]{1, 2, 3};
System.out.println(is.toString());
}
[I@18a992f
public static void main(String[] args){
long l = 12345678901234L;
int i = (int)l;
System.out.println(i);
}
1942892530
解释一下。Java中long是8个字节64位的,所以12345678901234在计算机中 的表示应该是:
0000 0000 0000 0000 0000 1011 0011 1010 0111 0011 1100 1110 0010 1111 1111 0010
一个int型数据是4个字节32位的,从低位取出上面这串二进制数据的前32位 是:0111 0011 1100 1110 0010 1111 1111 0010这串二进制表示为十进制1942892530,
所以就是我们上面的控制台上输出的内容。
- 1、String.valueOf()方法底层调用了Integer.toString()方法,但是会在调用前做空判断
- 2、Integer.toString()方法就不说了,直接调用了
- 3、i + “”底层使用了StringBuilder实现,先用append方法拼接,再用toString()方法获取字符串
public static void main(String[] args)
{
HashMap<String, String> hm = new HashMap<String, String>();
hm.put("111", "222");
Set<Map.Entry<String, String>> entrySet = hm.entrySet();
Iterator<Map.Entry<String, String>> iter = entrySet.iterator();
while (iter.hasNext())
{
Map.Entry<String, String> entry = iter.next();
System.out.println(entry.getKey() + "\t" +entry.getValue());
}
}
try{
XXX.close();
YYY.close();
}catch (Exception e)
{
...
}
try{ XXX.close(); }catch (Exception e) { ... }try{
YYY.close(); }catch (Exception e) { ... }
You can choose to invest in yourself while you are young. May our dreams come true as soon as possible
2020.03.04