前两天申请了第一个专栏系列,今天一看已经申请成功了,有点小激动...申请写这个专栏系列的初衷源于:
在去年公司的某个项目告一段落的时候,终于有时间闲下来,回顾一下自己毕业进入工作这一年多来的情况。
然后警惕的发现,有这样一种潜在的危险情况,让我感到迷茫和困扰。那就是,作为一名菜鸟程序员,我发现:
也许我们能够通过自身所学习的技术与知识,来完成工作中的一些任务。
但是!值得警惕!这并不意味着我们真的已经“掌握”了这门技术。
"使用"和“掌握”是两回事,而“掌握”和“精通”又有了一道巨大的鸿沟。
如果你和我一样,也是一名经验尚浅的菜鸟,你不妨你也可以坐下来想想,是不是也常有这样一种困扰。
作为一名Java语言的使用者,我们都知道通过:
~~~
String str = new String("abc")
~~~
这样的方式能够声明一个字符串对象。但是!当你遇到类似于:
通过String str = new String("abc")在内存中产生了几个对象?这样的面试题时。
是不是会突然间感到措手不及。而当看到答案是:1个或2个的时候,就更加惆怅了。
实际上这是因为涉及到了内存中的字符串常量池。
JVM在装载运行一段程序时,如果遇到通过关键字new声明的String类型对象,其首先会检测字符串常量池中是否已经存在一个值为"abc"的对象。
如果常量池中还不存在,那么会首先向常量池中存储进一个"abc"字符串对象,然后再向堆内存中存储进一个"abc"字符串对象。
而如果常量池已经存在该对象,则会直接产生一个"abc"字符串对象存储进堆内存当中。所以答案会是:一个或两个。
又例如:当使用迭代器对一个集合容器进行迭代,如下:
~~~
ArrayList<String> strList = new ArrayList<String>();
Iterator<String> it = strList.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
~~~
但可能你在查看Java的某些源码的时候,可能发现别人使用这样的书写方式:
~~~
ArrayList<String> strList = new ArrayList<String>();
for (Iterator<String> it = strList.iterator(); it.hasNext();) {
System.out.println(it.next());
}
~~~
那两者之间的差别在哪呢?就实现的功能来说,完全没有任何的区别。其区别在于:
使用第一种方式,等同于你在该方法内声明了一个Iterator类型的局部变量,于是当该方法开始运行后,该局部变量也会进入到栈内存当中进行存储,直到随着该方法的执行结束而弹栈,完成内存释放。
而使用第二种方式,等同于在for循环的代码块中声明了一个局部变量,在该for循环结束之后,该局部变量就会从内存中释放,而不必等到该方法的结束。
所以其好处实际在于,从一定程度上,减少了内存开销。
出现的这样的情况,似乎不难预见。其根本还是在于我们学习一样新事物时的目的性。举例来说:
在学生时代老师在讲解某道难题时会说:大家尽量理解,如果实在无法理解,那么就记住这个方法,以后遇到类似的题目,记得使用这样的方法就行。
这没有问题,因为在中国特色的教学体制下,学生时代里大多数人的根本目的在于应对考试,你不能明白解题的原理不要紧,只要你能记住这个方法在考试中答对答案就行。
同理,当你作为一个菜鸟,一个初学者接触一门编程语言时,我们首先关心的是,使用这门语言我们能够实现什么功能。当我们毕业时,我们的首要目的在于找到一份工作。在这样的情况下,造成类似上述"情况”的出现,也就不足为奇了。
所以当我逐渐被类似于这样的情况困扰的时候,我不得不开始思考一个问题:我是否有必要重新深入的学习一下Java了?最后得到的答案是肯定的:
假设你想成为一名车手,那么首先你应该知道“如何驾驶车辆”,例如:可以通过方向盘控制汽车的方向,可以通过刹车让汽车停止运行,可以通过油门让汽车加速等等。但这不过是成为一名车手的基本素质而已。当你慢慢积累的过程中,你应该思考的是:“我如何能成为比其它人更优秀的车手”。于是你想到了:“我要比其它人更快”!这绝对是一个好的方式。但是问题来了?如果你不了解一辆汽车的原理,而只是仅仅知道“可以通过方向盘控制汽车的方向”这样的东西时,你要如何才能将你的汽车改造的比其他人更快呢?
那么,同样的:作为一名程序员,通过你学习的语言或技术来完成某样功能,这只是一名程序员所必备的素质而已。同样的一个功能,你需要20行代码来实现;而另一个人只需要5行。同样的一段计算程序,你的代码需要1分钟完成运算;而别人的只需要10秒。这就是体现价值与差距的地方了。所以说”使用“,“掌握”,“精通”,这是完全不一样的概念。
有了计划,接下来就是付诸行动。于是开始通过一些书籍和相关资料,开始重新深入的学习Java。学习主要是利用平时空余的时间,断断续续从去年10月底到今年年初,现在再回望一眼,的确收获颇丰。中间也写了一些学习总结性质的博客,但比较散乱,不够系统,更不够深入和细致。这就又有悖于我的初衷了。就好比我的初衷原本是:我做了一道数学题,然后我要理解这道为何是这样解答的,然后把解题思路和原理记录下来。结果最终变成了:我做了一道数学题,没有记录其解题思路和原理,反而将这道题靠着记忆在纸上重新默写了一遍。
于是,索性申请了一个专栏系列:
- **新的视角**:以更加细致和深入的角度记录知识结点,完成更系统性的总结归纳。也算是自己做一次系统的记忆巩固。
- 如果和我一样的菜鸟有缘看到了谋篇文章,希望能给您带来一点点帮助;而如果您发现了问题,也希望不吝指出。
所以,如果你和我一样,是一个经验尚浅的菜鸟,就让我们一起用一个小菜鸟的新视角,重走这J2SE之路。
- 前言
- 第一个专栏《重走J2SE之路》,你是否和我有一样的困扰?
- 磨刀不误砍材工 - 环境搭建(为什么要配置环境变量)
- 磨刀不误砍材工 - Java的基础语言要素(定义良好的标示符)
- 磨刀不误砍材工 - Java的基础语言要素(关键字)
- 磨刀不误砍材工 - Java的基础语言要素(注释-生成你自己的API说明文档)
- 磨刀不误砍材工 - Java的基础语言要素(从变量/常量切入,看8种基本数据类型)
- 磨刀不误砍材工 - Java的基础语言要素(运算符和表达式的应用)
- 磨刀不误砍材工 - Java的基础语言要素(语句-深入理解)
- 磨刀不误砍材工 - Java的基础语言要素(数组)
- 换一个视角看事务 - 用&quot;Java语言&quot;写&quot;作文&quot;
- 牛刀小试 - 浅析Java的继承与动态绑定
- 牛刀小试 - 详解Java中的接口与内部类的使用
- 牛刀小试 - 趣谈Java中的异常处理
- 牛刀小试 - 详解Java多线程
- 牛刀小试 - 浅析Java集合框架的使用
- 牛刀小试 - Java泛型程序设计
- 牛刀小试 - 详细总结Java-IO流的使用