欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    Java开发问题集锦-北京尚学堂.doc

    • 资源ID:57392612       资源大小:201KB        全文页数:28页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Java开发问题集锦-北京尚学堂.doc

    Java开发问题集锦Java是目前最流行的编程语言之一它可以用来编写Windows程序或者是Web应用,移动应用,网络程序,消费电子产品,机顶盒设备,它无处不在。有超过30亿的设备是运行在Java之上的。根据Oracle的统计数据,光是使用中的Java Card就有有50亿。超过900万程序员选择使用Java进行开发,它是最受开发人员欢迎的语言,同时也是最流行的开发平台。本文为那些准Java程序员们准备了一系列广为流传的Java最佳编程实践· 优先返回空集合而非null如果程序要返回一个不包含任何值的集合,确保返回的是空集合而不是null。这能节省大量的”if else”检查。123public class getLocationName     return (null=cityName ? "": cityName);· 谨慎操作字符串如果两个字符串在for循环中使用+操作符进行拼接,那么每次循环都会产生一个新的字符串对象。这不仅浪费内存空间同时还会影响性能。类似的,如果初始化字符串对象,尽量不要使用构造方法,而应该直接初始化。比方说:12345/Slower InstantiationString bad = new String("Yet another string object");      /Faster InstantiationString good = "Yet another string object"· 避免无用对象创建对象是Java中最昂贵的操作之一。因此最好在有需要的时候再进行对象的创建/初始化。如下:12345678910111213141516import 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间做选择。它们二者互有优劣。如何选择应该视情况而定。12345678910111213141516171819202122232425import java.util.ArrayList; public class arrayVsArrayList      public static void main(String args)         int myArray = new int6;        myArray7= 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 333;     · 数组是定长的,而ArrayList是变长的。由于数组长度是固定的,因此在声明数组时就已经分配好内存了。而数组的操作则会更快一些。另一方面,如果我们不知道数据的大小,那么过多的数据便会导致ArrayOutOfBoundException,而少了又会浪费存储空间。· ArrayList在增删元素方面要比数组简单。· 数组可以是多维的,但ArrayList只能是一维的。· try块的finally块没有被执行看下下面这段代码:12345678910111213141516public 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可以在存活对象上进行调用,即便是这些对象仍在被其它线程所使用。而这会导致不可预期的结果甚至是死锁。123456789101112131415161718192021222324public 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.");                                     · 判断奇数看下这几行代码,看看它们是否能用来准确地判断一个数是奇数?123public boolean oddOrNot(int num)     return num % 2 = 1;看似是对的,但是每执行四便会有一个错误的结果(用数据说话)。考虑到负奇数的情况,它除以2的结果就不会是1。因此,返回值是false,而这样是不对的。代码可以修改成这样:123public boolean oddOrNot(int num)     return (num & 1) != 0;这么写不光是负奇数的问题解决了,并且还是经过充分优化过的。因为算术运算和逻辑运行要比乘除运算更高效,计算的结果也会更快。· 单引号与双引号的区别123456public class Haha     public static void main(String args)     System.out.print("H" + "a");    System.out.print('H' + 'a');    看起来这段代码会返回”Haha”,但实际返回的是Ha169。原因就是用了双引号的时候,字符会被当作字符串处理,而如果是单引号的话,字符值会通过一个叫做基础类型拓宽的操作来转换成整型值。然后再将值相加得到169。· 一些防止内存泄露的小技巧内存泄露会导致软件的性能降级。由于Java是自动管理内存的,因此开发人员并没有太多办法介入。不过还是有一些方法能够用来防止内存泄露的。· 查询完数据后立即释放数据库连接· 尽可能使用finally块· 释放静态变量中的实例· 避免死锁死锁出现的原因有很多。避免死锁不是一句话就能解决的。通常来说,当某个同步对象在等待另一个同步对象所拥有的资源上的锁时,便会产生死锁。试着运行下下面的程序。它会告诉你什么是死锁。这个死锁是由于两个线程都在等待对方所拥有的资源,因此会产生死锁。它们会一直等待,没有谁会先放手。1234567891011121314151617181920212223242526272829303132333435363738394041424344public class DeadlockDemo    public static Object addLock = new Object();   public static Object subLock = new Object();    public static void main(String args)        MyAdditionThread add = new MyAdditionThread();      MySubtractionThread sub = new MySubtractionThread();      add.start();      sub.start();   private static class MyAdditionThread extends Thread       public void run()          synchronized (addLock)         int a = 10, b = 3;        int c = a + b;            System.out.println("Addition Thread: " + c);            System.out.println("Holding First Lock.");            try Thread.sleep(10);             catch (InterruptedException e)             System.out.println("Addition Thread: Waiting for AddLock.");            synchronized (subLock)                System.out.println("Threads: Holding Add and Sub Locks.");                                 private static class MySubtractionThread extends Thread       public void run()          synchronized (subLock)         int a = 10, b = 3;        int c = a - b;            System.out.println("Subtraction Thread: " + c);            System.out.println("Holding Second Lock.");            try Thread.sleep(10);             catch (InterruptedException e)             System.out.println("Subtraction  Thread: Waiting for SubLock.");            synchronized (addLock)                System.out.println("Threads: Holding Add and Sub Locks.");                              输出:123456Addition Thread: 13Subtraction Thread: 7Holding First Lock.Holding Second Lock.Addition Thread: Waiting for AddLock.Subtraction  Thread: Waiting for SubLock.但如果调用的顺序变一下的话,死锁的问题就解决了。1234567891011121314151617181920212223242526272829303132333435363738394041424344454647public class DeadlockSolutionDemo    public static Object addLock = new Object();   public static Object subLock = new Object();    public static void main(String args)        MyAdditionThread add = new MyAdditionThread();      MySubtractionThread sub = new MySubtractionThread();      add.start();      sub.start();     private static class MyAdditionThread extends Thread       public void run()          synchronized (addLock)         int a = 10, b = 3;        int c = a + b;            System.out.println("Addition Thread: " + c);            System.out.println("Holding First Lock.");            try Thread.sleep(10);             catch (InterruptedException e)             System.out.println("Addition Thread: Waiting for AddLock.");            synchronized (subLock)                System.out.println("Threads: Holding Add and Sub Locks.");                                     private static class MySubtractionThread extends Thread       public void run()          synchronized (addLock)         int a = 10, b = 3;        int c = a - b;            System.out.println("Subtraction Thread: " + c);            System.out.println("Holding Second Lock.");            try Thread.sleep(10);             catch (InterruptedException e)             System.out.println("Subtraction  Thread: Waiting for SubLock.");            synchronized (subLock)                System.out.println("Threads: Holding Add and Sub Locks.");                              输出:12345678Addition Thread: 13Holding First Lock.Addition Thread: Waiting for AddLock.Threads: Holding Add and Sub Locks.Subtraction Thread: 7Holding Second Lock.Subtraction  Thread: Waiting for SubLock.Threads: Holding Add and Sub Locks.· 替Java省点内存某些Java程序是CPU密集型的,但它们会需要大量的内存。这类程序通常运行得很缓慢,因为它们对内存的需求很大。为了能提升这类应用的性能,可得给它们多留点内存。因此,假设我们有一台拥有10G内存的Tomcat服务器。在这台机器上,我们可以用如下的这条命令来分配内存:1export JAVA_OPTS="$JAVA_OPTS -Xms5000m -Xmx6000m -XX:PermSize=1024m -XX:MaxPermSize=2048m"· Xms = 最小内存分配· Xmx = 最大内存分配· XX:PermSize = JVM启动时的初始大小· XX:MaxPermSize = JVM启动后可分配的最大空间· 如何计算Java中操作的耗时在Java中进行操作计时有两个标准的方法:System.currentTimeMillis()和System.nanoTime()。问题就在于,什么情况下该用哪个。从本质上来讲,他们的作用都是一样的,但有以下几点不同:1. System.currentTimeMillis()的精度在千分之一秒到千分之15秒之间(取决于系统)而System.nanoTime()则能到纳秒级。2. System.currentTimeMillis读操作耗时在数个CPU时钟左右。而System.nanoTime()则需要上百个。3. System.currentTimeMillis对应的是绝对时间(1970年1 月1日所经历的毫秒数),而System.nanoTime()则不与任何时间点相关。4. Float还是double数据类型所用字节有效位数float47double815在对精度要求高的场景下,double类型相对float要更流行一些,理由如下:大多数处理器在处理float和double上所需的时间都是差不多的。而计算时间一样的前提下,double类型却能提供更高的精度。· 幂运算Java是通过异或操作来进行幂运算的。Java对于幂运算有两种处理方式:· 乘积:12345double square = double a * double a;                           / Optimizeddouble cube = double a * double a * double a;                   / Non-optimizeddouble cube = double a * double square;                       / Optimizeddouble quad = double a * double a * double a * double a;          / Non-optimizeddouble quad = double square * double square;                  / Optimized· pow方法:在无法使用乘积的情况下可以使用pow方法。1double cube = Math.pow(base, exponent);不到万不得已不要使用Math.pow。比方说,当指数是小数的时候。因为Math.pow要比乘积慢300-600倍左右。· 如何处理空指针异常空指针异常是Java中很常见的异常。当你尝试调用一个null对象上的方法时便会抛出这个异常。比如:1int noOfStudents = school.listStudents().count;在上述例子中,school为空或者listStudents()为空都可能会抛出了NullPointerException。因此最好检查下对象是否为空以避免类似情况。1234private int getListOfStudents(File files)       if (files = null)        throw new NullPointerException("File list cannot be null");    · JSON编码JSON是数据存储及传输的一种协议。与XML相比,它更易于使用。由于它非常轻量级以及自身的一些特性,现在JSON在网络上已经是越来越流行了。常见的数据结构都可以编码成JSON然后在各个网页间自由地传输。不过在开始编码前,你得先安装一个JSON解析器。在下面的例子中,我们将使用json.simple库来完成这项工作 (下面是编码成JSON串的一个简单的例子。123456789101112131415161718192021import org.json.simple.JSONObject;import org.json.simple.JSONArray; public class JsonEncodeDemo          public static void main(String args)                  JSONObject obj = new JSONObject();        obj.put("Novel Name", "Godaan");        obj.put("Author", "Munshi Premchand");          JSONArray novelDetails = new JSONArray();        novelDetails.add("Language: Hindi");        novelDetails.add("Year of Publication: 1936");        novelDetails.add("Publisher: Lokmanya Press");                 obj.put("Novel Details", novelDetails);                 System.out.print(obj);    输出:1"Novel Name":"Godaan","Novel Details":"Language: Hindi","Year of Publication: 1936","Publisher: Lokmanya Press","Author":"Munshi Premchand"· JSON解析开发人员要想解析JSON串,首先你得知道它的格式。下面例子有助于你来理解这一点:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.util.Iterator; import org.json.simple.JSONArray;import org.json.simple.JSONObject;import org.json.simple.parser.JSONParser;import org.json.simple.parser.ParseException; public class JsonParseTest      private static final String filePath = "/home/user/Documents/jsonDemoFile.json"         public static void main(String args)          try             / read the json file            FileReader reader = new FileReader(filePath);            JSONParser jsonParser = new JSONParser();            JSONObject jsonObject = (JSONObject)jsonParser.parse(reader);                         / get a number from the JSON object            Long id =  (Long) jsonObject.get("id");            System.out.println("The id is: " + id);                        / get a String from the JSON object            String   type = (String) jsonObject.get("type");            System.out.println("The type is: " + type);             / get a String from the JSON object            String   name = (String) jsonObject.get("name");            System.out.println("The name is: " + name);             / get a number from the JSON object            Double ppu =  (Double) jsonObject.get("ppu");            System.out.println("The PPU is: " + ppu);                         / get an array from the JSON object            System.out.println("Batters:");            JSONArray batterArray= (JSONArray) jsonObject.get("batters");            Iterator i = batterArray.iterator();            / take each value from the json array separately            while (i.hasNext()                 JSONObject innerObj = (JSONObject) i.next();                System.out.println("ID "+ innerObj.get("id") +                         " type " + innerObj.get("type");                         / get an array from the JSON object            System.out.println("Topping:");            JSONArray toppingArray= (JSONArray) jsonObject.get("topping");            Iterator j = toppingArray.iterator();            / take each value from the json array separately            while (j.hasNext()                 JSONObject innerObj = (JSONObject) j.next();                System.out.println("ID "+ innerObj.get("id") +                         " type " + innerObj.get("type");                                   catch (FileNotFoundException ex)             

    注意事项

    本文(Java开发问题集锦-北京尚学堂.doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开