博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
号称精通Java的你,是否真的名副其实
阅读量:4031 次
发布时间:2019-05-24

本文共 2918 字,大约阅读时间需要 9 分钟。

慎用精通

随着猎头行业的兴盛,一些应聘者往往可以从猎头那得到一些注意事项和过往经验。比如,在简历中切不可随意用上“精通”二字,尤其对于刚入职场的小伙伴。

因为,对于应聘者写上精通和了解没有什么区别,无非是想为自己的简历增色。但是,作为面试官,他们看到“精通”二字可是两眼放光,待着满心的期许和兴奋,开始带着“精通”的标准来向你提问。往往,最终都是以尴尬的气氛收场。

你真的精通么

昨天听了一位资深Java工程师的分享,让我意识到自己的火候还不够,基础不够扎实,平时的思考还是少了点。下面分享几个比较基础的点,以点带面,希望可以带来一些思考,也看看你我离精通二字还有多远的距离。

parseInt和valueOf

我们平时应该都用过或者见过parseInt和valueOf这两个方法。一般我们是想把String类型的字符数字转成int类型。从这个功能层面来说,这两个方法都一样,都可以胜任这个功能。

但是,我们进入源码,看下Integer类下这两个方法

parseInt

public static int parseInt(String var0) throws NumberFormatException {   return parseInt(var0, 10);}

valueOf

public static Integer valueOf(String var0) throws NumberFormatException {   return valueOf(parseInt(var0, 10));}

从代码,我们起码看到了两点

  • 返回结果类型不一样,parseInt方法返回的是int基本类型,valueOf方法返回的是Integer的包装类型

  • valueOf方法实际上是调用了parseInt方法,也就是说,如果我们仅仅只需要得到字符串类型字符数值对应的整数数值,那我们大可不必调用valueOf,因为这样得到整形数值之后还要做一个装箱的操作,将int封装为Integer。

不知道平时忙于编码的你,是否有过压根没有时间管两者区别,而是直接看到谁就用谁的经历。

装箱拆箱

Java的八种基本数据类型:int, short, long, double, byte, char, float, boolean

分别有各自对应的包装类型:Integer, Short, Long, Double, Byte, Character, Float, Boolean

拆箱与装箱是相反的操作。装箱是将一个原始数据类型比如int赋值给相应封装类的变量比如Integer。而拆箱则是将一个封装类的变量赋值给相应原始数据类型的变量。

看一段代码

int i = 0;Integer j = new Integer();...i = j;

看完这段代码不知道你是否已经意识到问题所在了。没错,问题出在了i=j,有人说这没有问题,因为j是Integer类型,在赋值给i的时候会自动拆箱变成int类型。但是如果这时候j在经过一番处理后得到的是一个null值呢,存放在Integer下是没有问题的,因为Integer就是一个类,允许为null,但是在拆箱为null并赋值给基本类型i的时候,这时候就是抛出异常。

所以,拆箱装箱带来便捷的时候,也会有一些坑,需要我们去避免,能有效的避免的前提就是我们要基础扎实。

字符串+和StringBuilder

我们是不是太习惯于在拼接一个字符串时使用类似这样的写法

String result = a + ":" + b + ":" + c;

其实我们看源码就知道,其实每一次+的操作都是将要拼接的字符串创建一个String类型的对象,然后塞到字符串结果中,最后调用toString方法得到最终的字符串。

这样的场景,我们更加推荐使用StringBuilder,通过调用append方法拼接字符串,不需要创建那么多对象浪费系统资源。

我们可以写一段测试代码来看下两种方式的差异

/*** Created by jackie on 17/7/22.*/public class StringAndStringBuilder {   public static  void main(String[] args) {   testString();   testStringBuilder();   }   public static void testString(){       long start = System.currentTimeMillis();       String resultStr = "";       int i = 0;       for (int a = 0; a < 10000; a++) {           resultStr += "abc" + "def" + "g" + i++;       }       System.out.println("using String:" + (System.currentTimeMillis() - start));   }   public static void testStringBuilder() {       StringBuilder stringBuilder = new StringBuilder();       long start = System.currentTimeMillis();       int i = 0;       for (int a = 0; a < 10000; a++) {           stringBuilder.append("abc").append("def").append("g").append(i++);       }       System.out.println("using StringBuilder:" + (System.currentTimeMillis() - start));   }}

最终的运行结果如下

using String:2266using StringBuilder:3

这种效果显然意见,使用String是秒级的2秒多,而使用StringBuilder是毫秒级的3毫秒。

如何做到精通

上面的例子只是冰山一角,说出从入门到精通只需要一秒钟,但是要达到精通的级别却需要我们花费很大的功夫。

  • 看源码 看源码是了解一个数据结构或者算法的最好的方式,通过测试或者调试,我们可以明白那些结构为什么这么设计,也更能够加深自己的理解。

  • 多思考 当代码写多的时候,我们不妨给自己留一点思考的时间,想想我们为什么要这么写,还有没有更好的写法了。

  • 多看书 找些优秀的书籍来读,站在巨人的肩膀上,可以帮助我们少走很多弯路。

精通是一种修行,你我都不能松懈和懈怠。

我有一个微信公众号,经常会分享一些Java技术相关的干货;如果你喜欢我的分享,可以用微信搜索“Java团长”或者“javatuanzhang”关注。

转载地址:http://vgrbi.baihongyu.com/

你可能感兴趣的文章
[LeetCode By Python]118. Pascal's Triangle
查看>>
[LeetCode By Python]121. Best Time to Buy and Sell Stock
查看>>
[LeetCode By Python]122. Best Time to Buy and Sell Stock II
查看>>
[LeetCode By Python]125. Valid Palindrome
查看>>
[LeetCode By Python]136. Single Number
查看>>
[LeetCode By Python]172. Factorial Trailing Zeroes
查看>>
[LeetCode By MYSQL] Combine Two Tables
查看>>
python jieba分词模块的基本用法
查看>>
[CCF BY C++]2017.12 最小差值
查看>>
[CCF BY C++]2017-12 游戏
查看>>
如何打开ipynb文件
查看>>
[Leetcode BY python ]190. Reverse Bits
查看>>
Android下调用收发短信邮件等(转载)
查看>>
Android中电池信息(Battery information)的取得
查看>>
SVN客户端命令详解
查看>>
Android/Linux 内存监视
查看>>
Linux系统信息查看
查看>>
用find命令查找最近修改过的文件
查看>>
Android2.1消息应用(Messaging)源码学习笔记
查看>>
在android上运行native可执行程序
查看>>