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


相关文章
|
12天前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
42 4
|
16天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
50 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
11天前
|
监控 Java 测试技术
Java开发现在比较缺少什么工具?
【10月更文挑战第15天】Java开发现在比较缺少什么工具?
26 1
|
12天前
|
Java
Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
【10月更文挑战第14天】Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
40 2
|
4天前
|
开发框架 JavaScript 前端开发
HarmonyOS UI开发:掌握ArkUI(包括Java UI和JS UI)进行界面开发
【10月更文挑战第22天】随着科技发展,操作系统呈现多元化趋势。华为推出的HarmonyOS以其全场景、多设备特性备受关注。本文介绍HarmonyOS的UI开发框架ArkUI,探讨Java UI和JS UI两种开发方式。Java UI适合复杂界面开发,性能较高;JS UI适合快速开发简单界面,跨平台性好。掌握ArkUI可高效打造符合用户需求的界面。
22 8
|
8天前
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。
|
11天前
|
Java 关系型数据库 API
介绍一款Java开发的企业接口管理系统和开放平台
YesApi接口管理平台Java版,基于Spring Boot、Vue.js等技术,提供API接口的快速研发、管理、开放及收费等功能,支持多数据库、Docker部署,适用于企业级PaaS和SaaS平台的二次开发与搭建。
|
13天前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
34 3
|
12天前
|
Java
Java开发如何实现文件的移动,但是在移动结束后才进行读取?
【10月更文挑战第13天】Java开发如何实现文件的移动,但是在移动结束后才进行读取?
36 2
|
15天前
|
移动开发 Java 大数据
深入探索Java语言的核心优势与现代应用实践
【10月更文挑战第10天】深入探索Java语言的核心优势与现代应用实践
26 4