JSON

史上最全的 Java 新手问题汇总

字号+ 作者:H5之家 来源:H5之家 2015-10-17 10:10 我要评论( )

Java是目前最流行的编程语言之一——它可以用来编写Windows程序或者是Web应用,移动应用,网络程序,消费电子产品,机顶盒设备,它无处不在。 有超过30亿的设备

最新消息:

AD:玩转帮会微信系统包括酒店点餐、外卖订餐和微信开店,微官网,结合微信公众平台,为餐饮、商场类提供完整的微信营销解决方案

  • AD:如此火爆的微社区?你还不加入?赶紧戳我加入吧
  • AD:自己运营的公众号很多?管理不方便?
  • Java是目前最流行的编程语言之一——它可以用来编写Windows程序或者是Web应用,移动应用,网络程序,消费电子产品,机顶盒设备,它无处不在。

    有超过30亿的设备是运行在Java之上的。根据Oracle的统计数据,光是使用中的Java Card就有有50亿。

    超过900万程序员选择使用Java进行开发,它是最受开发人员欢迎的语言,同时也是最流行的开发平台。

    本文为那些准Java程序员们准备了一系列广为流传的Java最佳编程实践

    优先返回空集合而非null

    如果程序要返回一个不包含任何值的集合,确保返回的是空集合而不是null。这能节省大量的”if else”检查。

    public class getLocationName { return (null==cityName ? "": cityName); }谨慎操作字符串

    如果两个字符串在for循环中使用+操作符进行拼接,那么每次循环都会产生一个新的字符串对象。这不仅浪费内存空间同时还会影响性能。类似的,如果初始化字符串对象,尽量不要使用构造方法,而应该直接初始化。比方说:

    //Slower Instantiation String bad = new String("Yet another string object"); //Faster Instantiation String good = "Yet another string object"避免无用对象

    创建对象是Java中最昂贵的操作之一。因此最好在有需要的时候再进行对象的创建/初始化。如下:

    import java.util.ArrayList; import java.util.List; public class Employees { private List Employees; public List getEmployees() { //initialize only when required if(null == Employees) { Employees = new ArrayList(); } return Employees; } }数组与ArrayList之争

    开发人员经常会发现很难在数组和ArrayList间做选择。它们二者互有优劣。如何选择应该视情况而定。

    import java.util.ArrayList; public class arrayVsArrayList { public static void main(String[] args) { int[] myArray = new int[6]; myArray[7]= 10; // ArraysOutOfBoundException //Declaration of ArrayList. Add and Remove of elements is easy. ArrayList<Integer> myArrayList = new ArrayList<>(); myArrayList.add(1); myArrayList.add(2); myArrayList.add(3); myArrayList.add(4); myArrayList.add(5); myArrayList.remove(0); for(int i = 0; i < myArrayList.size(); i++) { System.out.println("Element: " + myArrayList.get(i)); } //Multi-dimensional Array int[][][] multiArray = new int [3][3][3]; } }
  • try块的finally块没有被执行
  • 看下下面这段代码

    public class shutDownHooksDemo { public static void main(String[] args) { for(int i=0;i<5;i++) { try { if(i==4) { System.out.println("Inside Try Block.Exiting without executing Finally block."); System.exit(0); } } finally { System.out.println("Inside Finally Block."); } } } }

    从代码来看,貌似finally块中的println语句应该会被执行5次。但当程序运行后,你会发现finally块只执行了4次。第5次迭代的时候会触发exit函数的调用,于是这第5次的finally便永远也触发不到了。原因便是——System.exit会挂起所有线程的执行,包括当前线程。即便是try语句后的finally块,只要是执行了exit,便也无力回天了。

    在调用System.exit时,JVM会在关闭前执行两个结束任务:

    首先,它会执行完所有通过Runtime.addShutdownHook注册进来的终止的钩子程序。这一点很关键,因为它会释放JVM外部的资源。

    接下来的便是Finalizer了。可能是System.runFinalizersOnExit也可能是Runtime.runFinalizersOnExit。finalizer的使用已经被废弃有很长一段时间了。finalizer可以在存活对象上进行调用,即便是这些对象仍在被其它线程所使用。而这会导致不可预期的结果甚至是死锁。

    public class shutDownHooksDemo { public static void main(String[] args) { for(int i=0;i<5;i++) { final int final_i = i; try { Runtime.getRuntime().addShutdownHook( new Thread() { public void run() { if(final_i==4) { System.out.println("Inside Try Block.Exiting without executing Finally block."); System.exit(0); } } }); } finally { System.out.println("Inside Finally Block."); } } } }判断奇数

    看下这几行代码,看看它们是否能用来准确地判断一个数是奇数?

    public boolean oddOrNot(int num) { return num % 2 == 1; }

    看似是对的,但是每执行四便会有一个错误的结果(用数据说话)。考虑到负奇数的情况,它除以2的结果就不会是1。因此,返回值是false,而这样是不对的。

    代码可以修改成这样:

    public boolean oddOrNot(int num) { return (num & 1) != 0; }

    这么写不光是负奇数的问题解决了,并且还是经过充分优化过的。因为算术运算和逻辑运行要比乘除运算更高效,计算的结果也会更快。

    单引号与双引号的区别public class Haha { public static void main(String args[]) { System.out.print("H" + "a"); System.out.print('H' + 'a'); } }

    看起来这段代码会返回”Haha”,但实际返回的是Ha169。原因就是用了双引号的时候,字符会被当作字符串处理,而如果是单引号的话,字符值会通过一个叫做基础类型拓宽的操作来转换成整型值。然后再将值相加得到169。

    一些防止内存泄露的小技巧

    内存泄露会导致软件的性能降级。由于Java是自动管理内存的,因此开发人员并没有太多办法介入。不过还是有一些方法能够用来防止内存泄露的。

  • 避免死锁
  • 死锁出现的原因有很多。避免死锁不是一句话就能解决的。通常来说,当某个同步对象在等待另一个同步对象所拥有的资源上的锁时,便会产生死锁。

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • iOS入门学习(json解析)

      iOS入门学习(json解析)

      2016-01-26 09:00

    • iOS中json解析出现的null,nil,NSNumber的问题,jsonnsnumber

      iOS中json解析出现的null,nil,NSNumber的问题,jsonnsnumber

      2016-01-17 15:03

    • iOS开发Post请求错误:Error Domain=NSCocoaErrorDomain Code=3840

      iOS开发Post请求错误:Error Domain=NSCocoaErrorDomain Code=3840 "

      2015-11-23 19:03

    • 对Json进行处理的Google Gson API教程

      对Json进行处理的Google Gson API教程

      2015-11-23 15:47

    网友点评
    a