• [分享交流] 【干货分享】Java中如何优雅地关闭资源
    关于Java中的资源关闭,是一个常见的问题,也是最容易被初级程序员忽略的一个问题,这个问题的严重性,吃过亏的人都知道,不需多说。之所以会出现这个问题,主要还是在Java 7之前,语言没有很好地提供资源管理的语法。我们先看下面的代码:Java 代码声明的资源必须放在try语句块的外面,最后在finally中关闭。这里存在很多容易导致问题的地方:1、声明的资源在try语句块中打开后,忘记在finally中关闭;2、关闭资源的代码没有放在try-catch块中,一旦牵涉到多种资源的关闭,前面的抛异常,后面的被跳过,导致对应的关闭代码没有执行;3、如果资源的关闭没有放在finally中,也会导致打开的资源没有正常关闭。这些问题比较隐蔽,如果代码相对比较复杂,就非常容易被忽略。还有一个问题,就是代码很长,非常丑陋,非常不利于维护。当然,这个问题很容易想到解决方案,就是把资源关闭的代码抽出来,形成一个公共的工具方法,就像下面这样:-Java 代码由于java.sql.Connection,java.sql.PreparedStatement都没有实现java.io.Closeable接口,所以,这个公共的方法使用不了,当然,我们重新再定义带这两种参数的重载方法就行了,就像下面这样:-Java 代码最后,我们的代码像下面的样子:-Java 代码OK,这已经比开始简化了不少,如果没有更进一步的追求,到此打住也无可厚非。但我们再仔细研究下就会发现依然存在以下问题:1、待关闭的资源必须要在最外层声明,有多少种就要声明多少次,这和Java变量声明的原则(哪里用哪里声明)不一致;2、声明多少次,就要调用多少次close,还是容易遗漏。那最好的方案是什么呢?请看下面的代码: -Java 代码引入MyCloser,变量用的时候再声明,不用放到最外面,资源的关闭,在finally中一行代码解决。下面是MyCloser的代码:-Java 代码这是一个典型的适配器模式,因为Google的Guava框架提供的Closer资源管理器只支持实现了java.io.Closeable的资源,对于像java.sql包中的资源,都没有实现该接口,因此,MyCloser提供了对应的适配,使所有的资源管理模式一致。在Java 7之前,这应该是最优雅的资源管理方案。在Java 7及之后,我们可以使用最新的资源管理语法try-with-resource,上面的代码可以这么写:-Java 代码可以看到,我们不用关心资源的关闭了,只要在try()中声明即可,这样的代码是最简洁也是最具表现力的,如果生产环境支持Java 7,最先考虑的应该是这个方案。当然,由于历史原因,我们可能用到了一些第三方的包,牵涉到资源关闭,但对应的类却没有实现java.lang.AutoCloseable接口,当然也就不能使用try-with-resource语法来操作了,这时,有两种办法,一是提供一个适配的子类,实现java.lang.AutoCloseable接口,在其close中实现资源关闭逻辑,这样就能使用try-with-resource语法了;第二种就是使用MyCloser方案。推荐第一种,因为更简单。
  • 【干货分享】JAVA字符串trim的坑及解决方案
    在数据的页面录入或者Excel导入的过程中,字段的值在**数据库之前,一般都会进行去前后空格的处理,常见的处理方式无非是在前端页面调用jQuery的trim方法,或者在服务端调用Java的String.trim方法,或者在**的SQL语句中,调用数据库的函数trim,这三种方式,无论采用哪一种,都会有一个严重的漏洞:该方法只针对半角的空格起作用,对全角的空格一点用都没用。为此,我们开发了一个工具类,专门用于处理这个问题,其基本的原理,就是找到全角空格的Unicode码,然后替换掉前后的全角、半角空格。具体代码如下:-Java 代码
  • JEP 282 jlink:Java链接器
    概要创建一个用于将一组模块和它们的依赖组装与优化到一个自定义运行时镜像中去的工具,此运行时镜像的细节在 JEP220 中定义动机JEP261 在编译时(javac命令)和运行时(java命令)之间定义了一个可选阶段:链接时。链接时需要一个链接工具用于组装和优化一组模块以及它们的可传递依赖,以建立一个运行时镜像,或可执行文件。运行时是一个对全局进行优化的较好时机,因为在编译时进行优化会比较困难,而在运行时进行优化代价高昂。一个例子是,在一个计算的所有输入成为常量(亦既非未知)时对其进行优化。还有一个例子是把不再会被执行到的代码移除。描述$ jlink --module-path --add-modules --limit-modules --output [*]–module-path 是链接器将要发现可观测模块的路径。这些模块可以是以 JAR 文件,JMOD 文件或 exploded 模块的形式存在[*]–add-modules 将要被加入运行时镜像的模块名。这些模块还会通过传递依赖,导致更多的模块被加入[*]–limit-modules 对可观测模块的**进行限制[*]–output 用于存放产生的运行时镜像的路径–module-path, –add-modules 和 –limit-modules 选项在 JEP261 中进行了详细描述。其余 jlink 将会支持的选项包含:[*]–help 打印使用/帮助信息[*]–version 打印版本信息
  • Java Reflection
    Java反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息。反射还可以让我们在运行期实例化对象,调用方法,通过调用get/set方法获取变量的值。Java反射机制功能强大而且非常实用。举个例子,你可以用反射机制把Java对象映射到数据库表,就像Butterfly Persistence(译者注:原作者所编写的框架)所做的那样,或者把脚本中的一段语句在运行期映射到相应的对象调用方法上,就像 Butterfly Container(译者注:原作者所编写的框架)在解析它的配置脚本时所做的那样。目前在互联网上已经有不胜枚举的Java反射指南,然而大多数的指南包括Sun公司所发布的反射指南中都仅仅只是介绍了一些反射的表面内容以及它的潜能。在这个系列的文章中,我们会比其他指南更深入的去理解Java反射机制,它会阐述Java反射机制的基本原理包括如何去使用数组,注解,泛型以及动态代理还有类的动态加载以及类的重载的实现。同时也会向你展示如何实现一些比较有特性的功能,比如从一个类中读取所有的get/set方法,或者访问一个类的私有变量以及私有方法。在这个系列的指南中同时也会说明一些非反射相关的但是令人困惑的问题,比如哪些泛型信息在运行时是有效的,一些人声称所有的泛型信息在运行期都会消失,其实这是不对的。
  • [技术交流] 是学习Java还是Python?一张图告诉你!
    Java 和 Python 一直都是两种很火很强大的编程语言,对于刚开始起步学习编程的同学来说,会迷惑且最经常问的问题是,我该学 Java 还是 Python,是不是 Python 容易学,或是应该先学什么编程语言等等这样的问题。 作为一名 Java 程序员,肯定会建议你先学 Java,然后再学 Python,但如果你问一个 Python 程序员,可能会得到一个完全相反的答案。与此同时,随着人工智能技术的不断发展,Python 已经不再是乳臭未干的黄毛小子了,它已经成长而且和主流的编程语言,像 Java,C++ 有的一拼。 当最开始接触 Python 的时候,会觉得它是一门脚本语言,但是后来发现这是误解。你也可以在 Python 中进行面向对象的编程。对于初学者,选择一种具有吸引力的,同时有着强大社区支持的语言去学习。现在 Java 和 Python 都满足刚才说的条件,甚至在做了一些很棒的分析比较之后,依然很难得出应该学习哪个语言。庆 幸的是,我们有信息图形,可以指出 Python 和 Java 之间一些重要的不同点。 一张图告诉你!Python 和 Java 的不同点: 从图表中,你可以很容易看出 Java 比 Python 罗嗦。在 Java 中读一个文件要写10行代码,而在 Python 中只要两行。这一点是 Python 的优势,因为很多新手程序员会喜欢编写很少的代码,第二点则是关于静态变量,动态变量,你需要强类型的语言和严谨的编译器来检测犯二的代码。 在 Java 中,你不会看到,在一个字符串变量中接着存整型变量。执行速度是企业级应用的命脉,你可以看到 Java 比 Python 快,但是要记住,你需要编译才能运行 Java 程序,而 Python 程序不要编译可以直接运行。Python 控制台可以直接解释 python 命令,这对于新手来说意味着会更加简单! 所以现在 Python 和 Java 2:2,扯平了。 虽然你还会看到 Java 中 hello world比 Python 需要更多行代码,但最终你会发现,他们二者的能力是一样的,没有谁差。当然,学 Java 并把它当成职业生涯的编程语言,你绝不会后悔。但与此同时,你可以在任何时候学习 Python,这对于写一些小的工具集也非常有用。 最后,Java和Python都是工具,选择什么工具取决于你想要干什么,所以你要想好你要干什么再找合适的工具才是可行之道。无论你选择何种编程语言,都去好好享受编程吧。
  • 如约而至,Java EE 8 最终规范现已正式推出!
    Java EE 在其 GitHub 上的账号发布了 Java EE 8 最终规范,并提供了 PDF 格式的文件下载。按照此前公布的计划,Java EE 8 最终规范会在今年夏天结束前发布。现在看来,他们并没有食言。在 JCP 主页上,我们可以看到,在 8 月 21 日,JCP 执行委员会以 24 票赞成票通过了 JSR #366 的最终批准投票。其中,英特尔公司放弃了投票Java EE 8 规范从 2014 年 8 月开始接受 JSR 评审,到现在推出最终规范,整整经历了 3 年多的时间。去年,我们曾报道过,负责 Java EE 和 WebLogic Server 的甲骨文副总裁 Anil Gaur 表示预计在 2017 年年底发布的 Java EE 8 会具备基本的微服务和云功能。Gaur 计划 Java EE 8 的扩展会包含增强的安全性(以 secret 管理的形式,并且要支持 OAuth 和/或 OpenID)、独立(self-contained)配置的 API 以及健康检查(可能会支持应用监控)。前些日子,甲骨文表示将要把 Java EE 移交给开源组织。现在,Java EE 8 的最终规范已推出,不知道有可能将要移交给开源组织的 Java EE 会有怎样的发展。
  • 我要吐槽
    我要吐槽,FusionAccess登录问题,登录FusionAccess的时候必须用JAVA而且对JAVA的版本有要求,用一段时间提示JAVA版本过低,要求升级JAVA版本,可是是**网又不能上网,只好去其他电脑下载再考到服务器上,这样比较麻烦,从客户反馈的信息就是比较烦锁。
  • [技术干货] Java程序员最全面的学习路线图
    写给Java程序员学习路线图如下是我做开发这几年经常使用一些技术和工具,当然这些技术也都是需要加强的(有些是我一直使用的,不过不深入,有些内部的原理等等不是很清楚)前端部分:1)HTML:网页的核心语言,构成网页的基础2)CSS:使网页更加丰富多彩灿烂的利器3)JavaScript:使网页动起来的根本,加强了网页和用户之间的交互4)HTML DOM:换一种更加形象化的角度来看待网页,让我们更加方便的控制网页5)HTML BOM:与浏览器交互不可或缺的工具6)JavaScript库,主要是:jQuery及其插件、YUI及其插件,使编写网页更加的方便快捷和健壮的强大工具7)AJAX:异步提交,增强了用户使用网页的良好交互体验8)JSON:比 XML更小、更快,更易解析的数据传输工具9)FLEX:提供丰富多彩的动画效果10)普元工作流:更加清晰明了的帮助用户处理业务流程上面的工作11)JSP:Servlet的展示层,使网页逻辑与网页设计的显示分离12)JSTL:加强和简化了JSP页面的开发13)EL:使JSP页面写起来更加简单后台部分:1)JAVA语言编程基础部分:内容丰富是Java知识体系结构的核心和基础2)JDBC:提供了一种基准,据此可以构建更高级的工具和接口,使Java开发人员能够编写数据库应用程序3)JavaMail:用于电子邮件的相关的编程工作4)JUnit:单元测试,整个变成工作测试的地位始终非常重要5)Log4j:使我们能够更加细致地控制日志的生成过程6)Servlet:JavaWeb的核心7)Struts2:JavaWeb编程中明星级的框架,优点多功能强使编程工作更简单,主要用于控制跳转8)Spring:JavaWeb编程中明星级的框架,同样优点多功能强使编程工作更简单,主要用于管理对象9)iBatis:JavaWeb编程中明星级的框架,同样也是优点多功能强使编程工作更简单,主要用于程序和数据库之间的交互10)SQL:与数据库交互式编程的必备工具版本控制:1)SVN:版本控制,方便团队协同工作WEB服务器:1)Tomcat:优秀免费的中小型WEB服务器2)Weblogic:功能很强大的WEB服务器开发工具:1)Eclipse:开源强大的Java编程工具2)MyEclipse:在eclipse基础上加上自己的插件开发而成的功能强大的企业级集成开发环境数据库:1)Oracle:数据库业界老大,这个常用一点当然,也仅仅是常用一些常用的功能而已,需要加强2)MySQL:最好的关系型数据库之一3)SqlServer:最好的关系型数据库之一数据库客户端:1)Toad:非常棒的数据库客户端软件操作系统:1)Windows2)Linux远程登录的会话工具:1)SSH:一直在用,非常不错其他:各种种类和版本的浏览器(推荐使用FireFox)、office办公软件系列、各种文本编辑器(推荐Sublime)、各种阅读器等等恩,回头看,针对开发工作自己使用过的东西还是不少的,不过每一样都称不上是精通的,仅仅是常常使用,使用那些常用的功能,我在这里记录下来就是要一个个补上来,当然,肯定也需要不断的学习其它一些新的技术和工具的!是对自己的一个督促吧!指明了自己努力的方向!下面是从网上找的三幅图片,比较好的说明了作为一个Java程序员的学习路线图,我放在这里作为一种自我提醒的工具,不时看看,并且会赶紧修补自己的知识树!1:Java的知识体系结构2:JavaWeb开发的基本学习路线图3:JavaWeb开发的成长路线图第一部分:Java高级学习课程大纲1:工程化专题我们的工程化专题有五大内容:(1):Maven (2):Nexus。 (3):jenkins 。 (4):代码审查。 (5):Git/SVN 。一共耗时一个月2:源码分析专题源码分析有三大内容: (1):spring的源码分析,里面包括FactoryBean和MVC和事务处理与Spring源码中设计模式分析 。 (2):持久层 。 (3):企业级开发前瞻。 一共耗时2个月3:高并发与高性能高并发与高性能有四大内容: (1):并发编程, 里面又包含有线程安全和NIO和AIO 。 (2):异步通信,里面包含有本地队列和消息中间件。 (3):分布式协调技术,里面包含有Zookeeper和服务锁 。 (4):NoSqI: 里面包含有 MongoDB和Redis和Memcached 。一共耗时2个月4:高可用性与可扩展高可用性与可扩展有两大内容: (1):分布式架构介绍,里面有导流技术和服务设计和存储设计。(2):服务调用,里面包含有WebService和Dubbo。 一共耗时2个月5:性能优化性能优化有四大内容:(1):优化技巧,如何寻找性能瓶颈 (2):JVM优化 (3):数据库优化 (4):服务器优化一共耗时2个月上面这五大专题,是几位工作经验十多年的大牛,根据自己往年的工作经验与经历,在根据现在科技发展的实际情况,历经几个月的时间编写而成,换句话说,上面的五大专题,也就是他们这十几年精华总结,现在,你只要按照上面的课题学习,只需要花费掉你七个月多的时间,你就能够学会与理解几位大牛十多年总结出来的精华。你说,你能学完这些,你还怕公司老总不给你涨工资和升职位么?第二部分:阶段性的学习学什么东西都一样,我相信大家也是一样,在学东西的时候,大家总会安排好自己阶段性的学习,这样才能有效的提升自己与有效的理解和认知所学的知识。合理安排好,才能起到事半功倍的效果。阶段一:阶段二:阶段三:阶段四:阶段五:
  • [技术交流] 35+ 个 Java 代码性能优化总结
    前言代码优化,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的。代码优化的目标是:1、减小代码的体积2、提高代码运行的效率本文的内容有些来自网络,有些来自平时工作和学习,当然这不重要,重要的是这些代码优化的细节是否真真正正地有用。那本文会保持长期更新,只要有遇到值得分享的代码优化细节,就会不定时地更新此文。代码优化细节1、尽量指定类、方法的final修饰符带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的。为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,具体参见Java运行期优化。此举能够使性能平均提高50%。2、尽量重用对象特别是String对象的使用,出现字符串连接时应该使用StringBuilder/StringBuffer代替。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理,因此,生成过多的对象将会给程序的性能带来很大的影响。3、尽可能使用局部变量调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中速度较快,其他变量,如静态变量、实例变量等,都在堆中创建,速度较慢。另外,栈中创建的变量,随着方法的运行结束,这些内容就没了,不需要额外的垃圾回收。4、及时关闭流Java编程过程中,进行数据库连接、I/O流操作时务必小心,在使用完毕后,及时关闭以**资源。因为对这些大对象的操作会造成系统大的开销,稍有不慎,将会导致严重的后果。5、尽量减少对变量的重复计算明确一个概念,对方法的调用,即使方法中只有一句语句,也是有消耗的,包括创建栈帧、调用方法时保护现场、调用方法完毕时恢复现场等。所以例如下面的操作:for (int i = 0; i < list.size(); i++){...}建议替换为:for (int i = 0, int length = list.size(); i < length; i++){...}这样,在list.size()很大的时候,就减少了很多的消耗6、尽量采用懒加载的策略,即在需要的时候才创建例如:String str = "aaa";if (i == 1){  list.add(str);}建议替换为:if (i == 1){  String str = "aaa";  list.add(str);}7、慎用异常异常对性能不利。抛出异常首先要创建一个新的对象,Throwable接口的构造函数调用名为fillInStackTrace()的本地同步方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,Java虚拟机就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。异常只能用于错误处理,不应该用来控制程序流程。8、不要在循环中使用try...catch...,应该把其放在最外层根据网友们提出的意见,这一点我认为值得商榷9、如果能估计到待添加的内容长度,为底层以数组方式实现的**、工具类指定初始长度比如ArrayList、LinkedLlist、StringBuilder、StringBuffer、HashMap、HashSet等等,以StringBuilder为例:(1)StringBuilder()      // 默认分配16个字符的空间(2)StringBuilder(int size)  // 默认分配size个字符的空间(3)StringBuilder(String str) // 默认分配16个字符+str.length()个字符空间可以通过类(这里指的不仅仅是上面的StringBuilder)的构造函数来设定它的初始化容量,这样可以明显地提升性能。比如StringBuilder吧,length表示当前的StringBuilder能保持的字符数量。因为当StringBuilder达到最大容量的时候,它会将自身容量增加到当前的2倍再加2,无论何时只要StringBuilder达到它的最大容量,它就不得不创建一个新的字符数组然后将旧的字符数组内容拷贝到新字符数组中----这是十分耗费性能的一个操作。试想,如果能预估到字符数组中大概要存放5000个字符而不指定长度,最接近5000的2次幂是4096,每次扩容加的2不管,那么:(1)在4096 的基础上,再申请8194个大小的字符数组,加起来相当于一次申请了12290个大小的字符数组,如果一开始能指定5000个大小的字符数组,就节省了一倍以上的空间(2)把原来的4096个字符拷贝到新的的字符数组中去这样,既浪费内存空间又降低代码运行效率。所以,给底层以数组实现的**、工具类设置一个合理的初始化容量是错不了的,这会带来立竿见影的效果。但是,注意,像HashMap这种是以数组+链表实现的**,别把初始大小和你估计的大小设置得一样,因为一个table上只连接一个对象的可能性几乎为0。初始大小建议设置为2的N次幂,如果能估计到有2000个元素,设置成new HashMap(128)、new HashMap(256)都可以。10、当复制大量数据时,使用System.arraycopy()命令11、乘法和除法使用移位操作例如:for (val = 0; val < 100000; val += 5){  a = val * 8;  b = val / 2;}用移位操作可以极大地提高性能,因为在计算机底层,对位的操作是最方便、最快的,因此建议修改为: for (val = 0; val < 100000; val += 5){  a = val > 1;}移位操作虽然快,但是可能会使代码不太好理解,因此最好加上相应的注释。12、循环内不要不断创建对象引用例如:for (int i = 1; i
  • [视频] 基于软件开发云的JAVA程序设计教学实践
    本帖最后由 DevCloud 于 2017-9-22 14:46 编辑
  • [技术交流] 一位资深程序员大牛给予Java初学者的学习路线建议
    Java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍。这一部分的内容,同样适用于一些希望转行到Java的同学。  在大家看之前,我要先声明两点。1、由于我本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线,非Java Web和Java后端开发的同学请适当参考其学习思想即可,切勿照搬。2、下面对于【第一部分】的推荐内容,目的是让你尽快成为一个可以参加工作的Java开发者,更适用于处于待业状态,准备转行Java的同学。  如果你是在校学生,务必要在学好基础(比如计算机系统、算法、编译原理等等)的前提下,再考虑去进行下面的学习。第一部分:对于尚未做过Java工作的同学,包括一些在校生以及刚准备转行Java的同学。  一、Java基础首先去找一个Java的基础教程学一下,这里可以推荐一个Java学习交流的QQ群(群号码:495273252)你可以到这个群里找相应的视频教程。学习Java基础的时候,应该尽量多动手,很多时候,你想当然的事情,等你写出来运行一下,你就会发现不是这么回事儿,不信你就试试。学完以上内容以后,你应该对Java有一个基本的了解了,你可以用Java语言写出一些简单的程序,并且你用的是最简单的编辑器,比如记事本。这个时候,不要急于进入下一部分,留下几天好好写一些程序,尽可能熟悉这些基础内容。  二、Web开发等你写上几天程序以后,你往往会比较迷茫,因为你写的东西似乎看起来毫无用处,比如实现一个简单的计算器,读取一个文件等。这个时候你就应该去学着写一些让你觉得有意思的东西了,所以你应该学习更多的知识。这些内容主要是Web开发相关的内容,包括HTML/CSS/JS(前端页面)、Servlet/JSP(J2EE)以及Mysql(数据库)相关的知识。它们的学习顺序应该是从前到后,因此最先学习的应该是HTML/CSS/JS(前端页面),这部分内容你可以去上面的那个runoob网站上找。  你可以试着自己写一些页面,当然,你可以尽你最大的努力让它变得最漂亮。这部分内容对于后端Java来说,理论上不是特别重要,但至少要达到可以自己写出一些简单页面的水平。接下来,你需要学习的是Servlet/JSP(J2EE)部分,这部分是Java后端开发必须非常精通的部分,因此这部分是这三部分中最需要花精力的,而且这个时候,你要学会使用开发工具,而不能再使用记事本了,可以选择eclipse。当你下载安装好eclipse以后,请视频中的教程一步一步去学习,一定要多动手。关于Servlet/Jsp部分视频的选择,业界比较认可马士兵的视频,因此推荐给大家。  当然了,我本人并没有看过他的视频,所以不好说的太绝对,如果大家自己有更好的选择,可以坚持自己的,不要被我干扰。原本我也是打算出教学视频的,但是由于时间问题,还是决定放弃了。但是如果你看视频的过程中遇到了问题,欢迎来我的交流群提问,或者去斗鱼观看我的直播提出你的问题,直播地址和群号都在我的个人博客左侧。最后一步,你需要学会使用数据库,mysql是个不错的入门选择,而且Java领域里主流的关系型数据库就是mysql。这部分一般在你学习Servlet/Jsp的时候,就会接触到的,其中的JDBC部分就是数据库相关的部分。你不仅要学会使用JDBC操作数据库,还要学会使用数据库客户端工具,比如navicat,sqlyog,二选一即可。  三、开发框架当你学会以上内容以后,这个时候你还不足以参加工作,你还需要继续深造。公司里为了提高开发的效率,会使用一些Java Web框架,因此你还需要学习一些开发框架。目前比较主流的是SSM框架,即spring、springmvc、mybatis。你需要学会这三个框架的搭建,并用它们做出一个简单的增删改查的Web项目。你可以不理解那些配置都是什么含义,以及为什么要这么做,这些留着后面你去了解。  但你一定要可以快速的利用它们三个搭建出一个Web框架,你可以记录下你第一次搭建的过程,相信我,你一定会用到的。还要提一句的是,你在搭建SSM的过程中,可能会经常接触到一个叫maven的工具。这个工具也是你以后工作当中几乎是必须要使用的工具,所以你在搭建SSM的过程中,也可以顺便了解一下maven的知识。在你目前这个阶段,你只需要在网络上了解一下maven基本的使用方法即可,一些高端的用法随着你工作经验的增加,会逐渐接触到的。  关于学习SSM框架的地址给大家推荐一个,这里面有视频,大家可以去观看。四、找工作当你完成开发框架的学习以后,你就该找工作了,在校的找实习,毕业的找全职。与此同时,在找工作的同时,你不应该停下你的学习,准确的说,是你在以后都不能停下学习。上面这些内容你只是囫囵吞枣的学会了使用,你可以逐步尝试着去了解更多的东西,网络是你最重要的老师。  第二部分:对于参加工作一年以内的同学。恭喜你,这个时候,你已经拥有了一份Java的工作。这个阶段是你成长极快的阶段,而且你可能会经常加班。但是加班不代表你就可以松懈了,永远记得我说的那句话,从你入行那一刻起,你就要不停的学习。在这一年里,你至少需要看完《Java编程思想》这本书。这本书的内容是帮助你对于Java有一个更加深入的了解,是Java基础的升级版。这本书很厚,当初看这本书,我花了整整三个月。正常速度的话,应该可以在半年左右看完。我这里不要求过高,只要你在一年以内把这本书看完即可。当然了,我所说的看完,是充分吸收,而不是读一遍就完事了,因此有些内容你可能会看不止一遍。总而言之,这个阶段的核心学习思想就是,在工作中实践,并且更加深入的了解Java基础。  第三部分:对于参加工作1年到2年的同学。这部分时间段的同学,已经对Java有了一个更加深入的了解。但是对于面向对象的体会可能还不够深刻,编程的时候还停留在完成功能的层次,很少会去考虑设计的问题。于是这个时候,设计模式就来了。我当时看的是《大话设计模式》这本书,并且写了完整版的设计模式博客。因此,我要求大家,最多在你工作一年的时候,必须开始写博客,而设计模式就是你博客的开端。  请记住,我所提的基本都是最低要求,因此不要有任何松懈的心理,否则五年后,你不要去羡慕别人高于你的工资,也不要去羡慕别人进入了某公司。这一年,你必须对于设计模式了如指掌,《大话设计模式》可以作为你的开端。此外,设计模式并不是你这一年唯一的任务,你还需要看一些关于代码编写优化的书。比如《重构 改善既有代码的设计》,《effective java》。总而言之,这个阶段,你的核心任务就是提高你的代码能力,要能写出一手优雅的代码。  第四部分:对于参加工作2年到3年的同学有的同学在这个时候觉得自己已经很牛逼了,于是忍不住开始慢慢松懈。请记住,你还嫩的多。这个阶段,有一本书是你必须看的,它叫做《深入理解Java虚拟机》。这本书绝对是Java开发者最重要的书,没有之一。在我眼里,这本书的重要性还要高于《Java编程思想》。这本书的内容是帮助你全面的了解Java虚拟机,在这个阶段,你一定已经知道Java是运行在JVM之上的。所以,对于JVM,你没有任何理由不了解它。  另外,在过去2年的工作当中,你肯定或多或少接触过并发。这个时候,你应该去更加深入的了解并发相关的知识,而这部分内容,我比较推荐《Java并发编程实战》这本书。只要你把这本书啃下来了,并发的部分基本已经了解了十之六七。与此同时,这个阶段你要做的事情还远不止如此。这个时候,你应该对于你所使用的框架应该有了更深入的了解,对于Java的类库也有了更深入的了解。  因此,你需要去看一些JDK中的类的源码,也包括你所使用的框架的源码。这些源码能看懂的前提是,你必须对设计模式非常了解。否则的话,你看源码的过程中,永远会有这样那样的疑问,这段代码为什么要这么写?为什么要定义这个接口,它看起来好像很多余?由此也可以看出,这些学习的过程是环环相扣的,如果你任何一个阶段拉下来了,那么你就真的跟不上了,或者说是一步慢步步慢。而且我很负责的告诉你,我在这个阶段的时候,所学习的东西远多于这里所罗列出来的。  因此千万不要觉得你已经学的很多了,我所说的这些都只是最低要求,不光是我,很多人在这个时间段所学习的内容都远超本文的范围。如果你不能跟上节奏的话,若干年后,如果不是程序猿市场还不错的话,你很可能不仅仅是工资比别人低,公司没别人好,而是根本就找不到工作。总而言之,这个阶段,你需要做的是深入了解Java底层和Java类库(比如并发那本书就是Java并发包java.concurrent的内容),也就是JVM和JDK的相关内容。而且还要更深入的去了解你所使用的框架,方式比较推荐看源码或者看官方文档。另外,还有一种学习的方式,在2年这个阶段,也应该启用了,那就是造轮子。不要听信那套“不要重复造轮子”的论调,那是公司为了节省时间成本编造出来的。重复造轮子或许对别人没有价值,因为你造的轮子可能早就有了,而且一般情况下你造出来的轮子还没有现存的好。  但是对别人没有价值,不代表对你自己没有价值。一个造轮子的过程,是一个从无到有的过程。这个过程可以对你进行系统的锻炼,它不仅考察你的编码能力,还考察你的框架设计能力,你需要让你的轮子拥有足够好的扩展性、健壮性。而且在造轮子的过程中,你会遇到各种各样的难题,这些难题往往又是你学习的契机。当你把轮子造好的时候,你一定会发现,其实你自己收获了很多。所以,这个阶段,除了上面提到的了解JVM、JDK和框架源码以外,也请你根据别人优秀的源码,去造一个任何你能够想象出来的轮子。  第五部分:参加工作3年到4年的同学这个阶段的同学,提升已经是很难了,而且这个阶段的学习往往会比较多样化。因为在前3年的过程中,你肯定或多或少接触过一些其它的技术,比如大数据、分布式缓存、分布式消息服务、分布式计算、软负载均衡等等。这些技术,你能精通任何一项,都将是你未来面试时巨大的优势,因此如果你对某一项技术感兴趣的话,  这个时候可以深入去研究一下。这项技术不一定是你工作所用到的,但一定是相关的。而且在研究一门新技术时,切忌朝三暮四。有的同学今天去整整大数据,搞搞Hadoop、hbase一类的东西。过不了一段时间,就觉得没意思,又去研究分布式缓存,比如redis。然后又过不了一段时间,又去研究分布式计算,比如整整Mapreduce或者storm。结果到最后,搞得自己好像什么都会一样,在简历上大言不惭的写上大数据、分布式缓存、分布式计算都了解,其实任何一个都只是浮于表面。到时候面试官随便一问,就把你给识破了。  一定要记住,作为一个程序猿,平日里所接触的技术可能会很多,但是想要让一门技术成为你的优势,那么一定是你对这门技术的了解强过绝大多数人才行。因此在这个阶段,你就不能再简单的去学习前3年的内容了,虽然前面的学习如果还不够深入的话依旧要继续,但这个时候你应该更多的考虑建立你的优势,也可以称为差异性。差异性相信不难理解,就是让你自己变得与众不同。你前面三年的学习足够你成为一名基本合格的Java开发者,但你离成为一名优秀的Java开发者还有很大的距离。  所谓优秀,即能别人所不能。而你前三年所学习的内容,是很多做过几年的Java开发都能够掌握的。那么为了让自己有差异性,你就需要另辟蹊径,找一个方向深入研究下去,以期在将来,你能够成为这个领域的专家,比如分布式计算领域的专家,大数据领域的专家,并发领域的专家等等。此外,你除了建立你的差异性之外,还要去弥补你基础上的不足,直到现在,我都没有提及基础知识。原因是基础是很枯燥无味的,学的太早不仅容易懵逼,而且懵逼的同时还容易产生心理阴影,以至于以后再不想去研究这些基础。但基础又是你深入研究一些领域时所必须掌握的,比如你去研究分布式计算,你不懂算法你玩个毛毛?比如你去做分布式缓存,你对计算机系统的内存不了解,你如何去做缓存?  如果你的基础本来就非常强,那么恭喜你,相信你在之前的工作中已经充分体会到了这些基础对你的帮助。但我相信大部分人的基础都很薄弱,哪怕是科班毕业的人,很多人也不敢说自己当初的基础学的多么强大,比如算法、计算机系统原理、编译原理这些。但是每个人时间都是有限的,而且这些基础的书籍每一本读下来,没个一年半载的,还真拿不下来,因此还是要有所抉择的。虽然艺多不压身,但问题是艺多是有代价的,是需要你付出时间和精力的,而我个人更赞成在同等代价的情况下获取最大的收获。  首先,我比较推崇的基础书籍有三本,分别是《深入理解计算机系统》,《tcp/ip详解 卷一、二、三》,《数据结构与算法》。其中TCP/IP有三本书,但我们这里把这三本看成是一本大书。这三本分别适合三种人,《深入理解计算机系统》比较适合一直从事Java Web开发和APP后端开发工作的人群。《tcp/ip详解 卷一、二、三》比较适合做网络编程的人群,比如你使用netty去开发的话,那么就要对TCP/IP有更深入的了解。而《数据结构与算法》这本书,则比较适合做计算研究工作的人,比如刚才提到的分布式计算。另外,我要强调的是,这里所说的适合,并不是其它两本对你就没有用。比如你做Java Web和APP后端开发,《tcp/ip详解 卷一、二、三》这本书对你的作用也是很大的。这里只是分出个主次关系而已,你要是时间足够的话,能把三本都精读那当然最好不过了。  但如果时间有限的话,那么就先挑对你帮助最大的书去读。理论上来讲,这一年你能把这三本其中一本精读下来,就已经非常厉害了。有了基础,有了前面的工作经验,你就可以去开拓属于你的领域了。在这一年里,一定要规划好自己的领域,建立好自己的优势,制造出差异性。如果你对自己的领域不够清晰的话,随着你工作的时间日益增多,你接触的技术会越来越多,这个时候,你很容易被淹死在技术的海洋里,看似接触的技术越来越多,会用的也越来越多,但你毫无优势。有的同学可能会问,“我,我也不知道我的领域是什么啊?怎么办呢?”对于这种人,我只想说,“卧槽,这还问我?要不干脆我替你学习得了,好不好?”  第六部分:参加工作4年到5年的同学经过前面一年的历练,相信你在自己所钻研的领域已经有了自己一定的见解,这个时候,技术上你应该已经遇到瓶颈了。这个时候不要着急提高自己的技术,已经是时候提高你的影响力了,你可以尝试去一些知名的公司去提高你的背景,你可以发表一些文章去影响更多的人。当然,你也可以去Github创建一个属于你的开源项目,去打造自己的产品。  这次的开源项目不同于之前的造轮子,你这个时候是真的要去尽量尝试造出来真正对别人有价值的轮子。技术学到这个阶段,很容易遇到瓶颈,而且往往达到一定程度后,你再深入下去的收效就真的微乎其微了,除非你是专门搞学术研究的。然而很可惜,大部分程序猿做不到这一步,那是科学家做的事情。这个时候提高影响力不仅仅是因为技术上容易遇到瓶颈,更多的是影响力可以给你创造更多的机会。程序猿在某种程度上和明星很像,一个好的电视剧和电影就可以成就一批明星,程序猿有的时候也是,一个好的项目就可以成就一群程序猿。比如国内几个脍炙人口的项目,像淘宝、支付宝、QQ、百度、微信等等。这每一个项目,都成就了一批程序猿。我敢说,这里面任何一个项目,如果你是它的核心开发,光是这样一个Title,就已经是你非常大的优势。更何况还不止如此,Title说到底也是个名头,更重要的是,这种项目在做的时候,对你的历练一定也是非常给力的。  而你如果想要参与这样的项目,除了靠运气之外,影响力也是很重要的一个手段。比如你在分布式计算领域有一定的影响力,那么如果有什么好的关于分布式计算的项目,对方就很可能会邀请你。就算人家不邀请你,你自己主动去面试的时候,对方如果知道你在这个领域的影响力,也肯定会起到很大的作用,而这个作用,甚至可能会超过你现在的技术能力。所以,在这个阶段,你最大的任务是提高自己的影响力,为自己未来的十年工作生涯那一天做准备。如果你能够靠你的影响力和以前积累的技术,参与到一个伟大的项目当中,那么你后面的五年也就有着落了。当然了,我现在满打满算,做程序猿也就4年半不到,因此关于4年到5年这一部分,我的见解不一定是对的,就算是对的,也不一定是适合任何人的。  所以,希望大家自己有的判断力,去决定到底该如何度过这一年。结语本文到此就基本结束了,整篇文章很长,但其实主要就说了两部分内容,一个是社招面试的准备,一个是Java生涯的学习。关于这两部分,我已经给出了自己的见解,但是还是那句话,每个人吸收知识的时候,都要有抽取精华,去除糟粕的能力。我所说的,可能有些是对的,有些是错的,有些是适合你的,有些是不太适合你的,你要自己能够判断。其实你在生活和工作当中也是一样的,你身边的人形形**,有的人你喜欢,有的人你很讨厌。但其实你喜欢的人也有缺点,你讨厌的人也有优点。你要学会从你讨厌的人身上学会他的优点,千万不要一棒子打死,这只会让你失去很多学习成长的机会。好了,说了这么多了,就到此为止吧,希望本文可以帮助到作为程序猿或即将成为程序猿的你。转自:极客头条
  • [行业资讯] Python成为高收入国家增长最快的语言
    摘要:本文根据Stack Overflow流量分析了Python及其他一些编程语言的发展情况,同时也对高收入国家与非高收入国家的情况进行了对比。以下是译文。我们最近的研究表明,富裕国家(世界银行定义为高收入国家)喜欢研究的技术与其他国家的不同。其中,我们看到最大的差异是Python语言。当我们关注高收入国家的时候,甚至可以看到Python的增长速度甚至比Stack Overflow Trends或者其他一些全球软件开发排名显示的还要快。在这篇文章中,我们将探讨过去五年中Python语言不寻常的增长速度,正如在高收入国家的Stack Overflow流量中所示的那样。 “增长最快”一词可能很难精确定义,但是我们认为Python确实是增长最快的主流编程语言。本文提到的大部分数字都来自高收入国家,比如美国、英国、德国、加拿大和其他类似的国家,他们加起来占了Stack Overflow 64%的流量。其他一些国家,如印度、巴西、俄罗斯和中国,也为全球软件开发生态系统做出了巨大的贡献。尽管这些国家的Python也在增长,但本文几乎不涉及这些经济体。需要强调的是,使用某种语言的用户数并不能用来衡量该语言的质量:我们现在正在讲的是开发人员使用的编程语言,而不是处方。Python在高收入国家的增长情况你可以在Stack Overflow Trends上看到,Python在过去几年里一直在迅速增长。但是对于这篇文章,我们将重点关注高收入国家,并且分析的是Stack Overflow上问题的访问情况,而不是用户提的问题。有关Stack Overflow问题视图的数据可以追溯到2011年底,在这段时间内,我们可以看一下Python相对于其他五种主流编程语言的增长情况。这是目前高收入国家中Stack Overflow访问量前十的标签中的六个;另外还有这四个没包括在内,分别是CSS、HTML、Android和JQuery。2017年6月,Python第一次成为高收入国家Stack Overflow访问量最大的标签。它在美国和英国是访问量最大的标签,在大部分其他高收入国家中也是排在前两名(另外一个要么是Java要么是JavaScript)。这尤其令人印象深刻,因为在2012年,Python的访问量小于其他五种语言,而到现在其访问量已经增长了2.5倍。产生这种现象的部分原因是Java流量的季节性因素。由于Java是本科重点课程,所以它的流量会在秋季和春季上升,而在夏季下降。但是它会在年底再次赶上Python吗?我们可以尝试使用名为“STL”的模型来预测未来两年的增长情况,这个模型能将增长情况与季节性趋势相结合,从而预测未来的值。根据这个模式的预测,Python可能会在今年秋天保持领先地位或被Java反超,但到了2018年,Python肯定会成为最受欢迎的标签。STL还暗示JavaScript和Java在高收入国家中的流量将保持相似的水平,就跟最近两年的情况差不多。从整体上来看,有哪些标签增长得最快?以上我们只看了六种主流语言,那么目前在高收入国家中还有哪些目前增长最快的技术呢?我们用2017年和2016年的流量占比来定义增长率。在这个分析中,我们只考虑编程语言(比如Java和Python)和平台(比如iOS、Android、Windows和Linux),不包括类似Angular的框架和类似TensorFlow的库。由于这个漫画中描述的“增长最快”存在问题,因此,我们使用平均差异图来比较各个语言的增长率与整体平均增长率。Python凭借着27%的年增长率在所有标签中独占鳌头,它既是流量最大也是增长最快的标签。拥有类似增长率的第二大标签是R语言。我们可以看到,其他大多数大标签的流量在高收入国家都保持稳定,而Android、iOS和PHP的访问量则略有下降。(我们在之前一篇Flash之死的帖子中研究了一些流量减少的标签,如Objective-C、Perl和Ruby)。我们还注意到,在函数式编程语言中,Scala是流量最大并且增长非常迅速的语言,F#和Clojure则较小并且还在不断下降,而Haskell则位于它们之间并保持着稳定。在上图中有一个重要的东西被遗漏了:TypeScript的流量去年竟然增长了142%,这足以让我们对它进行单独处理,以避免超过现有的范围。你还可以看到,其他一些较小语言(例如R、Go和Rust)的增长速度与Python差不多或更快,而且也有许多标签,例如Swift和Scala,它们的增长情况也很惊人。与Python相比,他们的流量变化情况怎么样呢?像R和Swift这样的语言的发展情况确实很惊人,而TypeScript在更短的时间内表现出了更快速的扩张。如图所示,当标签一开始相对较小时,则后期越容易出现较快地增长。请注意,我们的意思并不是说这些语言可以与Python“抗衡”。相反,我们正在解释的是为什么要把它们单独拿出来分析,这些都是较低流量的标签。Python有着一个与众不同的情况,它是Stack Overflow中最受欢迎的标签之一,也是增长最快的一个。其他地区的情况到目前为止,我们一直都在分析高收入国家的发展趋势。那么,在像印度、巴西、俄罗斯、中国等其他一些国家中,Python的增长情况如何呢?它依然是增长最快的编程语言。在非高收入国家中,Python仍然是增长最快的主流编程语言;它只是最开始的水平比较低,并且是在两年后才开始增长(从2014年开始,而不是2012年)。事实上,非高收入国家的Python同比增长率略高于高收入国家。本文中有关高收入国家标签流量增减的许多结论也都适用于其他地区,并且这两者的增长率存在着0.979的相关性。在某些情况下,你会看到类似于Python的“滞后”现象,即某个技术在高收入国家的接受度发展水平比其他地区要早一到两年。下一步工作我们不希望挑起所谓的“语言之战”。一种语言的用户数量并不代表着它的质量,而且肯定无法告诉你哪种语言更适合某种特定情况。不过,考虑到这个观点,我们认为有必要了解一下有哪些语言建起了开发者生态系统,以及生态系统当前的发展情况。
  • 甲骨文要改变 Java 发布频率,将每半年发布一个版本
    Oracle近日宣布,他们将加快 Java 的发布频率,改为每六个月一次。也就是说,Java的下一个版本将在 2018 年 3 月发布,也就是本月 Java 9 发布后的六个月。Java当前的发布周期为两年一次,但是,Java 9因为模块化系统(Jigsaw)问题一再延期,已经比预期晚了18个月,GA 版本将在9月21号发布。此前,Java 8也因为安全问题延期了8个月左右。新的发布周期严格遵循时间点,将在每年的3月份和9月份发布,相应的版本号为18.3、18.9、19.3等。与现在的发布周期不同,新的发布计划不会为了等待某个主要特性完成而延期。如果一个特性还没有完成,它就不会被合并到发布用的代码仓库里。如果错过了一个版本,就要等待下一次发布。编译自:infoworld.com
  • Java签名算法之HMAC-SHA1
    /* 需要注意这儿一定要使用Apache的Base64库,因为这个是支持基于RFC2045(MIME)定义的字符进行编解码,在REST应用中*支持MIME字符的编码。*/import org.apache.commons.codec.binary.Base64import java.security.SignatureException;import javax.crypto.Mac;import javax.crypto.spec.SecretKeySpec;/** * This class defines common routines for generating authentication signatures * for AWS requests. */public class Signature { private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1"; /** * Computes RFC 2104-compliant HMAC signature. * @param data The data to be * signed. * * @param key * The signing key. * @return The Base64-encoded RFC 2104-compliant HMAC signature. * @throws java.security.SignatureException * when signature generation fails */ public static String calculateRFC2104HMAC(String data, String key) throws java.security.SignatureException { String result; try { // get an hmac_sha1 key from the raw key bytes SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM); // get an hmac_sha1 Mac instance and initialize with the signing key Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM); mac.init(signingKey); // compute the hmac on input data bytes byte[] rawHmac = mac.doFinal(data.getBytes()); // base64-encode the hmac result = BASE64Encoder.encode(rawHmac);// result = Encoding.EncodeBase64(rawHmac); } catch (Exception e) { throw new SignatureException("Failed to generate HMAC : " + e.getMessage()); } return result; } public static byte[] hmacSHA1(String data, String key) throws java.security.SignatureException { try { // get an hmac_sha1 key from the raw key bytes SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM); // get an hmac_sha1 Mac instance and initialize with the signing key Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM); mac.init(signingKey); // compute the hmac on input data bytes byte[] rawHmac = mac.doFinal(data.getBytes()); return rawHmac; } catch (Exception e) { throw new SignatureException("Failed to generate HMAC : " + e.getMessage()); } }}import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.SignatureException;import java.util.Formatter; import javax.crypto.Mac;import javax.crypto.spec.SecretKeySpec; /** * The HmacSha1Signature shows how to calculate * a message authentication code using HMAC-SHA1 algorithm. * * * % java -version * java version "1.6.0_11" * % javac HmacSha1Signature.java * % java -ea HmacSha1Signature * 104152c5bfdca07bc633eebd46199f0255c9f49d * * */ public class HmacSha1Signature { private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1"; private static String toHexString(byte[] bytes) { Formatter formatter = new Formatter(); for (byte b : bytes) { formatter.format("%02x", b); 、 } return formatter.toString(); } public static String calculateRFC2104HMAC(String data, String key) throws SignatureException, NoSuchAlgorithmException, InvalidKeyException { SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM); Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM); mac.init(signingKey); return toHexString(mac.doFinal(data.getBytes())); } public static void main(String[] args) throws Exception { String hmac = calculateRFC2104HMAC("data", "key"); System.out.println(hmac); assert hmac.equals("104152c5bfdca07bc633eebd46199f0255c9f49d"); }}
  • 一年多java开发应该看什么书提升自己
    工作快一年了,接触的只有增删改差的功能,应该看哪些专业的书来提升自己,求大神指教。[/backcolor]
总条数:535 到第
上滑加载中