作者:Phillip J. Eby. 翻译:ShiningRay @ NirvanaStudio 原文地址:[[[url]http://dirtsimple.org/2004/12/python-is-not-java.html[/url]][1]][1] 我最近正在看一个基于wxPython的GUI应用程序,大概45.5KLOC的样子,但我没有计算它用到的库的大小(如Twisted)。代码是由那些对Python相对生疏的Java的开发者写的,所以程序有很严重的性能问题(如三十秒的启动时间)。我在检查
对比java和python 1.难易度而言。python远远简单于java。 2.开发速度。Python远优于java 3.运行速度。java远优于标准python,pypy和cython可以追赶java,但是两者都没有成熟到可以做项目的程度。 4.可用资源。java一抓一大把,python很少很少,尤其是中文资源。 5.稳定程度。python3和2不兼容,造成了一定程度上的混乱以及大批类库失效。java由于有企业在背后支持所以稳定的多。 6.是否开源。python从开始就是完全开源的。Java由sun开发,但现在有GUN的Openjdk可用,所以不用担心。 7.编译还是解释。两者都是解释型。 我理解,C好比手动挡车(编译型语言),java和python(解释型语言)好比自动档车。跑的最快的车都是手动档,但是对开不好的人来说,开自动档反而更快些。 Kno有一篇文章谈到选择编程语言,“先确定你的需求”,不要由语言的简单还是复杂去觉定。只有能够编写你真正认为有用的程式,才能获得满足感,学习才能继续。 那么java和python分别适用于什么样的环境呢。由sourceforge.net可以看出: 最著名,久经考验的普通应用程序,基本都是c++写的。例如emule,7-zip,WinSCP,FileZilla等等等。 一部分由java开发,例如最有名的OpenOffice。 python写的很少,如Pidgin,FireBird。 开发语言(有多少个程式由此语言开发)的排行如下: # Java46,202 # C++36,895 # PHP30,048 # C28,075 # C#13,476 # Python13,379 # JavaScript11,285 # Perl9,216 # Unix Shell3,869 # Delphi/Kylix3,548 # Visual Basic3,186 # Visual Basic .NET 很多框架和类库也和应用软件一样在这个列表里,因此比较公平。 由此可以看出,java不管在GNU还是商业领域都是应用最广的语言。C主要用于构建系统底层。c++和java用于构建中间应用层。如果资源足够,那么会选择c++开发,以求运行速度,否则会用java开发,以求开发速度。python在各方面都比java优秀,可谓次世代语言。可最受争议的是它的速度,纯python比java慢很多,以及背后没有商业支持,稳定性备受诟病。目前为止,python在商业层次上,主要作为一种胶水语言,粘合其他语言(主要是c/c++)的类库。在GNU领域,主要局限于小规模的应用和个人化应用。以及逆向工程(黑客)应用。 为什么java在服务器端被大量应用,在客户端用的却比较少呢。难道服务器端用到的计算量反而少么。我认为这说明对比c++,java的速度还是可以接受的。无法被接受的是JRE平台,以及JRE平台启动时卡的那一会儿。我就曾经为此认为java写就的程式性能低下。 python用户常常拿来说嘴的一点是:python并不慢,因为python运行时调用了大量c库,而c是很快的。反过来想想,这正反映了其胶水语言的事实,任何一种语言都可以调用c库,这么比较有价值么?假如一个库完全由python,那么它的运行效率...不说也罢。编程不能总是用别人的库啊。
知乎上有个问题,关于Python和Java语法的对比,同样是计算数组长度,为什么Python使用len(array),属于内置函数,而Java则用array.size(),属于类方法。
先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即可。首先看下JNI调用C/C++的过程,注意写程序时自下而上,调用时自上而下。
同样的数据计算任务,用 SQL 写和用 Java 写,后者常常会长出数倍。代码长不仅仅是写起来很繁琐,也不利于理解整体业务逻辑结构,算法过程都湮没在细节中。 为什么 Java 会比 SQL 长这么多?我们来回答这个问题,并引出程序语言的集合化概念。
在Java中,volatile用于标记变量,而内存屏障又是volatile的底层实现。它们是Java中最基础也是最简单的两个概念,它们的出现使得开发者在多线程环境下能够保证更好的数据一致性和程序执行的正确性。volatile简单、轻量,相比于其他方式,如synchronized或直接加锁,有着更好的性能。能让开发者少些对锁的忧虑,多一些对实际问题的关注。
1、对于final域的内存语义,编译器和处理器要遵守两个重排序规则(内部实现也是使用内存屏障):
你可以在一个接口中声明一个抽象方法,然后再不同的实现类中去实现这个方法。这样不就进行了统一了吗。
面向对象思想在编程中扮演着重要的角色,其核心是在做事情的过程中,寻找对象,并调用对象的属性或行为。在面向对象编程中,我们往往先考虑问题的对象,然后定义相应的类,包含这些对象的属性和行为。
Lambada表达式可以理解为:可传递的匿名函数的一种简洁表达方式。Lambda表达式没有名称,同普通方法一样有参数列表、函数主体、返回类型等;
在没有SSD硬盘之前,大家都会觉得我们的HDD硬盘很好用,什么5400转、7200转,广告都是棒棒的。直到有一天,SSD出现了,发现启动Windows的时候,居然可以秒开,这才幡然醒悟。因此,对于外行来说,磁盘I/O性能总是最容易被忽略的,精力会更集中在CPU上。但是对于内行人来说,大家都懂得,性能无非是CPU密集型和I/O密集型。磁盘I/O就是其中之一。那么到了移动时代,我们的存储芯片性能究竟怎样呢?在讨论这个问题之前,我们来看一个测试数据。
基本类型 var age: Int = 123 // 标准语法,声明一个可变变量 age val name: String = "Tom" // 标准语法,声明一个不可变
为什么我先拿“数据结构和算法”说事捏?这玩意是写程序最最基本的东东。不管你使用 Java 还是其它的什么语言,都离不开它。而且这玩意是跨语言的,学好之后不管在哪门语言中都能用得上。
这是这个系列的最后一篇,从编程范型的角度概览,前面几篇的链接在文章后半部分有汇总。
上节我们主要讲了Kotlin的数据类型,这节我们主要从程序结构,包括方法,类成员,运算符的角度去认识Kotlin
最近 JetBrains 的 Kotlin 语言忽然成了热门话题。国内小编们传言说,Kotlin 取代了 Java,成为了 Android 的“钦定语言”,很多人听了之后热血沸腾。初学者们也开始注意到 Kotlin,问出各种“傻问题”,很“功利”的问题,比如“现在学 Kotlin 是不是太早了一点?” 结果引起一些 Kotlin 老鸟们的鄙视。当然也有人来信,请求我评价 Kotlin。 对于这种评价语言的请求,我一般都不予理睬的。作为一个专业的语言研究者,我的职责不应该是去评价别人设计的语言。然而浏览了 Kotlin 的文档之后,我发现 Kotlin 的设计者误解了一个重要的问题——关于是否需要 checked exception。对于这个话题我已经思考了很久,觉得有必要分享一下我对此的看法,避免误解的传播,所以我还是决定写一篇文章。 可以说我这篇文章针对的是 checked exception,而不是 Kotlin,因为同样的问题也存在于 C# 和其它一些语言。 冷静一下 在进入主题之前,我想先纠正一些人的误解,让他们冷静下来。我们首先应该搞清楚的是,Kotlin 并不是像有些国内媒体传言的那样,要“取代 Java 成为 Android 的官方语言”。准确的说,Kotlin 只是得到了 Android 的“官方支持”,所以你可以用 Kotlin 开发 Android 程序,而不需要绕过很多限制。可以说 Kotlin 跟 Java 一样,都是 Android 的官方语言,但 Kotlin 不会取代 Java,它们是一种并存关系。 这里我不得不批评一下有些国内技术媒体,他们似乎很喜欢片面报道和歪曲夸大事实,把一个平常的事情吹得天翻地覆。如果你看看国外媒体对 Kotlin 的报道,就会发现他们用词的迥然不同: Google’s Java-centric Android mobile development platform is adding the Kotlin language as an officially supported development language, and will include it in the Android Studio 3.0 IDE.
最近这段时间,轩辕有些迷茫了,工作生活中一堆事儿,忙得我两头摸黑,很难找到时间静下心来写文章,就连你现在看到的这一篇还是我点灯熬油到1点钟才写完的。
final域,编译器和处理器要遵守两个重排序规则: - 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 - 初次读一个包含final域的引用,与随后初次读这个final域,这两个操作之间不能重排序。
1.HashMap 首先就是对 java 的 HashMap 进行了修改,以前是通过 hashCode 方法来判断他们的地址值是否一样 ,如果相同的话再使用 equals 方法比对他们的 equals 返回的结果是否一样,是则不存入否则的话就形成一个链表 直接挂在原有元素的后面。这个地方就有一个比较大的问题就是使用 hashCode 方法的时候组字坏的情况时需要和每一个元素 比对 hashCode 比较的次数就变多了。 这里后来提出了一种解决方案,就相当于一个数组,然后数组的元素就是一个 entry 这样的
Kotlin是一门最近比较流行的静态类型编程语言,而且和Groovy、Scala一样同属Java系。Kotlin具有的很多静态语言特性诸如:类型判断、多范式、扩展函数、模式匹配等等让我无法只作为一个吃
大家好,我是扔物线朱凯。Kotlin 很方便,但有时候也让人头疼,而且越方便的地方越让人头疼,比如 Lambda 表达式。很多人因为 Lambda 而被 Kotlin 吸引,但很多人也因为 Lambda 而被 Kotlin 吓跑。其实大多数已经用了很久 Kotlin 的人,对 Lambda 也只会简单使用而已,甚至相当一部分人不靠开发工具的自动补全功能,根本就完全不会写 Lambda。今天我就来跟大家唠一唠 Lambda。不过,要讲 Lambda,我们得先从 Kotlin 的高阶函数——Higher-Order Function 说起。
区分lambda表达式和闭包 熟悉的Javascript或者Ruby的同学,可能对另一个名词:闭包更加熟悉。因为一般闭包的示例代码,长得跟lambda差不多,导致我也在以前很长一段时间对这两个概念傻傻分不清楚。其实呢,这两个概念是完全不同维度的东西。 闭包是个什么东西呢?我觉得Ruby之父松本行弘在《代码的未来》一书中解释的最好:闭包就是把函数以及变量包起来,使得变量的生存周期延长。闭包跟面向对象是一棵树上的两条枝,实现的功能是等价的。 这样说可能不够直观,我们还是用代码说话吧。其实Java在很早的版本就支
《Computer World》杂志曾经写过一篇文章,说“编程到1960年就会消失”,因为IBM开发了一种新语言FORTRAN,这种新语言可以让工程师写出他们所需的数学公式,然后提交给计算机运行,所以编程就会终结。
上面的数据存放着一组人员姓名、年龄、性别相关的信息。 现在有一个需求, 获得年龄20岁以上,性别为女的人的姓名。 看到需求后, 很多人脑袋中产生的解决方案可能是这样的 代码执行的结果是[“夏香”,“秋香”] 很好,结果正确,考试的话肯定给满分。 但是这种实现方法有点过时,不潇洒,现在流行的做法应该是这样子 看, 一样的实现了要求,代码却简洁了许多。如果把代码的实现方式和我们平时的穿着来做对比, 这种实现方式就像是走时尚潮流尖端的穿着打扮,比如说电视里走在t台上的模特的穿着,因为这是es6的语法,
与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问。对于final域,编译器和处理器要遵守两个重排序规则:
Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。 可以将native方法比作Java程序同C程序的接口,其实现步骤: 1、在Java中声明native()方法,然后编译; 2、用javah产生一个.h文件; 3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件); 4、将第三步的.cpp文件编译成动态链接库文件; 5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。
自 1996 年 JDK(1.0)发布以来,Java 已经受到了学生、项目经理和 程序员等一大批活跃的用户的欢迎。这一语言极富活力,不断被用在大大小小的项目里。从 Java1.1(1997)年一直到 Java7(2011)年,Java 通过增加新功能,不断得到良好的升级。Java8 则是在 2014 年 3 月发布的。那么问题来了:为什么你应该关心 Java8?
take是从集合中取前几个元素 takeLast是从集合中取后几个元素 sortedBy 排序 过滤list,符合过滤条件的就是过滤结果 filterNot把符合条件的过滤掉,剩下的是结果。这个操作和 filter 相反 slice,取集合中的某一部分
DWR是Ajax的一个开源框架,可以很方便是实现调用远程Java类。但是,DWR只能采用回调函数的方法,在回调函数中获取返回值,然后进行处理。那么,到底有没有办法直接获取一个方法的放回值呢?
一个问题如果被回答地很少,有可能是因为知道答案的人很少,亦或是因为问题本身模糊不清、微不足道(但对你来讲可能很关键)。我似乎发明了一个术语,但是它在一个信息量很大的叫做About.com Urban legends 网站里也被提到了。Java相关的常见问题非常之多,但接下来我要讲的是Java不常问到的问题(不常见问题列表就没那么多了,其中包括了一些对C语言的冷嘲热讽。)
编译性高级编程语言中,几乎每种语言,都有个静态的 main 方法作为程序启动入口,每种语言都有其编写规范。为了学习 C/C++、C#、JAVA四种语言,我们要先从默认代码模板中,慢慢摸索学习。
java构造函数怎么写?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
JDK:是java开发工具包,可以编写java程序,是面向开发者的工作环境,需要配置环境变量。
有时候,写TypeScript写多了,写Java的时候就老容易出错。而当陷入某个项目一段时间之后,自我感觉老熟悉的Python和Golang,会变得非常的陌生。而某段时间写起来行云流水的Bash脚本,每次重新拿起,都会进入看文档写代码的境地。
程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准:
Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准:
序言 因为在接下来的源码分析中将涉及大量的Java和Native的互相调用。当然对于我们的代码分析没有什么影响,但是,这样一个黑盒子摆在面前,对于其实现原理还是充满了好奇心。本篇将从JNI最基本的概念到简单的代码实例和其实现原理逐步展开。 1.JNI JNI(Java Native Interface,Java本地接口)是一种编程框架使得Java虚拟机中的Java程序可以调用本地应用/或库,也可以被其他程序调用。 本地程序一般是用其它语言C,C++或汇编语言编写的, 并且被编译为基于本机硬件和操作系统的程
CAS 的意思是 compare and swap,比较并交换。CAS 的引入是为了解决java锁机制带来的性能问题。锁机制存在以下问题:
在开发过程中,有一些底层库,算法、加解密之类的功能,不是用Java写的,而是C或者C++,而我们需要在Android工程中调用C/C++的函数达到理想的要求,那么这个时候你就需要知道怎么使用它们。
作者:normalnotebook 背景<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 上
非常熟悉。可在我漫长的编程生涯中,我大概是第 5 次在 Google 搜索了“Java Hello world”之后,才能独自完整的默写出来。。因为他有些“不太好记住”的点:比如他必须通过该类的一个叫 main 的 public 的 static 的函数,且这个函数入参必须是有且仅有一个 String[] 数组。如果错了其中一个,那你就没法运行。
前言 Java8已经出现了很久了,但是呢,还是有很多人都还在习惯使用以前的来版本JDK,或者是以前老版本的编程方式。通过一段时间对Java8新特性的学习之后,自己也深受感触,原来java8版本写代码可以这么简洁。Java8最主要的就是给我们编程的过程带来了很多便利,不仅仅是代码量少。更多的还是让程序更简洁,减少代码冗余。Java8新特性中有几个比较主要的特性,Lambda 表达式、函数式接口、方法引用和几个新增库Stream API、Optional类等。 接下来就是对自己的学习内容做一个总结。 Lambda 表达式 2.1 Lambda表达式简介 Lambda 表达式其实就是一种匿名函数,在这之前大家可能还接触过匿名内部类,虽然也是一种匿名函数,但是它并没有Lambda表达式那么简洁,Lambda表达式的特点就是可以传递,在使用Lambda表达式的时候我们可以将代码像数据一样传递。使用Lambda表达式能够极大的减少我们代码的冗余,而且使用也相当的方便。熟练之后会大大加快我们写代码的速度。 2.2 java8的方法与老版本的对比 首先我们来尝试着找出公司员工年龄大于35岁的所有员工,这个问题都不是很难吧。我们用不同的方法来实现一下,我先给出几个不同的方法直接看看效果。 首先我们应该做的是创建员工的数据,先创建一个Staff类来代表员工,并且使用构造函数来创建员工的集合。第一种方法来看看我使用的最常规的方法: public List<Staff> getStaffs(List<Staff> staffs) { List<Staff> stas=new ArrayList<>(); for(Staff sta:staffs){ if (sta.getAge()>=35){ stas.add(sta); } } return stas; } @Test public void test1(){ List<Staff> list = getStaffs(staffs); for (Staff staf:list) { System.out.println(staf); } } 只看一种方法可能没有什么感觉,那么再看看第二种方法试试呢。 这种方法也叫策略设计模式,我们需要写一个接口,然后实行这个接口,最后是调用接口。这种方法看起来就比前面的那种更有层次,而且假如又需要查找员工工资大于5000的员工的话,我们就可以重新写一个类来实现接口就好了,下面来看看代码。 public List<Staff> filterStaff(List<Staff> list,MyPredicate<Staff> mp){ List<Staff> staffs=new ArrayList<>(); for (Staff staff:list) { if (mp.test(staff)){ staffs.add(staff); } } return staffs; } @Test public void test2(){ List<Staff> list = filterStaff(staffs,new filterStaffByAge()); for (Staff staf:list) { System.out.println(staf); } } 第三种方法是使用匿名内部类的方法,其实也是和第二种方法是差不多的。 public void test3(){ List<Staff> list=filterStaff(staffs, new MyPredicate<Staff>() { @Override public boolean test(Staff staff) { return staff.getAge()>=35; } }); for (Staff staf:list) { System.out.println(staf); } } 这些方法都是java8之前可以使用的一些方法,那么java8以后有哪些方法呢?前面的方法看了之后有没有
Lisp的本质(The Nature of Lisp)学习思考 作者 Slava Akhmechet 译者 Alec Jang 出处: http://www.defmacro.org/ramblings/lisp.html 简介 最初在web的某些角落偶然看到有人赞美Lisp时, 我那时已经是一个颇有经验的程序员。在我的履历上, 掌握的语言范围相当广泛, 象C++, Java, C#主流语言等等都不在话下, 我觉得我差不多知道所有的有关编程语言的事情。对待编程语言的问题上, 我觉得自己不太会遇到什么大问题
在程序员的世界里,一个广为人知的笑话是:程序员最烦的两件事,一是别人写代码不写注释,二是自己写代码要写注释。这看似矛盾的说法反映了程序员们对注释的复杂情感。对于程序员来说,写代码和写注释似乎总是一对矛盾的任务,那么我们究竟该如何看待这个问题呢?
可能你之前没有听说过这个词,也会好奇这是个什么东西是用来干嘛的,在维基百科上有这样的解释。
答:因为类是继承Object类,默认的是继承Object的方法,而Object方法的equals是返回的对象的地址。
初遇 初次遇见 native是在 java.lang.Object 源码中的一个hashCode方法: 1public native int hashCode(); 为什么有个native呢?这是我所要学习的地方。所以下面想要总结下native。 一、认识 native 即 JNI,Java Native Interface 凡是一种语言,都希望是纯。比如解决某一个方案都喜欢就单单这个语言来写即可。Java平台有个用户和本地C代码进行互操作的API,称为Java Native Interface (Jav
领取专属 10元无门槛券
手把手带您无忧上云