tuzi215 tuzi215
关注数: 6 粉丝数: 121 发帖数: 499 关注贴吧数: 9
关于抽象类的具体应用场景 昨天看到有人问到抽象类的意义以及使用。抽象类的使用只是看书上介绍的话有时不能了解它能给我们来的的好处到底有多大。以下用一个具体示例更直观的展示抽象类的使用,相信读完它会对抽象类的使用有一个更深入的了解。 1.有一个应用产品在不同地方实施的时候都需要集成一个第三方的邮件系统。 2.最基础的功能就是要在我们的应用中通过调用第三方邮件系统接口取得未读邮件数并在应用中显示给用户。 3.每个地方的邮件系统可能来自不同公司,有的是socket接口有的是webservice接口,具体调用方法也不一样。 根据以上情况要求设计一种快速简便的集成方式,让实施集成的开发人员可以根据既定接口快速集成。 首先应该能够想到,我们应该有一个类,用于调用第三方邮件系统接口。其中至少应该有一个getUnreadMailCount()方法。我们的程序调用这个方法取得未读邮件数。 也就是说现在我们应该有一个如下的类 : public class MailCommand{ public String getUnreadMailCount(String account){ // 这里使用传入参数account,也就是邮件账号,通过webservice或socket接口 // 获取未读邮件数 } } 根据上方第3点,接口有可能是socket或者webservice方式,根据面向接口编程的思想,为了让业务代码和获取未读邮件数方法实现解耦,决定将上方的类抽象为一个接口,并且使用实现类实现接口。这样,业务代码中只需要调用接口的 getUnreadMailCount方法,即使具体实现类发生变动也不需要改动业务代码,这里以socket方式为例: public interface MainCommand{ public String getUnreadMailCount(String account); } // socket方式的实现类 public class SocketMailCommand implements MailCommand{ public String getUnreadMailCount(String account){ //具体实现 } } 接下来看看这个实现类SocketMailCommand,现在这个实现类中只有一个getUnreadMailCount方法,实际上这个类中还可能会有获取所有邮件数方法,更改密码等方法。socket方式调用第三方邮件系统接口,一般需要先获取socket连接, 然后发送命令,再获取返回值。 获取socket连接部分的代码一般是不变的,所以需要将获取socket连接的代码提取出来单独封装为一个方法,暂时命名其为getSocket()。发送命令的方法一般也不会变动,我们封装为executeCommand()方法。 因为有这两个一般不会变动的方法,所以考虑再抽象出一个抽象类实现MailCommand接口。 如下: //这个抽象类实现了MailCommand接口 public abstract class AbstractSocketMailCommand implements MailCommand{ String excuteCommand(Socket clientSocket, List<String> command){ // 通过已经建立的socket连接对象clientSocket,按顺序执行command列表中的命令 // excuteCommand为内部方法所以没有标识为public } Socket getSocket(String server, int port){ //通过服务器地址以及端口参数获取socket连接并返回 } } // socket方式的实现类,继承自AbstractSocketMailCommand抽象类 public class SocketMailCommand extends AbstractSocketMailCommand { public String getUnreadMailCount(String account){ //具体实现 } } 通过抽象类的引入,不同项目的实施人员在做集成工作时,不再需要自己写建立socket连接以及通过socket连接发送命令的方法,只需要继承抽象类根据具体第三方公司的文档实现 getUnreadMailCount()等方法就行。这是抽象类的一个好处。 另外有一个细节在 抽象类中 excuteCommand()方法中向socket连接发送命令并获取返回值,我们要通过返回值判断执行方法是否成功,这里有一个问题,发送命令的返回值是由第三方邮件系统返回的,每个项目中不同第三方返回值可能不同,判断是否执行成功的规则也不相同。那么我们怎么在 excuteCommand中编码实现判断是否执行成功呢?这里也能利用抽象类的特性来完成这个任务,在 AbstractSocketMailCommand抽象类中添加一个抽象方法,如下: abstract boolean isExecuteSuccessful(String result); 在 excuteCommand方法中使用如下代码判断执行是否成功,代码如下: line = in.readLine(); // 读取socket命令返回值 // 根据返回值 用isExecuteSuccessful方法判断是否执行成功,如果执行成功再继续处理 // 返回值,isExecuteSuccessful在AbstractSocketMailCommand中是抽象方法,相当于 // 给子类定义了一个模版,子类若非抽象类则必须实现这个方法,这就能保证不同项目 // 的实施开发人员能根据不同的规则实现此方法,保证了excuteCommand方法的正常 // 执行。 if (line != null && isExecuteSuccessful(line)) { //isExecuteSuccessful返回成功再继续处理line变量中的返回值 } 通过这个例子能看到,抽象类不但可以实现代码复用,还可以作为模版限制实现抽象类的子类。 可能讲的不是太容易理解,有问题欢迎交流
关于抽象类的具体应用场景 昨天看到有人问到抽象类的意义以及使用。抽象类的使用只是看书上介绍的话有时不能了解它能给我们来的的好处到底有多大。以下用一个具体示例更直观的展示抽象类的使用,相信读完它会对抽象类的使用有一个更深入的了解。 1.有一个应用产品在不同地方实施的时候都需要集成一个第三方的邮件系统。 2.最基础的功能就是要在我们的应用中通过调用第三方邮件系统接口取得未读邮件数并在应用中显示给用户。 3.每个地方的邮件系统可能来自不同公司,有的是socket接口有的是webservice接口,具体调用方法也不一样。 根据以上情况要求设计一种快速简便的集成方式,让实施集成的开发人员可以根据既定接口快速集成。 首先应该能够想到,我们应该有一个类,用于调用第三方邮件系统接口。其中至少应该有一个getUnreadMailCount()方法。我们的程序调用这个方法取得未读邮件数。 也就是说现在我们应该有一个如下的类 : public class MailCommand{ public String getUnreadMailCount(String account){ // 这里使用传入参数account,也就是邮件账号,通过webservice或socket接口 // 获取未读邮件数 } } 根据上方第3点,接口有可能是socket或者webservice方式,根据面向接口编程的思想,为了让业务代码和获取未读邮件数方法实现解耦,决定将上方的类抽象为一个接口,并且使用实现类实现接口。这样,业务代码中只需要调用接口的getUnreadMailCount方法,即使具体实现类发生变动也不需要改动业务代码,这里以socket方式为例: public interface MainCommand{ public String getUnreadMailCount(String account); } // socket方式的实现类 public class SocketMailCommand implements MailCommand{ public String getUnreadMailCount(String account){ //具体实现 } } 接下来看看这个实现类 SocketMailCommand,现在这个实现类中只有一个 getUnreadMailCount方法,实际上这个类中还可能会有获取所有邮件数方法,更改密码等方法。socket方式调用第三方邮件系统接口,一般需要先获取socket连接, 然后发送命令,再获取返回值。 获取socket连接部分的代码一般是不变的,所以需要将获取socket连接的代码提取出来单独封装为一个方法,暂时命名其为 getSocket()。发送命令的方法一般也不会变动,我们封装为 executeCommand()方法。 因为有这两个一般不会变动的方法,所以考虑再抽象出一个抽象类实现 MailCommand接口。 如下: //这个抽象类实现了MailCommand接口 public abstract class AbstractSocketMailCommand implements MailCommand{ String excuteCommand(Socket clientSocket, List<String> command){ // 通过已经建立的socket连接对象clientSocket,按顺序执行command列表中的命令 // excuteCommand为内部方法所以没有标识为public } Socket getConfiuredClientSocket(String server, int port){ //通过服务器地址以及端口参数获取socket连接并返回 } } // socket方式的实现类,继承自 AbstractSocketMailCommand抽象类 public class SocketMailCommand extends AbstractSocketMailCommand { public String getUnreadMailCount(String account){ //具体实现 } } 通过抽象类的引入,不同项目的实施人员在做集成工作时,不再需要自己写建立socket连接以及通过socket连接发送命令的方法,只需要继承抽象类根据具体第三方公司的文档实现getUnreadMailCount()等方法就行。这是抽象类的一个好处。 另外有一个细节在 抽象类中 excuteCommand()方法中向socket连接发送命令并获取返回值,我们要通过返回值判断执行方法是否成功,这里有一个问题,发送命令的返回值是由第三方邮件系统返回的,每个项目中不同第三方返回值可能不同,判断是否执行成功的规则也不相同。那么我们怎么在excuteCommand中编码实现判断是否执行成功呢?这里也能利用抽象类的特性来完成这个任务,在 AbstractSocketMailCommand抽象类中添加一个抽象方法,如下: abstract boolean isExecuteSuccessful(String result); 在 excuteCommand方法中使用如下代码判断执行是否成功,代码如下: line = in.readLine(); // 读取socket命令返回值 // 根据返回值 用isExecuteSuccessful方法判断是否执行成功,如果执行成功再继续处理 // 返回值,isExecuteSuccessful在AbstractSocketMailCommand中是抽象方法,相当于 // 给子类定义了一个模版,子类若非抽象类则必须实现这个方法,这就能保证不同项目 // 的实施开发人员能根据不同的规则实现此方法,保证了 excuteCommand方法的正常 // 执行。 if (line != null && isExecuteSuccessful(line)) { //isExecuteSuccessful返回成功再继续处理line变量中的返回值 } 通过这个例子能看到,抽象类不但可以实现代码复用,还可以作为模版限制实现抽象类的子类。 可能讲的不是太容易理解,有问题欢迎交流
关于LinkedList的使用场景及优化 有人问到这个问题,顺便上网查资料深入了解了一下。以往问及什么时候用ArrayList什么时候用LinkedList,往往答案是,当大量随机检索数据时使用ArrayList,当频繁插入删除操作时使用LinkedList。按照数据结构来说,确实是LinkedList在插入删除操作时的复杂度要低于ArrayList。但在现实代码实现以及实际执行性能上,却不一定是这样。根据查阅的资料整理如下,欢迎讨论。 首先要了解两种List的不同应该先了解其代码实现。 ArrayList是通过索引访问的数组实现,而LinkedList使用过 链表原理实现。 ArrayList的get(i)不需要遍历可以直接通过索引获取数据,而LinkedList需要遍历,遍历到i索引位置时将当前位置数据返回。 网上有人贴了这样一段代码: public static void main(String[] args) { // TODO Auto-generated method stub LinkedList list = new LinkedList(); for (int i =0;i<=1000000; i++) { list.add(i); } long start = System.currentTimeMillis(); list.get(1); long end = System.currentTimeMillis(); System.out.println(" time to traverse 1st element " + (end - start) ); start = System.currentTimeMillis(); list.get(999999); end = System.currentTimeMillis(); System.out.println(" time take to traverse 999999th element " + (end - start) ); } time to traverse 1st element 0 time to traverse 999999th element 0 他问既然LinkedList需要遍历读取数据,为什么我获取第一个数据和最后一个数据用的时间是一样的。 看一下LinkedList的get代码就应该明白了,遍历可能会从列表头部或末尾开始进行,取决于i在列表的前半部还是后半部分: public Object get(int index) { //check the index is valid first .. code not shown here Entry e = header; //starting node //go forwards or backwards depending on which is closer if (index < size/2) { for (int i = 0; i <= index; i++) e = e.next; } else { for (int i = size; i > index; i--) e = e.previous; } return e; } 同样在特定索引位置插入数据时,也是先遍历到那个位置再进行插入。这样很容易理解,当很大数据量时(比如1W),在LinkedList前部和后部进行删除插入操作,速度会很快,但是如果是在中部进行操作,测试结果就不那么乐观了,性能甚至不及ArrayList。 所以建议在数据量很大,同时存在链表头部以及尾部的频繁操作,并且很少执行中部数据操作时使用链表。其实这种情况也可以考虑使用ArrayDeque,因为链表在新增数据时会创建额外对象,记录上一node和下一个node的信息,会占用额外空间,而ArrayDeque则不会增加额外空间,不会增加GC工作。其他情况在ArrayList初始化大小设置合理时使用ArrayList能获得更好性能。 知道LinkedList的应用场景,再说说如何正确使用LinkedList。 首先是遍历,遍历LinkedList必须使用iterator不能使用for循环,因为每次for循环体内通过get(i)取得某一元素时都需要对list重新进行遍历,性能消耗极大。 另外不要试图使用indexOf等返回元素索引,并利用其进行遍历,例如下面的代码: final int startPos = lst.indexOf( first ) + 1; //使用indexlOf对list进行了遍历,当结果为空时会遍历整个列表。 final ListIterator<String> iter = lst.listIterator( startPos ); //如果startPos的元素在列表前半部,那这两行代码相当于平均要遍历了列表1.25的长度,因为 listIterator( startPos )也需要从头遍历,当到达指定元素后开始循环如下操作。 while ( iter.hasNext() ) { if ( iter.next().length() == 5 ) iter.remove(); } 以上总结,网上的讨论很激烈,持有各自意见,以上为我的总结。有问题可以给我指出,谢谢
致Java初学者 大学开始接触Java,转眼9年,那时候东西基本靠自学,自学的话其实很费力,有问题只能自己慢慢查,进度很慢,意外的收获也许是工作后发现解决问题的能力还算不错。那时候一个很低级的疑问现在还记得,Java跟JavaScript有什么关系。。当时在图书馆碰到了导员,问了这个问题,答案当然是完全没有关系,这是两种完全不同的编程语言。要说到现在后悔大学什么没学好,可能就是英语吧,对于学习任何一门技术来说英语都是一个必要的工具,记得一次在国内网站查到东西,结果怎么测试都是有问题,结果意外的在国外网站发现了原文,才发现国内被转载到各个网站的这篇译文有翻译错的地方。。还有很多外文书籍,虽然也有中文版,但是看过影印版的才会更深刻理解作者想要说的意图。工作后很多大公司也是需要英语能力,不光是阅读与书写,甚至口语要求也很高,但是这样才会有出国的机会嘛,出去走走,长长见识,同学说米国的程序员环境还不错,还有4,50多岁了还在在安心编码的程序员。 楼主现在虽然不怎么做开发了,但是技术一直没扔下,偶尔还做一些集成工作,这里说的集成无非就是针对特定类型第三方应用做一些集成接口在当前项目工程下,当有这种类型的第三方应用需要做集成的时候通过简单改动写配置即可完成对接,技术上倒是不难,主要就是做出来的东西可以让别人用着感觉方便,能够快速完成集成这种无聊工作。大多用Spring来实现。 现在的情况开发工具一般使用Eclipse,公司电脑不能装盗版软件,一般的程序员使用的文档编辑器也统一用的免费的OpenOffice。中间件一般是weblogic,偶尔一些小项目用apache和tomcat,数据库一般是Oracle,虽然工程中也支持MySql,后台用的mybatis,也是头两年从hibernate转换到了mybatis,框架是部门编写的,开发人员使用起来很简单主要专注业务逻辑,做J2EE现在的前端要求很高,一般做java的开发人员要求HTML JS JQUERY这些都是必备的,项目里现在倒是很少用到jsp了。可以学一点linux的简单操作。说来作为一个JAVA J2EE方向程序员需要会的东西还是需要很全面的。 学习资料说起来作为自学也是很重要的,书或者视频都很好,视频可以看看http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.learnnowjava.com&urlrefer=3b51c1e6a3e5997e52e6365afe54e948的视频,收费的而且是英文无字幕,楼主曾经发过邮件过去询问是否能提供字幕,很遗憾。。没有。他的价格可以观察下,经常会打5折,最低的时候一年3,4百人民币吧,很划算,里面的内容很丰富,讲的东西也不错。图书的话说实话看的不多,主要是拿来做参考书了。用的时候去查一查,身边可以备一本这样的书。 如果吧里的初学者比较多我会在业余时间整理写学习笔记出来分享。最后祝所有初学JAVA的同学朋友学有所成 XD
关于 Algorithms Quicksort 快速排序算法 快速排序是一种不仅为了教学目的而且实际应用广泛的快速排序算法。平均来说,这个算法的复杂度是O(n log n),所以十分适合用来对大数据量进行排序。当你理解后,会觉得快速排序算法的思想十分简单,甚至你可以像写冒泡排序算法那样很快的写出快速排序的算法。 算法 快速排序采用了分治法的策略,下面描述了递归的步骤: 选择一个中间值。我们选择一个中间元素作为中间值,这个中间元素可以是在待排序元素范围内的任何值,甚至即使它不存在于待排序数组中也可以。 分组. 我们使用以下方法来对元素进行重新排序:将所有小于中间值的数据排序到数组的左半边部分,所有大于中间值的数据放在数组的右半边部分。等于中间值的数据可以任意的放在数组左边或者右边。注意,这个待排序数组可能被分隔为两个不等长的部分。 对分隔后的两个数组进行排序。 用递归的方法对左右两个部分分别使用快速排序算法。(快速排序还有非递归的方法,更加高效) 分组算法详解 有两个索引 i 和 j ,在分组算法最初 i 指向待排序数组的第一个元素而 j 则指向数组的最后一个元素。向后移动索引 i ,并将其指向的元素与中间值比较直到出现大于中间值的元素,这时再向前移动索引 j ,并将其指向元素与中间值比较,直到出现小于中间值的元素。这时如果 i < j,就将 i 指向的元素与 j 指向的元素进行对调,并将 i 移动到下一个元素的位置,j 移动到前一个元素的位置。 最后当i = j 时整个分组过程结束。 分组后,所有在第 i 个元素之前的值都小于等于中间值,而在 第 j 个元素后的所有值都大于等于中间值。 示例. 对{1, 12, 5, 26, 7, 14, 3, 7, 2} 进行快速排序注意,为了不让示例过长,我们在这里只是演示了递归的第一层的步骤,但是,实际 {1, 2, 5, 7, 3} and {14, 7, 26, 12} 会继续进行递归排序。 为什么这种排序方法可行? 在分组这一步,我们将待排序数组分隔为了两个部分,这样使左边部分中所有元素a都小于等于右边部分中的元素b,并且a 和 b 满足 a ≤ pivot ≤ b .在完成递归调用后左右两个部分的数组便都是有序排列的,考虑上边说的满足条件即可得出整个数组被排序的结论。 复杂度分析 平均地,快速排序算法的复杂度为 O(n log n ) ,但是证明过程就不在这里写了。在最坏的情况下,快速排序执行O(n2)次,但是应用在大多数实际的数据中都表现良好,并且效率一般优于其他复杂度为O(n log n) 的排序算法。 代码片段 分组算法自身是很重要的,因此它可以提出作为单独的功能点。C++中包含固定的函数用来执行快速排序,但是java中包含两个单独的函数分别用来分组和排序。原文地址:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.algolist.net%2FAlgorithms%2FSorting%2FQuicksort&urlrefer=e5ba7673cb4aa6c52285c1d1c1ca5cf6
Servlet Hello World Servlets是单纯用Java来处理web请求的一个解决方案。许多应用用Servlets替代了JSP,还有一些人整合使用Servlet与JSP。有经验的JSP开发人员用Servlets配合JSP来创建清晰简洁的应用。Servlets负责JAVA程序逻辑部分:如表单处理,计算和数据库查询等操作。而JSP负责格式化并展示Servlets处理后的结果。 用你最喜欢的文本编辑器notepad,emacs,vi 等等,创建以下servlet WEB-INF/classes/test/HelloServlet.java现在可以通过/resin-3.0/hello来浏览servlet。Resin(服务器类似于apache)将自动编译你的servlet。浏览servlets不同于页面,因为你实际上是运行了一个servlet类,不是在看一个页面。/hello 这个地址是在下面为hello,world这个servlet配置的。 配置: 需要在WEB-INF/web.xml中为servlet进行配置。 servlet需要在配置文件中进行配置并且需要为它配置一个访问地址(URL)。<servlet>这个标签用来配置servlet,在我们这个简单的示例中,我们只需要为我们的servlet定义一个名字。 <servlet-mapping>这个标签定义了可以执行servlet的访问地址。在我们这个示例中, /hello 这个地址可以执行我们的servlet。而实际执行servlet的地址应该是访问应用的地址加上servlet配置的地址,例如/doc/servlet/tutorial/helloworld + / hello 即/doc/servlet/tutorial/helloworld/hello进行以上配置后即可通过应用地址+servlet地址来执行servlet了 原文:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.caucho.com%2Fresin-3.0%2Fservlet%2Ftutorial%2Fhelloworld%2Findex.xtp&urlrefer=547d50ba32930153cb6a456786d4ac7b。 对文章进行了截取,摘除不重要的部分
将数组转换成列表示例 这个实例通过Arrays.asList()方法将一个数组转换成了List,但是需要注意,这个生成的List不是java.util.ArrayList而是Arrays的内部类。所以不能直接在其上执行add()等java.util.ArrayList才有的方法。 参考:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fblog.csdn.net%2Fwanbin021614%2Farticle%2Fdetails%2F1771384&urlrefer=6bd5ce355fb6837aff8fc8af1f0ea343 原文:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.java-examples.com%2Fcreate-list-java-object-array-example&urlrefer=da92e4f8a5f778d8b0cefccf70ace46e 代码如下: 截图:代码: /* Create List from Java Object Array Example 利用数组创建List的示例 This java example shows how to create a List from an array of type Object using 这个Java示例展示了如何使用Arrays的asList方法来利用一个数组生成List对象 asList method of Arrays class. */ import java.util.Arrays import java.util.List; import java.util.Iterator; public class CreateListFromObjectArrayExample{ public static void main(String[] args){ //create an array of type Object, in this case we will create String array、 //创建一个数组类型对象,在这个示例中我们创建一个字符串数组 String[] strArray= new String[]{"Object","Array","Converted","To","List"}; /* To create List from an array of type Object use, static List asList(Object[] objArray) method of Arrays class. This method returns a fixed sized list backed by original array. 为了利用一个数组对象初始化创建List,我们使用 Arrays类中的asList()这个静态方法。 这个方法返回一个与原始数组对象相同长度的List */ List list = Arrays.asList(strArray); //get an iterator 取得一个迭代器 Iterator itr = list.iterator(); //iterate through list created from Array 遍历使用数组生成的list System.out.println("List created from an Array of type Object contains,"); while(itr.hasNext()) System.out.println(itr.next()); } } /* Output would be 输出为: List created from an Array of type Object contains, Object Array Converted To List */
学习Java的准备工作 Java是一门使用广泛,方便学习的编程语言,如果你已经会了其他任何一种编程语言,转学Java将会更加容易,唯一需要理解的概念就是面向对象。 尽管Java入门简单,但是想要在Java的路上走的更远确实要在一些个方面打好基础,越高端的部分相对来说参考资料,可交流人群会越来越少,这样少不了要更多的查阅英文文档资料,这里就要求英语要打好基础,要过关,至少我们公司的职位级别,从高级软件工程师开始需要能无障碍阅读英文文档,资深软件工程师则需要能用英文进行技术主题的交流,可见英语重要性。 除去英语不说,学习Java应该边写代码边学习,所以要先了解开发环境的准备工作,JDK的安装,IDE的选择,环境变量的配置等前期工作。(当然最开始可能会建议使用文本编辑器,以及完成手动编译执行等操作,熟悉后可使用IDE进行开发,IDE主要简化了开发的工作量,提供了代码提示,代码检查以及重构等功能) 刚开始学习Java少不了遇到各种各样的错误,获取错误信息最主要的途径就是从控制台查看错误日志,想在学习Java的时候少费力最好在初期就掌握查看错误日志的方法,以及根据错误信息搜索解决办法的能力。 说到自学,一本得心应手的入门书籍也是少不了的,这里推荐一本《Head First Java》,非常好的入门书籍,一点也不枯燥,可以像看杂志一样读完它,读完这本书相信对Java会有一个全面的了解,之后再阅读同类以及更高级的书籍时一定会理解得更加透彻。 自学还有一个方法可以提高学习效率以及帮助自己理解得更加透彻,就是记笔记,将自己学习的东西记录下来,分享出去,分享需要让别人容易理解你的意图,所以在你组织语言的同时可能会发现你学到的东西在头脑里更加清晰,理解了一个东西比死记硬背记得更牢。 其它需要注意的地方,欢迎补充:)
给Java初学者的第一个帖子 大学开始接触Java,转眼9年,那时候东西基本靠自学,自学的话其实很费力,有问题只能自己慢慢查,进度很慢,意外的收获也许是工作后发现解决问题的能力还算不错。那时候一个很低级的疑问现在还记得,Java跟JavaScript有什么关系。。当时在图书馆碰到了导员,问了这个问题,答案当然是完全没有关系,这是两种完全不同的编程语言。要说到现在后悔大学什么没学好,可能就是英语吧,对于学习任何一门技术来说英语都是一个必要的工具,记得一次在国内网站查到东西,结果怎么测试都是有问题,结果意外的在国外网站发现了原文,才发现国内被转载到各个网站的这篇译文有翻译错的地方。。还有很多外文书籍,虽然也有中文版,但是看过影印版的才会更深刻理解作者想要说的意图。工作后很多大公司也是需要英语能力,不光是阅读与书写,甚至口语要求也很高,但是这样才会有出国的机会嘛,出去走走,长长见识,同学说米国的程序员环境还不错,还有4,50多岁了还在在安心编码的程序员。 楼主现在虽然不怎么做开发了,但是技术一直没扔下,偶尔还做一些集成工作,这里说的集成无非就是针对特定类型第三方应用做一些集成接口在当前项目工程下,当有这种类型的第三方应用需要做集成的时候通过简单改动写配置即可完成对接,技术上倒是不难,主要就是做出来的东西可以让别人用着感觉方便,能够快速完成集成这种无聊工作。大多用Spring来实现。 现在的情况开发工具一般使用Eclipse,公司电脑不能装盗版软件,一般的程序员使用的文档编辑器也统一用的免费的OpenOffice。中间件一般是weblogic,偶尔一些小项目用apache和tomcat,数据库一般是Oracle,虽然工程中也支持MySql,后台用的mybatis,也是头两年从hibernate转换到了mybatis,框架是部门编写的,开发人员使用起来很简单主要专注业务逻辑,做J2EE现在的前端要求很高,一般做java的开发人员要求HTML JS JQUERY这些都是必备的,项目里现在倒是很少用到jsp了。可以学一点linux的简单操作。说来作为一个JAVA J2EE方向程序员需要会的东西还是需要很全面的。 学习资料说起来作为自学也是很重要的,书或者视频都很好,视频可以看看http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.learnnowjava.com&urlrefer=3b51c1e6a3e5997e52e6365afe54e948的视频,收费的而且是英文无字幕,楼主曾经发过邮件过去询问是否能提供字幕,很遗憾。。没有。他的价格可以观察下,经常会打5折,最低的时候一年3,4百人民币吧,很划算,里面的内容很丰富,讲的东西也不错。图书的话说实话看的不多,主要是拿来做参考书了。用的时候去查一查,身边可以备一本这样的书。 如果吧里的初学者比较多我会在业余时间整理写学习笔记出来分享。最后祝所有初学JAVA的同学朋友学有所成 XD
1 下一页