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学习系列,我们共勉!


相关文章
|
22天前
|
监控 JavaScript 前端开发
《理解 WebSocket:Java Web 开发的实时通信技术》
【4月更文挑战第4天】WebSocket是Java Web实时通信的关键技术,提供双向持久连接,实现低延迟、高效率的实时交互。适用于聊天应用、在线游戏、数据监控和即时通知。开发涉及服务器端实现、客户端连接及数据协议定义,注意安全、错误处理、性能和兼容性。随着实时应用需求增加,WebSocket在Java Web开发中的地位将更加重要。
|
1月前
|
数据采集 分布式计算 大数据
Java语言在大数据处理中的应用
传统的大数据处理往往依赖于庞大的数据中心和高性能的服务器,然而随着大数据时代的到来,Java作为一种强大的编程语言正在被广泛应用于大数据处理领域。本文将探讨Java语言在大数据处理中的优势和应用,以及其在分布式计算、数据处理和系统集成等方面的重要作用。
|
1天前
|
安全 Java 大数据
探索Java的奇妙世界:语言特性与实际应用
探索Java的奇妙世界:语言特性与实际应用
|
2天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
2天前
|
设计模式 存储 前端开发
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
|
7天前
|
IDE Java 数据库连接
使用 Java 进行桌面应用开发
【4月更文挑战第19天】Java 是一款广泛应用于企业级、网络和桌面应用开发的编程语言。其跨平台特性使Java程序能在不同操作系统上运行,而JDK提供了开发所需工具和库。使用Swing等GUI库构建用户界面,结合JDBC进行数据库操作,Socket实现网络通信。虽然面临性能和用户体验的挑战,但通过优化和选用合适的IDE,Java仍能开发出高效稳定的桌面应用。
|
8天前
|
前端开发 Java Go
开发语言详解(python、java、Go(Golong)。。。。)
开发语言详解(python、java、Go(Golong)。。。。)
|
8天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
148 10
|
8天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
13天前
|
Java Android开发 C++
Kotlin vs Java:选择最佳语言进行安卓开发
【4月更文挑战第13天】Java曾是安卓开发的主流语言,但Kotlin的崛起改变了这一局面。Google在2017年支持Kotlin,引发两者优劣讨论。Java以其成熟稳定、强大生态和跨平台能力占优,但代码冗长、开发效率低和语言特性过时是短板。Kotlin则以简洁语法、空安全设计和高度兼容Java脱颖而出,但社区和生态系统仍在发展中,可能存在学习曲线和性能问题。选择语言应考虑项目需求、团队熟悉度、维护性、性能和生态系统。无论选择哪种,理解其差异并适应新技术至关重要。