1. 小镇做题家还会怕笔试?
应聘进入一家企业,除了面试,往往还有笔试环节。
作为考试最卷的国家之一,每一位同学都是从小考到大,可谓身经百战。
老师在学校也经常会帮同学们划个重点什么的。
老师:“这题3分,送分题” 老师:“这题必考,每年都有” 老师:“这个知识点了解就可以了”
但走出校园,就没有那么好的老师帮你划重点了。
而且技术发展日新月异,新知识根本学不过来。
2. 重点怎么找?
其实技术万变不离其中,最核心的关键点,也就是我们常听到的底层逻辑,都是相对不变的。
比如计算机的几大要素:CPU、内存、IO设备等等。
而编程语言也是一样。
2.1 以Java为例,什么是基础?
那必然是JavaSE
每一个Java Dev 必须掌握的知识
无非是
byte short int long float double char boolean java.lang java.util java.io java.sql java.math java.time 等等
有的同学简历里写着阅读过java、linux等源代码,
其实大可不必这么复杂,源代码阅读是非常费精力的,
像什么21天学会Java,3个月精通,都不现实。
新手入门,首先该会用的知识都不能少,即前面提到的那些,
另外还需要避开一些坑的地方
这些坑往往和常识相违背,容易对新手造成困扰。
3. 我是新手吗?
请听题:请用普通话朗读下面的语句
世界上有10种人,一种是懂二进制的,一种是不懂二进制的。
发现了吗?
结合语境,如果你读“十种人”,说明你还是个麻瓜。
程序员思维里,这句话读“二种人”
因为 10 是 二进制的 2
记住
读过的书,走过的路,遇过的人
这些就构成了你的人生格局
4. 笔试陷阱
下面我们给出一些示范
注意,他们在 Java 语言里
与我们所了解的常识都格格不入
让我们从小学数学开始学习编程
4.1 认识小数的四则运算
有同学看到这里就炸了
你是侮辱我的智商吗?
小学四年级的题你考我?
别急,让我们看一个例子
// 请写出以下问题的答案: System.out.println( 0.2 + 0.7 );
看完有的宝宝就生气了,这不就 0.9 吗?
不是的话我跪着吃翔!
还真不是,执行一下程序,结果是
0.8999999999999999
为什么
因为在浮点数默认是double类型
在double运算方面,你可以认为计算机是个智障。
不信你再试试 0.1 + 0.2,结果居然是
0.30000000000000004
再试试 0.4 + 0.5,结果居然是
0.9
这属于完全没规律的情况了,
数字可能正确,可能偏大、可能偏小,而且差值都不一样。
所以这类问题,在Java里都属于模糊的范畴,想要和常识一致,
需要使用BigDecimal类,用于浮点数的精确计算
BigDecimal a=new BigDecimal("0.2"); BigDecimal b=new BigDecimal("0.1"); System.out.println(a.add(b)); // 输出 0.3
这里有几个要点:
- 构造参数必须是字符串格式的数字
- 加减乘除,要用 add,subtract,multiply,divide
具体可以参考 java.math 包,里面还有个 BigInteger类似
发现了吧,第一个坑就如此脑残
别急,后面还有。
4.2 认识整数的四则运算
又有宝宝生气了,
刚才还是小数,现在降格到整数了,
这是一年级还是幼儿园水平啊?
别急,看看下面的这个题目,说出答案:
123+32l
绝对不是侮辱智商
如果你脱口而出 444,那就说明还没进入状态
试想面试会问这么低端的问题?
坑在哪
正确答案是 155
其实这也没什么技巧,
主要考察的是视力有没有5.0
注意审题 123 + 32l
32后面的字是小写的L,不是1
也就是说,题目问的是 123 加 长整形的 32,
结果是不是155?
必须是
这也给我们自己一个警示,写这种代码,请务必大写
123 + 32L,不然就是给你的同事挖坑
类似的在Java语言里还有 f 和 F,浮点数float
这里相加时,会隐式转换,int和long相加,结果是long
说穿了,也不难,就是想没想到这一层。
所以,大家编码写变量的时候,请最好不要用 o O l 这些符号,
数字和字母很难分得清。
4.3 字符串连接问题
来个简单的,请写出以下问题的答案
System.out.println(1 + 2 + "3" + 4 + 5); System.out.println("1" + 2 + 3 + 4 + 5); System.out.println(1 + 2.0 + "3" + 4.0 + 5); System.out.println("1" + 2 + 3.0 + 4 + 5);
答案无非是几种,字符串连接,数字加减等等
先看看答案,看各位猜的对不对
第一行:
System.out.println(1 + 2 + "3" + 4 + 5); // 打印 3345
因为开头的 1+2 都是数字,因此是int的加法
然后遇到了 3 + “3”,运算符两侧有一个是String,就变成了String连接
再后面是 “33” + 4, 还是字符串连接
最后 “334”+5,还是字符串连接
结果 3345
第二行:
System.out.println("1" + 2 + 3 + 4 + 5); // 打印 12345
因为开头就是 “1”+2,整个运算的方式都是字符串连接
因此每一步运算依次是 “12”,“123”,“1234”,“12345”
第三行
System.out.println(1 + 2.0 + "3" + 4.0 + 5); // 打印 3.034.05
这里有变化了,1+2.0,会被视为 int + double,因此会转为double
结果是 3.0,然后 3.0+“3”,变成了 “3.03”
然后 “3.03” + 4.0,变成了 “3.034.0”
最后 +5,结果是 3.034.05
第四行
System.out.println("1" + 2 + 3.0 + 4 + 5); // 打印 123.045
有了第三题的基础,这个就容易了,唯一的变数是中间的double型 3.0
结果是123.045
这里额外说一个点,就是float和double的区别
在Java里默认是double,如果声明float要在结尾加F
例如
double a=1.23; float b=1.23F;
他们主要区别是位数,float是32位,而double是64位
因此允许的数据范围不同
double范围更大,-1.79E+308~-1.79E+308
因此建议大部分开发者,搞不清楚就只用double就行了
讲完以上问题可以发现
很多问题看似简单
但在程序界,有着完全不同的理解
这就是普通人和程序员思维上最大的不同
你的眼界决定你的格局