Previously on OOP:
Declaration of an array storing object references of Person class was the first topic covered in last session. And the 2ndtopic is the application of several pre-defined methods in String class, for instance, equal() method can tell whether the content of two Strings are the same.
且说上回提到过一个.java文件的开头有两件重要的事情,第一件是声明自己所在的package,第二件则是import进来一些库类。这两件事情在一般情况下,都是编译器能自动做好的,比如我们创建BasicStrings的时候,就能自动写好package的名称是strings;但是也有例外,比如需要import一些类似于Comparable的库类的时候,编译器会提供多个选项供开发者选择,这时候千万不能乱选,否则相当于引入的函数是完全错误的函数。
都灵理工大学的授课老师经常用“monkey”来比喻有的学生编程的时候不思考,编译器提示是什么就是什么,经常被编译器引上不归路。所以,本黄鸭要提醒各位宝宝们,虽然.java文件的开头是由编译器负责的,但是这里还是值得开发者花费两秒钟稍微检查一下的。
下面,就让我们来看一个需要import Java library的例子:
上面这段代码的作用是计算并打印出4的平方根。开平方是一种稍微复杂一点的数学运算,从编程实现的角度上来讲,有两种做法:
(1)百度上抄一个,或者自己编写一个新的开平方函数。
这种做法非常不推荐,首先是因为新编写的函数的正确性不一定有保证;其次是因为这是一种Java library的资源的浪费,相当于不会把钥匙插入两千马力的汽车启动引擎,而是在汽车的前面用两匹马拉着;最后是因为这种做法降低了代码的重复利用率。
总之,本黄鸭建议,假如发现自己编写的某一个函数在Java library中有,那么就赶紧删掉改成调用Java library的方法。
(2)调用Java library中已经编写好的函数。非常推荐~
开平方根函数sqrt()是Math类中的一个静态函数,所以都不用创建Math类的实例,直接用类的名称+ dotted notation + method name就可以调用了。
当开发者写到“Math.sqrt(4);”时,这一行的开头会出现一个红底的叉号,来提示开发者有编译错误。如果把鼠标移动到叉号上面,编译器会询问:Math类现在找不到,是不是要import进来?这时,我们可以果断双击,即选择“yes”,编译器一定会在这个.java文件的开头加上例子中的import语句。
有的同学想到老师上课讲的“monkey”现象,于是还要到API Java library中去确定这个库类确实存在。本黄鸭可以负责的告诉大家,这种行为属于完全没有必要的over-reaction,我们应该记清楚的是本课程中哪些Java library可能会被编译器搞错,然后重点排查即可。
接下来,“Math.”可以被省略:
强大的Java编译器还是可以找到sqrt()在Math类中,但是建议最好还是写上,免得其他人类读到代码以为前面省略的是“this.”,从而以为这个函数被定义在StaticExamples类中。
且说上回还提到了String的几个方法。在理论部分,我们曾经学过,StringBuffer是一种比String更高效的类;甚至于还曾经建议过,过程都用StringBuffer来做,最终的结果再调用toString()函数转化到String类型。
下面,我们用实践来证明一下String的低效和StringBuffer的高效。先看String:
上面这段代码利用了for循环,不停地往字符串后面concatenate循环结构的index。循环会在执行了一万次之后停止。本黄鸭再强调一遍要点:
(1)“+”在字符串处理中不是运算符号,而代表了concatenation。
(2)String is immutable,所以在一个字符串后面加东西,等于要新建一个字符串,再把所有内容完整地写进去,最后把老的字符串的object reference连上新的字符串。
在循环开始和结束的时候,分别打印一遍system time。两个时间相减,就可以得到执行循环需要的时间。
再看String\Buffer:
StringBuffer is mutable,所以在一个字符串后面append其他字符串,只要调用append()函数就可以了,不用新建一个StringBuffer。
StringBuffer的append循环也是一万次,并且在循环开始和结束之时,各打印一遍system time,用于计算执行循环的时间。最后,通过比较两个循环消耗的时间可以看出,StringBuffer比String的效率高出很多。
欢迎使用本黄鸭编写的小程序~
微信公众号二维码:
领取专属 10元无门槛券
私享最新 技术干货