开发者社区> 程序员鸭哥> 正文

Java 8系列之瞎说开发语言

简介: Java 8系列之瞎说开发语言
+关注继续查看

瞎说开发语言学习


前段时间有同学问我是否应该学学Kotlin,的确今年谷歌将Kotlin作为Android官方支持的语言,以一种龙卷风的模式席卷了各大技术新闻版面。那这个技术新宠,我们程序员是否应该积极跟进呢?笔者认为在计算机技术的学习过程中,不论你学习什么技术,都要明白为什么要学习该技术或语言?就拿学习Kotlin来说的原因来说,无非就是很多人觉得java现有语法又臭又长,没有kotlin来的简单明了,的确kotlin语法吸收了许多优秀的脚本语言,一旦程序员开始上手,就会爱不释手。但是越简单的工具,越精炼的语法特性往往越是隐藏了过多的技术细节。对于还没有好好写过Java语言的童鞋来说,不利于其之后的长远发展,因为在高级语言中很多编程思想都被甜蜜的语法糖掩盖了。本作者在大学以及工作初期,都是基于Windows操作系统写C++方面的应用,那时我非常喜欢研究Windows的系统机制,并钟情于二进制逆向技术的研究,工作一段时间之后才慢慢的开始使用C#,Python,Java,Php等高效率的开发语言,甚至有时还搞搞JavaScript,呵呵。但是,对于C++的语言的掌握,和对系统底层的熟悉,使我在学习其他技术时颇为受益,心中有底。感触最深的就是在学习HotSpot虚拟机以及阅读JDK源码的过程,遇到一个Java的上层实现,我都会尝试猜测虚拟机底层使用的系统接口或实现机制,然后再到OpenJDK的源码中去上下求索,尽量是自己能对Java的理解更加透彻一些。

如果时光倒退到当初选择编程方向的大一,我依然会使用C/C++从基于Windows消息机制的应用程序写起!计算机系统本来就是一个相对复杂的系统,如果一个程序员在学习初期,不能直面复杂的编程语言,解决复杂的编程问题,那他今后在实际工作中,解决问题的能力不一定会高。 


再将主题拉回来说最近很火的Kotlin的学习,对于是否应该选择学习Kotlin,作者持有以下观点:


  • 如果你的工作确实需要Kotlin语言,那么在项目中去学习是最快的学习方式,也是最好的方式;
  • 如果你只是将Java与kotlin之间作为二选一,那么建议你学好Java再去学kotlin,很多人都会拿着kotlin、scala这些运行于jvm的开发语言与Java做对比,如果我们连Java不熟悉,如何评判的了这个对比?因此,作者还是认为基于JVM的语言学习还是从Java开始比较好。
  • 在熟练掌握Java之后,再去学习kotlin,就不是从零基础去学习了,反而会学习的更快,你会在学习kotlin的过程中与Java语言做对比,同时对于两种语言的理解也会更加深刻。


对于初学者来说,还是不要以学习过于方便的技术做为学习线路,一个程序员能否走的长远,并不是看他会用什么工具,会用什么技巧,而是遇到问题解决问题的能力,只有在学习过程中不断给自己找麻烦,解决问题的能力才有机会被锻炼。为何有人说IT工作3年是一个门槛,什么是工作经验?工作经验就是在你遇到问题后,是否具有解决问题的思路与技巧。


2

内存不是免费的


高级语言与低级语言最大的区别就是内存管理,高级语言所有变量、对象、代码的内存空间,都是由虚拟机的内存管理器自动管理的,无需程序员在使用了内存之后还需对其进行释放。相对于C/C++程序员来说,高级语言程序员太幸福了,Java程序员一定没有遇到过C++程序员的梦魇0xc0000005内存访问异常,因为高级语言将内存的控制职责托管给了语言自身,而非由程序员负责,这的确大大的提高了软件质量与效率。但是,内存不是免费的,Java程序员一定遇到过OutOfMemory异常问题,此时虚拟机无法再次分配到内存了,怎么办?是加大堆的配置还是加大新生代的配置?或是忧伤的问内存是什么鬼,什么是堆,什么是栈?等等。如此看来C++程序员也不是那么的苦逼了,起码内存的掌控在他们自己手里,想怎么分配就怎么分配,只要大小合理,记得释放,程序的控制权就永远在自己的手中。所以写Java的程序员不要轻视C++程序员,毕竟Java也是C++写的嘛。


什么是0xC0000005?

