设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 数据 手机
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

Java性能优化:35个小细节,提升你的Java代码运行效率(4)

发布时间:2019-11-05 16:37 所属栏目:21 来源:程序猿久一
导读:但是,在Java中,C/C++这种if (i = 1)的语法是不可能出现的,因为一旦写了这种语法,Java就会编译报错Type mismatch: cannot convert from int to boolean。但是,尽管Java的if (i == 1)和if (1 == i)在语义上没有

但是,在Java中,C/C++这种”if (i = 1)”的语法是不可能出现的,因为一旦写了这种语法,Java就会编译报错”Type mismatch: cannot convert from int to boolean”。但是,尽管Java的”if (i == 1)”和”if (1 == i)”在语义上没有任何区别,但是从阅读习惯上讲,建议使用前者会更好些。

30、不要对数组使用toString方法

看一下对数组使用toString打印出来的是什么:

  1. public static void main(String[] args) 
  2. {int is = new int{1, 2, 3}; 
  3. System.out.println(is.toString); 

结果是:

  1. [I@18a992f 

本意是想打印出数组内容,却有可能因为数组引用is为空而导致空指针异常。不过虽然对数组toString没有意义,但是对集合toString是可以打印出集合里面的内容的,因为集合的父类AbstractCollections重写了Object的toString方法。

31、不要对超出范围的基本数据类型做向下强制转型

这绝不会得到想要的结果:

  1. public static void main(String[] args) 
  2. long l = 12345678901234L;inti = (int)l;System.out.println(i); 

我们可能期望得到其中的某几位,但是结果却是:

  1. 1942892530 

解释一下。Java中long是8个字节64位的,所以12345678901234在计算机中的表示应该是:

  1. 0000 0000 0000 0000 0000 1011 0011 1010 0111 0011 1100 1110 0010 1111 1111 0010 

一个int型数据是4个字节32位的,从低位取出上面这串二进制数据的前32位是:

  1. 0111 0011 1100 1110 0010 1111 1111 0010 

这串二进制表示为十进制1942892530,所以就是我们上面的控制台上输出的内容。从这个例子上还能顺便得到两个结论

  1. 整型默认的数据类型是int,long l = 12345678901234L,这个数字已经超出了int的范围了,所以最后有一个L,表示这是一个long型数。顺便,浮点型的默认类型是double,所以定义float的时候要写成””float f = 3.5f”
  2. 接下来再写一句”int ii = l + i;”会报错,因为long + int是一个long,不能赋值给int

32、公用的集合类中不使用的数据一定要及时remove掉

如果一个集合类是公用的(也就是说不是方法里面的属性),那么这个集合里面的元素是不会自动释放的,因为始终有引用指向它们。所以,如果公用集合里面的某些数据不使用而不去remove掉它们,那么将会造成这个公用集合不断增大,使得系统有内存泄露的隐患。

3 3、把一个基本数据类型转为字符串,基本数据类型.toString是最快的方式、String.valueOf(数据)次之、数据+””最慢

把一个基本数据类型转为一般有三种方式,我有一个Integer型数据i,可以使用i.toString、String.valueOf(i)、i+””三种方式,三种方式的效率如何,看一个测试:

  1. public static void main(String[] args) 
  2. int loopTime = 50000; 
  3. Integer i = 0; 
  4.  
  5. long startTime = System.currentTimeMillis;for (int j = 0; j < loopTime; j++){String str = String.valueOf(i); 
  6. System.out.println("String.valueOf:" + (System.currentTimeMillis - startTime) + "ms"); 
  7. startTime = System.currentTimeMillis;for (int j = 0; j < loopTime; j++) 
  8. String str = i.toString; 
  9. System.out.println("Integer.toString:" + (System.currentTimeMillis - startTime) + "ms"); 
  10. startTime = System.currentTimeMillis; for (int j = 0; j < loopTime; j++) 
  11. String str = i + ""; 
  12. System.out.println("i + \"\":" + (System.currentTimeMillis - startTime) + "ms"); 

运行结果为:

  1. String.valueOf:11ms Integer.toString:5ms i + "":25ms 

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读