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


相关文章
|
17天前
|
安全 Java 大数据
探索Java的奇妙世界:语言特性与实际应用
探索Java的奇妙世界:语言特性与实际应用
|
3天前
|
存储 Java 数据库连接
使用Java开发桌面应用程序
使用Java开发桌面应用程序
14 0
|
3天前
|
Java API 开发工具
java与Android开发入门指南
java与Android开发入门指南
11 0
|
3天前
|
分布式计算 负载均衡 Java
构建高可用性Java应用:介绍分布式系统设计与开发
构建高可用性Java应用:介绍分布式系统设计与开发
8 0
|
3天前
|
前端开发 安全 Java
使用Spring框架加速Java开发
使用Spring框架加速Java开发
8 0
|
3天前
|
前端开发 JavaScript Java
Java与Web开发的结合:JSP与Servlet
Java与Web开发的结合:JSP与Servlet
8 0
|
3天前
|
设计模式 算法 Java
设计模式在Java开发中的应用
设计模式在Java开发中的应用
15 0
|
4天前
|
监控 Java Maven
揭秘Java Agent技术:解锁Java工具开发的新境界
作为JDK提供的关键机制,Java Agent技术不仅为Java工具的开发者提供了一个强大的框架,还为性能监控、故障诊断和动态代码修改等领域带来了革命性的变革。本文旨在全面解析Java Agent技术的应用场景以及实现方式,特别是静态加载模式和动态加载模式这两种关键模式。
24 0
|
4天前
|
存储 Java 开发者
探索Java开发中触发空指针异常的场景
作为一名后端开发者在Java编程的世界中,想必大家对空指针并不陌生,空指针异常是一种常见而又令人头疼的问题,它可能会在我们最不经意的时候突然出现,给我们的代码带来困扰,甚至导致系统的不稳定性,而且最可怕的是有时候不能及时定位到它的具体位置。针对这个问题,我们需要深入了解触发空指针异常的代码场景,并寻找有效的方法来识别和处理这些异常情况,而且我觉得空指针异常是每个Java开发者都可能面临的挑战,但只要我们深入了解它的触发场景,并采取适当的预防和处理措施,我们就能够更好地应对这个问题。那么本文就来分享一下实际开发中一些常见的触发空指针异常的代码场景,并分享如何有效地识别和处理这些异常情况。
19 1
探索Java开发中触发空指针异常的场景
|
5天前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
47 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式