0xC0000005是Windows系统下应用程序发生内存访问错误时系统抛出的内存访问异常,并且该异常是不可逆的,一旦发生整个程序将会崩溃。造成0xC0000005问题的编码原因很多,在实际开发中最难解决的是内存溢出破坏造成的异常。因为程序崩溃时,并不是内存被破坏的时刻,而是程序尝试访问被破坏的内存的时刻,而该内存早已被破坏了,因此很难找出到底是什么时候,或是哪次内存操作破坏掉了内存。此时的程序员就像警察一样,只能看到案发现场,但是凶手早已逃之夭夭了。


3

Java or CSharp之争,我为C#正名!


在上大学的时候,听很多同学说Java比C#强, 我当时也就信了这句话认为C#语言很垃圾,不值得一学。后来在实际工作中,需要使用C#开发一款Windows应用程序,整个项目最后完成大概有5~6W行有效代码。作者也是在这个实际的工作项目中开始使用C#语言的,发现C#的语言并不像之前同学说的那样,不堪一击,反而其语法特性,以及编程的方便性让作者叹为观止,期间作者甚至有专门从事C#方向的心动。相对于Java语言,C#的语言特性要先进的多,从C# 3.5开始就支持Linq,Lambda,函数式编程等高级语言特性,而java语言直到Java 8才开始支持Lambda表达式,晚了整整8年时间。此外C#语言原生态支持了泛型,而java对于泛型的支持还只是采用占位符方式。


从语言特性上来说,Java相对于C#还是很落后的语言,但从实际应用中,C#的就无法和Java语言抗衡了,现在的互联网时代是自媒体时代,前端由JavaScript独领风骚,后端由Java语言重兵把守,俨然已经没有C#什么事了,究其原因还是C#没有原生态支持Linux系统,错失了大好的市场。所以,Java or CSharp,从生存角度来说,作者一定会选择从事Java开发方向,但是不能否认C#语言的先进性,作者很多高级语言编程思想还是启蒙于C#。C#使作者开始从编程的另一面看待编程,开始尝试技术对比。

在我们可以熟练掌握一门语言之后,或者一门技术之后,往往会遇到技术学习的瓶颈,此时我们就应该尝试学学其他开发语言,或尝试尝试其它的技术方向。你会发现不同的语言会给你带来不同的编程思维;不同的技术方向,会扩宽你现有的编程视野。并且这些实践对于你的本职工作也会带来旁敲侧击的帮助,或许会使你拨云见日,找到方向,突破瓶颈!

4

最后说说Java 8


前面说了那么多编程语言之争,貌似贬低了Java的地位,其实作者只是让自己能客观的认识编程语言的优劣,闲话不扯那么多,这里作者将话题转回到本文的正题Java 8的新特性。


从1997年Java 1.1开始,直到今天,Java语言都一直在升级变化过程中,这说明Java是一门不断发展的编程语言,在JDK中,经常看到被deprecated声明的弃用方法,这也是Java进化的迹象。2014年3月,Java8横空出世,可以说为Java的开发带来了翻天覆地的变化。从Java8开始,Java对函数式编程方式,Lambda等高级语法特性提供了支持。例如以前我们写一个好学生筛选的代码可能如下:

image.png


上面这段好学生筛选代码写的中规中矩,基本上就是使用foreach对所有学生进行遍历判断,将满足条件的学生加入好学生列表中并返回。但是如果我们此时需要一个差学生,中等学生的过滤函数,就需要将这段代码Ctrl + C 、Ctrl + V复制来复制去,改改条件,使得代码又丑又长,并且违反了DRY(Don't Repeat Yourself)编程原则,就连Idea都会提示有大量重复代码(这里我就不提在Java8之前解决这样代码的策略了,基本思想就是使用设计模式的“策略模式”对将筛选策略进行抽象。我们这里给出Java8中,这段代码可以怎么写


image.png


是不是非常颠覆以往的Java编程习惯,是不是非常简洁?这就是函数式编程的魅力。我们为什么要学习Java 8的新特性?如果不学习,可能过段时间,其他Java程序员写出的代码,你就完全不认识了,呵呵。此外,Java 8并不只是简简单单只是提供了了函数式编程的语法糖,也做了一些实际的东西,例如最大化的并行执行。以往我们遍历过滤集合类型的操作都是单线程的,要想并发遍历,程序员必须使用多线程技术,加锁执行,这对于普通程序员来说无疑很难,也不一定能写好。Java8对于这类的并发提供了免费的并发支持,例如上例中使用了paralelStream()流,使得对于该集合的遍历提供并发支持。好了这里只是抛砖引玉,我相信你已经迫不及待想学习如何使用java8来写代码了,本公众号将会推出Java8学习系列,我们共勉!


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23548 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
22283 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
16606 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
22274 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
19253 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
11992 0
+关注
程序员鸭哥
微信公众号:鸭哥聊Java
90
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载