当前位置: 首页 > news >正文

java翻译topping_java刚開始学习的人常见的问题

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

1.优先返回空集合而非null

假设程序要返回一个不包括不论什么值的集合,确保返回的是空集合而不是null。

这能节省大量的”if else”检查。

publicclassgetLocationName{return(null==cityName?

"":cityName);}

1.慎重操作字符串

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

//Slower InstantiationStringbad=newString("Yet another string object");//FasterInstantiationStringgood="Yet another string object"

1.避免无用对象

创建对象是Java中最昂贵的操作之中的一个。

因此最好在有须要的时候再进行对象的创建/初始化。例如以下:

importjava.util.ArrayList;importjava.util.List;publicclassEmployees{privateListEmployees;publicListgetEmployees(){//initialize only when requiredif(null==Employees){Employees=newArrayList();}returnEmployees;}}

1.数组与ArrayList之争

开发者经常会发现非常难在数组和ArrayList间做选择。

它们二者互有优劣。

怎样选择应该视情况而定。

importjava.util.ArrayList;publicclassarrayVsArrayList{publicstaticvoidmain(String[]args){int[]myArray=newint[6];myArray[7]=10;//ArraysOutOfBoundException//Declaration of ArrayList. Add and Remove of elements is easy.ArrayListmyArrayList=newArrayList<>();myArrayList.add(1);myArrayList.add(2);myArrayList.add(3);myArrayList.add(4);myArrayList.add(5);myArrayList.remove(0);for(inti=0;i

·数组是定长的。而ArrayList是变长的。由于数组长度是固定的,因此在声明数组时就已经分配好内存了。

而数组的操作则会更快一些。

还有一方面,假设我们不知道数据的大小。那么过多的数据便会导致ArrayOutOfBoundException,而少了又会浪费存储空间。

·ArrayList在增删元素方面要比数组简单。

·数组能够是多维的,但ArrayList仅仅能是一维的。

1.try块的finally块没有被运行

看下以下这段代码:

publicclassshutDownHooksDemo{publicstaticvoidmain(String[]args){for(inti=0;i<5;i++){try{if(i==4){System.out.println("Inside Try Block.Exiting withoutexecuting 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能够在存活对象上进行调用。即便是这些对象仍在被其他线程所使用。而这会导致不可预期的结果甚至是死锁。

publicclassshutDownHooksDemo{publicstaticvoidmain(String[]args){for(inti=0;i<5;i++){finalintfinal_i=i;try{Runtime.getRuntime().addShutdownHook(newThread(){publicvoidrun(){if(final_i==4){System.out.println("Inside Try Block.Exiting withoutexecuting Finally block.");System.exit(0);}}});}finally{System.out.println("InsideFinally Block.");}}}}

1.推断奇数

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

publicbooleanoddOrNot(intnum){returnnum%2==1;}

看似是对的,可是每运行四便会有一个错误的结果(用数据说话)。

考虑到负奇数的情况。它除以2的结果就不会是1。

因此。返回值是false,而这样是不正确的。

代码能够改动成这样:

publicbooleanoddOrNot(intnum){return(num&1)!=0;}

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

1.单引號与双引號的差别

publicclassHaha{publicstaticvoidmain(Stringargs[]){System.out.print("H"+"a");System.out.print('H'+'a');}}

看起来这段代码会返回”Haha”,但实际返回的是Ha169。

原因就是用了双引號的时候,字符会被当作字符串处理,而假设是单引號的话,字符值会通过一个叫做基础类型拓宽的操作来转换成整型值。然后再将值相加得到169。

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

内存泄露会导致软件的性能降级。由于Java是自己主动管理内存的,因此开发者并没有太多办法介入。

只是还是有一些方法能够用来防止内存泄露的。

·查询完数据后马上释放数据库连接

·尽可能使用finally块

·释放静态变量中的实例

1.避免死锁

死锁出现的原因有非常多。避免死锁不是一句话就能解决的。

通常来说,当某个同步对象在等待还有一个同步对象所拥有的资源上的锁时,便会产生死锁。

试着运行下以下的程序。它会告诉你什么是死锁。这个死锁是由于两个线程都在等待对方所拥有的资源,因此会产生死锁。

它们会一直等待,没有谁会先放手。

publicclassDeadlockDemo{publicstaticObjectaddLock=newObject();publicstaticObjectsubLock=newObject();publicstaticvoidmain(Stringargs[]){MyAdditionThreadadd=newMyAdditionThread();MySubtractionThreadsub=newMySubtractionThread();add.start();sub.start();}privatestaticclassMyAdditionThreadextendsThread{publicvoidrun(){synchronized(addLock){inta=10,b=3;intc=a+b;System.out.println("Addition Thread: "+c);System.out.println("Holding First Lock...");try{Thread.sleep(10);}catch(InterruptedExceptione){}System.out.println("Addition Thread: Waiting forAddLock...");synchronized(subLock){System.out.println("Threads: Holding Add and SubLocks...");}}}}privatestaticclassMySubtractionThreadextendsThread{publicvoidrun(){synchronized(subLock){inta=10,b=3;intc=a-b;System.out.println("Subtraction Thread: "+c);System.out.println("Holding Second Lock...");try{Thread.sleep(10);}catch(InterruptedExceptione){}System.out.println("Subtraction  Thread: Waiting forSubLock...");synchronized(addLock){System.out.println("Threads: Holding Add and SubLocks...");}}}}}

输出:

AdditionThread:13SubtractionThread:7HoldingFirstLock...HoldingSecondLock...AdditionThread:WaitingforAddLock...SubtractionThread:WaitingforSubLock...

但假设调用的顺序变一下的话,死锁的问题就攻克了。

publicclassDeadlockSolutionDemo{publicstaticObjectaddLock=newObject();publicstaticObjectsubLock=newObject();publicstaticvoidmain(Stringargs[]){MyAdditionThreadadd=newMyAdditionThread();MySubtractionThreadsub=newMySubtractionThread();add.start();sub.start();}privatestaticclassMyAdditionThreadextendsThread{publicvoidrun(){synchronized(addLock){inta=10,b=3;intc=a+b;System.out.println("Addition Thread: "+c);System.out.println("Holding First Lock...");try{Thread.sleep(10);}catch(InterruptedExceptione){}System.out.println("Addition Thread: Waiting forAddLock...");synchronized(subLock){System.out.println("Threads: Holding Add and SubLocks...");}}}}privatestaticclassMySubtractionThreadextendsThread{publicvoidrun(){synchronized(addLock){inta=10,b=3;intc=a-b;System.out.println("Subtraction Thread: "+c);System.out.println("Holding Second Lock...");try{Thread.sleep(10);}catch(InterruptedExceptione){}System.out.println("Subtraction  Thread: Waiting forSubLock...");synchronized(subLock){System.out.println("Threads: Holding Add and SubLocks...");}}}}}

输出:

AdditionThread:13HoldingFirstLock...AdditionThread:WaitingforAddLock...Threads:HoldingAddandSubLocks...SubtractionThread:7HoldingSecondLock...SubtractionThread:WaitingforSubLock...Threads:HoldingAddandSubLocks...

1.替Java省点内存

某些Java程序是CPU密集型的,但它们会须要大量的内存。这类程序通常运行得非常缓慢,由于它们对内存的需求非常大。为了能提升这类应用的性能,可得给它们多留点内存。因此,假设我们有一台拥有10G内存的Tomcatserver。在这台机器上。我们能够用例如以下的这条命令来分配内存:

exportJAVA_OPTS="$JAVA_OPTS -Xms5000m -Xmx6000m-XX:PermSize=1024m -XX:MaxPermSize=2048m"

·Xms =最小内存分配

·Xmx =最大内存分配

·XX:PermSize = JVM启动时的初始大小

·XX:MaxPermSize = JVM启动后可分配的最大空间

1.怎样计算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数据类型 所用字节 有效位数

float 4 7

double 8 15

在对精度要求高的场景下。double类型相对float要更流行一些,理由例如以下:

大多数处理器在处理float和double上所需的时间都是几乎相同的。而计算时间一样的前提下,double类型却能提供更高的精度。

1.幂运算

Java是通过异或操作来进行幂运算的。Java对于幂运算有两种处理方式:

·乘积:

doublesquare=doublea*doublea;// Optimizeddoublecube=doublea*doublea*doublea;// Non-optimizeddoublecube=doublea*doublesquare;// Optimizeddoublequad=doublea*doublea*doublea*doublea;// Non-optimizeddoublequad=doublesquare*doublesquare;// Optimized

·pow方法:在无法使用乘积的情况下能够使用pow方法。

doublecube=Math.pow(base,exponent);

不到万不得已不要使用Math.pow。

例如说,当指数是小数的时候。由于Math.pow要比乘积慢300-600倍左右。

1.怎样处理空指针异常

空指针异常是Java中非经常见的异常。

当你尝试调用一个null对象上的方法时便会抛出这个异常。例如:

intnoOfStudents=school.listStudents().count;

在上述样例中,school为空或者listStudents()为空都可能会抛出了NullPointerException。

因此最好检查下对象是否为空以避免相似情况。

privateintgetListOfStudents(File[]files){if(files==null)thrownewNullPointerException("File list cannot be null");}

1.编码

JSON是数据存储及传输的一种协议。与XML相比,它更易于使用。由于它非常轻量级以及自身的一些特性。如今JSON在网络上已经是越来越流行了。常见的数据结构都能够编码成JSON然后在各个网页间自由地传输。只是在開始编码前。你得先安装一个JSON解析器。在以下的样例中。我们将使用json.simple库来完毕这项工作(https://code.google.com/p/json-simple/)。

以下是编码成JSON串的一个简单的样例。

importorg.json.simple.JSONObject;importorg.json.simple.JSONArray;publicclassJsonEncodeDemo{publicstaticvoidmain(String[]args){JSONObjectobj=newJSONObject();obj.put("Novel Name","Godaan");obj.put("Author","Munshi Premchand");JSONArraynovelDetails=newJSONArray();novelDetails.add("Language:Hindi");novelDetails.add("Year ofPublication: 1936");novelDetails.add("Publisher:Lokmanya Press");obj.put("Novel Details",novelDetails);System.out.print(obj);}}

输出:

{"Novel Name":"Godaan","Novel Details":["Language: Hindi","Year of Publication: 1936","Publisher: Lokmanya Press"],"Author":"Munshi Premchand"}

1.JSON解析

开发者要想解析JSON串。首先你得知道它的格式。以下样例有助于你来理解这一点:

importjava.io.FileNotFoundException;importjava.io.FileReader;importjava.io.IOException;importjava.util.Iterator;importorg.json.simple.JSONArray;importorg.json.simple.JSONObject;importorg.json.simple.parser.JSONParser;importorg.json.simple.parser.ParseException;publicclassJsonParseTest{privatestaticfinalStringfilePath="//home//user//Documents//jsonDemoFile.json";publicstaticvoidmain(String[]args){try{// read the json fileFileReaderreader=newFileReader(filePath);JSONParserjsonParser=newJSONParser();JSONObjectjsonObject=(JSONObject)jsonParser.parse(reader);// get a number from the JSON objectLongid=(Long)jsonObject.get("id");System.out.println("The id is: "+id);// get a String from the JSON objectStringtype=(String)jsonObject.get("type");System.out.println("The type is: "+type);// get a String from the JSON objectStringname=(String)jsonObject.get("name");System.out.println("The name is: "+name);// get a number from the JSON objectDoubleppu=(Double)jsonObject.get("ppu");System.out.println("The PPU is: "+ppu);// get an array from the JSON objectSystem.out.println("Batters:");JSONArraybatterArray=(JSONArray)jsonObject.get("batters");Iteratori=batterArray.iterator();// take each value from the json arrayseparatelywhile(i.hasNext()){JSONObjectinnerObj=(JSONObject)i.next();System.out.println("ID "+innerObj.get("id")+" type"+innerObj.get("type"));}// get an array from the JSON objectSystem.out.println("Topping:");JSONArraytoppingArray=(JSONArray)jsonObject.get("topping");Iteratorj=toppingArray.iterator();// take each value from the json arrayseparatelywhile(j.hasNext()){JSONObjectinnerObj=(JSONObject)j.next();System.out.println("ID "+innerObj.get("id")+" type"+innerObj.get("type"));}}catch(FileNotFoundExceptionex){ex.printStackTrace();}catch(IOExceptionex){ex.printStackTrace();}catch(ParseExceptionex){ex.printStackTrace();}catch(NullPointerExceptionex){ex.printStackTrace();}}}

jsonDemoFile.json

{"id":0001,"type":"donut","name":"Cake","ppu":0.55,"batters":[{"id":1001,"type":"Regular"},{"id":1002,"type":"Chocolate"},{"id":1003,"type":"Blueberry"},{"id":1004,"type":"Devil's Food"}],"topping":[{"id":5001,"type":"None"},{"id":5002,"type":"Glazed"},{"id":5005,"type":"Sugar"},{"id":5007,"type":"Powdered Sugar"},{"id":5006,"type":"Chocolate with Sprinkles"},{"id":5003,"type":"Chocolate"},{"id":5004,"type":"Maple"}]}

Theidis:1Thetypeis:donutThenameis:CakeThePPUis:0.55Batters:ID1001typeRegularID1002typeChocolateID1003typeBlueberryID1004typeDevil's Food

Topping:

ID 5001 type None

ID 5002 type Glazed

ID 5005 type Sugar

ID 5007 type Powdered Sugar

ID 5006 type Chocolate with Sprinkles

ID 5003 type Chocolate

ID 5004 type Maple

1.简单字符串查找

Java提供了一个库函数叫做indexOf()。这种方法能够用在String对象上,它返回的是要查找的字符串所在的位置序号。

假设查找不到则会返回-1。

1.列出文件夹下的文件

你能够用以下的代码来列出文件夹下的文件。

这个程序会遍历某个文件夹下的全部子文件夹及文件,并存储到一个数组里,然后通过遍历数组来列出全部文件。

importjava.io.*;publicclassListContents{publicstaticvoidmain(String[]args){Filefile=newFile("//home//user//Documents/");String[]files=file.list();System.out.println("Listingcontents of "+file.getPath());for(inti=0;i

1.一个简单的IO程序

Java提供了FileInputStream以及FileOutputStream类来进行文件的读写操作。

FileInputStream的构造方法会接收输入文件的路径作为入參然后创建出一个文件的输入流。相同的。FileOutputStream的构造方法也会接收一个文件路径作为入參然后创建出文件的输出流。

在处理完文件之后,一个非常重要的操作就是要记得”close”掉这些流。

importjava.io.*;publicclassmyIODemo{publicstaticvoidmain(Stringargs[])throwsIOException{FileInputStreamin=null;FileOutputStreamout=null;try{in=newFileInputStream("//home//user//Documents//InputFile.txt");out=newFileOutputStream("//home//user//Documents//OutputFile.txt");intc;while((c=in.read())!=-1){out.write(c);}}finally{if(in!=null){in.close();}if(out!=null){out.close();}}}}

相关文章:

  • java里添加员工信息_SSH_框架整合4--添加员工信息
  • 毛刺现象 java_组合逻辑设计中的毛刺现象
  • java 有界类型_java泛型之有界类型
  • oracle mysql8_这一刻,MySQL 8终于追赶上了Oracle 8
  • power of three java_【LeetCode】326. Power of Three 3的幂(Easy)(JAVA)
  • python2和pytho3切换_电脑上同时安装Python2和Pytho
  • 学JS对学Java有用吗_【JS】编程语言那么多,为啥学Java的人那么多?
  • java offset用法_Java OffsetTime plusMinutes()用法及代码示例
  • php 判断是否对象_利用PHP判断JSON对象是否存在
  • php链接数据库2000,Linux下PHP连接Microsoft SQL Server 2000(图)
  • java获取内存变量,java – 易失性变量,从主内存刷新/读取
  • java二维函数怎么放到表里,调用函数传递二维数组
  • jsonrpc php使用,基于php的json rpc原理及应用
  • php正则表达式变量替换,js正则表达式replace替换变量方法
  • php ab webbance,Apache的ab工具实例详解
  • [笔记] php常见简单功能及函数
  • 【前端学习】-粗谈选择器
  • Angular2开发踩坑系列-生产环境编译
  • Apache Zeppelin在Apache Trafodion上的可视化
  • avalon2.2的VM生成过程
  • Docker容器管理
  • Effective Java 笔记(一)
  • JAVA_NIO系列——Channel和Buffer详解
  • JS学习笔记——闭包
  • yii2权限控制rbac之rule详细讲解
  • 理解在java “”i=i++;”所发生的事情
  • 想写好前端,先练好内功
  • ​2020 年大前端技术趋势解读
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​什么是bug?bug的源头在哪里?
  • # Panda3d 碰撞检测系统介绍
  • #laravel 通过手动安装依赖PHPExcel#
  • #Linux(make工具和makefile文件以及makefile语法)
  • #考研#计算机文化知识1(局域网及网络互联)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (C语言)逆序输出字符串
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (接口自动化)Python3操作MySQL数据库
  • (三)终结任务
  • (算法)Travel Information Center
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • ./configure,make,make install的作用
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .net core Swagger 过滤部分Api
  • .NET Core WebAPI中封装Swagger配置
  • .NET Core 版本不支持的问题
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET建议使用的大小写命名原则
  • ?php echo ?,?php echo Hello world!;?