第一阶段工作小结
说起来感觉时间过的很快,如果从寒假留校那时候开始,到现在为止大概是接近4个月了。这4个月的时间,我从对java的一无所知,到现在两本java教材基本看完,开始看java Web篇的内容,说起来不得不说时间过的很快。不过今天写的这篇小结主要是写从3月31号,我正式成为实习生开始,到现在的一个工作上的小结吧。下面写的内容就是我一边回忆过去所学知识一边敲打出来的过程。
1:数据结构
java进阶篇的内容刚开始那一部分讲的就是数据结构内容,讲的内容主要有 算法效率,排序算法,线性表、栈、堆、队列、优先队列,二叉查找树,图,加权图。
算法效率这章我主要只是了解,它所讲解的内容我现在还没有很深刻的体会,对于如何计算时间复杂度,空间复杂度还存在疑问,我觉得在真正项目开发的时候我会对这个东西慢慢有所领悟。
接下来是排序算法,基础的排序算法有冒泡排序法,选择排序法,插入排序法,它们的时间复杂度都是O(n^2)。进阶一点的排序算法就是归并排序和快速排序,我感觉两种排序算法的原理都差不多。归并排序是把一个数组不断的分组,直到不能再分之后,又在重新组合起来,所用算法用到了递归的思想,应该来说还是比较消耗时间和空间的。快速排序用的一个主元的思想,说实话我对主元这东西不是太懂,书上所写的程序实现代码我也是似懂非懂。两种排序方法的时间复杂度都是O(NlogN),相比前面3种排序算法,已经好很多了。更高级的算法是堆排序。堆排序用到了二叉树这种结构。首先需要建立一个堆类Heap。Heap的实现就是一个二叉树。有一个根结点,根结点下面有很多结点,每个结点有左子树和右子树(完全二叉树关于左右子树有一个定义,我忘了)。这只是我们人为想象成这样,实际上在内存中还是应用的线性表。堆类建立好了就可以调用堆类的增加删除查找元素的方法。树的遍历有三种形式(后面详解),堆类遍历的方式应该是中序遍历。堆排序的算法效率是O(logN)。后面还有两种排序算法,一种是桶排序,基数排序,另外一种是外部排序。桶排序和基数排序只能对整数进行排序,应用范围较小,但是它的算法效率从变量变成了常量,即O(1),它的时间复杂度与排序数据的多少没有关系,是一个常数,这极大的提升程序效率。另外一个是部排序,适用范围是非常大量的数据,所用到的排序方法其实还是归并排序,只不过因为数据量大,只能将结果存储在外存上,一段一段的进行排序。因为我们现在还很少遇到这种情况,所以我并没有花太多时间。
再接下来是线性表,堆,栈,队列,优先队列。相对而言,我觉得这一章是数据结构内容中比较好学的一章,因为感觉涉及到的知识不是很难,只是在向我们讲解一些新的知识,逻辑性不强。线性表比较熟悉了,因为在C语言中也遇到过。java的线性表有两种,一种是数组线性表,一种是链表。数据线性表本质上还是数组,内存是连续分配的,所以优点是查询速度快,缺点是增加删除元素很慢,因为数组线性表内存空间是连续的,一旦要插入一个元素,它之前或者之后的元素,全部都要移动,所以效率非常低下。链表和数组线性表刚好相反,本质上就是一个一个的结点,每一个结点保存着元素和下一个结点的地址。链表的内存空间是不连续的,因此如果要插入或者删除一个元素,只需要将插入元素的左右两个元素先断开连接,然后各自连接到插入元素上就可以了,增删的速度很快,但是查询的速度就比较慢了。因为内存空间不连续,查询动作需要从第一个元素开始一个一个往下找,这是及其消耗时间的。所以选择用哪种线性表,是根据实际情况来判断的。再下面是栈。堆是一个“先进后出”的数据结构,把它想象成一个桶,先放进去的元素放在下面,取出的时候先取最上面的元素。栈的实际用处很多。比如,函数的调用就是一个栈的实现。主调函数调用被调函数,将被调函数压入栈中,被调函数执行完后弹出被调函数,主调函数继续执行。书上的例子是用来计算一个四则表达式,将数字和运算符号分离出来,用两个栈来实现运算过程。再下面是堆,说起来我对堆的了解不是很深刻。堆我所知道是在JVM分配内存空间的例子
中,堆是为对象存放的空间。堆的内容我不是很了解,需要再好好学习一下。再下面是队列和优先队列,我觉得队列很好懂,就是一个“先进先出”的结构,想象成一个长方形,添加的时候从左边添加,出来的时候从右边出来,先进先出的结构,就是一个队列。优先队列就是给队列中的元素添加一个优先级,优先级高的先出来。 这几种结构相对而言都比较好懂,因为感觉没什么新知识包含在里面。
下面的两个问题是树和图,这是数据结构内容中的最后两章,也是相对来说比较难的地方。
首先说树。树是一种结构。树有一个根结点,根结点有左右子树。左右子树又各自是一个结点,就这样一层层的往下延伸开来。一个结点保存着存放的元素,左右子树的地址,在内存实质也就是数组。一般来说,大小情况是 左子树<当前结点<右子树 。树的一般操作有增加一个结点,删除一个结点,查找元素,修改一个元素,遍历整棵树。树的遍历有三种方式。 前序遍历法,先访问当前结点,再递归(注意是递归)的访问左子树,再递归的访问右子树。 中序遍历法,先递归的访问左子树,再访问当前元素,再递归的访问右子树。 后序遍历法,先递归的访问左子树,再递归的访问右子树,最后再访问当前结点。 还有两种搜索方式,一种是深度优先搜索,本质就是前序遍历法,另一种是广度优先搜索,是层级访问,从根结点开始一层一层的访问。我所知道的树的知识就只有这么多了,而且关于树的操作的一些具体操作还得具体的敲代码才知道。
然后是图。图就是一系列顶点和边的集合。在现实生活中的应用就是交通图,一个城市就是一个顶点,城市之间的距离就是边。首先图的建模方式,常见的一般是两种,邻接矩阵和邻接线性表。邻接矩阵的内容在离散数学中会涉及,我不细讲。邻接线性表我讲一下。首先是把顶点标记,从0开始标记。然后创建一个邻接线性表。然后,这个线性表中每一个元素又是一个线性表。下标为0的线性表中表示顶点0,然后它的线性表中存储的就是和顶点0相连的顶点。比如下标为0的线性表中的元素为1,2,3.则表示顶点0与顶点1,2,3分别相连。这是图建模的常见的两种方式。接下来就是图的具体实现,图的搜索有两种方式,深度优先和广度优先。具体的过程我不细表。然后就是可以从图中获得深度优先搜索树和广度优先搜索树。加权图的部分同优先队列很像,就是给每个顶点加上了权重。有关于图我所了解的内容大概只有这么多了。
关于数据结构内容的一个总结。现在所学的数据结构的内容,感觉上比较虚。因为在我现阶段的实际开发运用中,数据结构的内容运用的东西相对来说很少很少,所以对于数据结构中很多东西我领悟的并不是很深刻。但是要想做一个优秀的程序员,数据结构,算法效率等内容是基础,是基本功,必须要扎实。相对而言,现在掌握得不深,但是在日后真正遇到类似的问题要解决时,就一定要认真的理解吸收。
2 java进阶篇的内容
数据结构之后的内容,也就是从第29章多线程的内容,是java进阶篇的内容。线程 网络 javaGUI进阶篇 MVC 数据库 JTable和JTree。这一部分难度和广度相比基础篇当然是上了一个档次,代码行数上就看得出来,动辄就是一两百行的代码,但是这正说明这几章的内容相当重要。java进阶篇后面的内容相对来说,知识的广度变窄,但是深度加深。
首先讲多线程。java支持多线程技术,多线程往往给人以程序同时运行的错觉,但是那是错误的。CPU只有一个,意思就是同一时间只能有一个程序在运行,但是为什么我们看到的东西很多都是同时运行呢?比如说我可以一遍玩游戏一遍听音乐?那就是因为多线程技术。CPU大部分时间比较闲,所以多线程只是合理的利用CPU的资源,而不是使程序同时运行。首先来将多线程的两种建立方式。一种是继承Thread类,另外一种是实现Runnable接口,两种方式都可以建立一个线程。线程的状态有五种。新建、就绪、运行、冻结、死亡。任何线程都处于都五种状态之一。线程有一个安全问题,当多个线程访问共享资源时,程序可能会出错。为了预防这种情况,需要有一个同步的东西。简而言之就是同一时间只允许一个线程访问共享资源。同步有两种方式,一种是使用关键字synchronized在方法名或者是代码块。另外是使用类Lock来锁住资源。使用显式锁还可以用来线程之间的协作。线程中还有一个称之为 信号量的东西,可以用它来限定访问共享资源的线程的个数。为了提高线程管理的效率,线程可以用线程池来进行管理。
然后是网络这一章。我日后要写Java Web程序,网络这章重中之重。网络这种主要介绍了主机之间主要用套接字来进行网络连接,具体的交流方式还是用IO流,所以java基础篇中的IO流也很重要。网络编程同其他的程序类似,只不过数据交流的方式变成了网络传输,其他的都是一样的。数据传输的有两种,一种是TCP,另外一种是UDP,TCP是面向稳定连接的,UDP是不稳定的。两种方式各有各的好处,各有各的优点。在现阶段网络编程中,我们主要用的是TCP传输。用网络编程最简单就是写一个聊天程序。但是java进阶篇中讲的网络这章还是太少了,只讲述了网络最基础的东西,而其他东西还需要到Java Web阶段中去获取。
后面几章的内容,菜单栏,容器,布局管理器就不细讲了,因为javaGUI方面的应用毕竟越来越少了,我也只是作为一个了解了。最后三章的内容还比较重要,MVC框架,JTable和JTree,还有数据库的知识。它们都比较重要,但是由于是最近才学,我也不再细讲。
3 java就该这样学
这里还简单讲一下王老师给的书【java就该这样学】,不得不说,我能感受到作者是一个相当有才华的人。首先,书的语言觉得幽默,通俗。看这本书,就好像看小说一样,非常有趣,不会觉得编程会是一种负担,这是我非常推崇的语言风格。再其次,作者讲东西并没有按照一般教材上的先后顺序,这样做当然是有好有坏,不过就我而言,我觉得这种做法很好。很多东西,我们并不是不能掌握,早一些学并不一定说就是坏事。在编程路上,我对于学习新知识是非常好奇的。所以作者做可以说正中我的下怀。学习新知识是一种很奇妙的感觉,说不出来,总之感觉很美妙。作者在书中主要也是以项目驱动来讲述知识的,我十分乐意接收这种形式。具体到内容,因为作者所讲的东西大多是已经学过的东西,所以我看书看得比较快,主要是数据库的内容倒是认真看了一遍。总之这本书写得确实是非常好。
以上所说基本上是我一边回忆一边打出来的东西,主要是为了做一个回忆,把所学的知识串联起来。其中说到的内容可能有误,因为基本是靠回忆打出来的,有些东西没有仔细与深究,所以如果有哪里出错了,恳请指正。
说起来要讲的东西东西真的很多,因为说到后来,我许多东西都不得不省去,因为要说的东西实在太多。自从3.31正式成为实习生,在实验室工作学习,我真的感觉自己是从一个量变到质变的过程,收获颇多。
不过,从心里来讲,学得太快,我心中也越发的发虚,因为感觉自己许多知识的基础没有掌握牢。要想成为一个优秀的程序员,基础功是必须的,现在的感觉还是一直在赶的过程。看完java进阶篇,到现在开始看html+css,感觉是在做梦一般,我们的进度确实很快,但是快到底是不是一件好事?所以,我还是希望有一个合适的节奏,不是纯粹推崇快,而是提倡“充实”。我觉得我应该要静下来心来去学习。
烦烦叨叨说了这么多,到最后,还是要提醒自己,努力和加油!当前的一切仍然按照计划去执行!