前段时间转了一篇SQL的文章(http://datamachine.iteye.com/blog/1971896),文章不复杂,但思想深刻,就顺便思考了一下java的不足,当砖头丢出来,希望引点和田玉。
-----------------------------------------------------------------------------------------分割线----------------------------------
SQL和JAVA(这里的JAVA泛指各种高级语言)是最常用的两种计算体系。两者在处理批量结构化数据(即数据库中的数据)时各有优势,JAVA更灵活,SQL更便利。两者虽有相当程度的互补,但在实际应用中很难调和。本文主要讨论java的问题,讨论思路沿袭SQL的那篇文章。
JAVA以及其它高级语言看起来没有SQL的计算不分步、集合无序、集合化不彻底和缺乏对象引用等问题,其执行过程符合人们的思维习惯,用JAVA时不必象使用SQL那样需要绕道变换思路。
那么,JAVA是否能够轻松完成批量数据计算呢?
在许多场合程序员确实会放弃使用SQL而采用JAVA。但是,由于JAVA不具备SQL的三个重要特点,数据计算依然繁琐困难。
首先,JAVA缺乏针对批量数据计算的基础支持,这一点很容易理解。
虽然JAVA提供了集合数据类型(即数组),但JDK中并没有多少相关的基本计算。简单的求和运算也需要写一段循环代码,虽然难度不大,但处处都这么写就繁琐了。另外,JAVA没有提供针对记录集合(即对象数组)的过滤、分组、连接等计算,代码实现难度不低,这就不仅只是繁琐而是困难了。
那么,是不是为JAVA搞一套批量数据计算的基础类库就可以了呢?JAVA的语法规则不支持表达式参数,开发批量数据计算类库的努力注定无法完美实现。
举例说明:有集合(数组)x,我们想提供一些针对其成员的基础计算,比如求和,那么在类库中写个x.sum()函数就可以;还想计算平方和呢,再写一个x.sum2()函数;还有数学平均、绝对值的合计、个位数的合计、…,没完没了,类库很快就会庞大到无法容忍的地步。
SQL没有这个苦恼,求和,可以写sum(x);平方和,可以写sum(x*x);绝对值合计,可以写sum(abs(x));…
JAVA的语法却不能写这种东西,编译器会将sum(x*x)中的x*x先算出来,它不支持把表达式作为参数传递进函数内部再计算的机制。但记录集合上的运算对表达式参数的需求强烈,过滤、分组、排序、连接等都必须使用表达式(不使用表达式参数难以描述这些运算)。
一个替代方案是将表达式都写进字符串,这样sum(x*x)要被写成sum("x*x")。这个办法在理论上可行,但会导致书写和阅读的巨大麻烦。试想,如果SQL要求我们把语句写成这样会造成什么样的烦恼:
select "x*x" from "A" where "x>5"?而且,又怎么区分我们想要的是表达式x*x,还是常数字符串"x*x"呢?
第三,所谓的批量数据大都是结构化数据,JAVA提供了强大的类概念,可以自由地定义数据结构。但是,程序中用到的数据结构必须在编译前设计好,不能由某个语句临时产生,即不支持动态数据结构。而实际运算过程中的动态数据结构要求比比皆是。我们经常需要新的数据结构来描述返回的结果集,有时还需要在现有数据结构上添加计算字段以方便计算,没有动态数据结构的支持,所谓的批量结构化数据运算就成了空话。
但是,SQL能够很好地满足这一要求,select语句会自然地创建新数据结构,几乎所有数据库都支持用语句动态创建/修改表和临时表。
如果我们把SQL和JAVA的优点都保留,发明一种即支持基础批量数据计算类库、表达式参数机制和动态数据结构,又支持计算分步、一致的有序集合对象、对象引用机制等运算机制的程序语言,是否就能很好地解决数据计算的困难了?
相关推荐
SOPA为分析java流程的eclipse插件,其主要用途如下: 1. 孙子曰:凡治众如治寡,分数是也。每个交易所涉及的方法众多,如何才能整体把握所用到的方法很关键。流程分析图将众多方法进行层次整理,使开发人员方便的...
PMD正是这样一种工具,可以直接使用它自带的规则(当然也可以使用自己的规则)对Java源程序进行分析找出程序存在的问题,可以很大程度上的减轻代码检查工作的繁琐,为项目组今后的维护和开发工作起到指导的作用。...
但一直以来人们使用传统人工的方式管理文件档案,这种管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。 随着科学技术的不断提高,...
对于许多java的初学者,刷力扣和牛客尚且感到困难,而且对于c语言的编程思想向java编程思想的转换尚且有些不习惯,此文档则针对java初学者整理的初级50道入门题。其中包括分解质因数,打印完数,企业利润分析,辗转...
CPU和内存的剖析历来是很困难的,YourKit创造出了革命性的剖析工具,应用在研发和生产阶段,为专业的Java开发者带来了无比的好处。 YourKit Java Profiler是一个目前很受欢迎的Java Profiler(Java调优器).可以...
但分析程序的执行行为问题(虚拟机是怎样做的、性能如何)则意义不大,如需对具体虚拟机实现进行调优、性能分析等,我推荐在本书基础上继续阅读《Java Performance》和《Oracle JRockit The Definitive Guide》等书...
尽管java虚拟机和垃圾回收机制管理着大部分的内存事务,但是在java软件中还是可能存在内存泄漏的情况。的确,在大型工程中,内存泄漏是一个普遍问题。避免内存泄漏的第一步,就是要了解他们发生的原因。这篇文章就是...
当然,也存在一些特别困难的项目,需要作者付出更为艰辛的努力,或者付出更大的代价。但是,大多数项目都是比较“常规”的,所以一般都能作出成功的分析与设计,而且只需用到推荐的一小部分方法。但无论多么有限,...
SQL Server 近年来,随着高校的扩招,运用常规的方法对学生成绩的管理变得越来越困难,因此 学校迫切的需要一种高效的系统来帮助其管理学生的成绩。学生成绩管理系统拥有其高 效和易于操作的性能,在学校对学生成绩...
遗憾的是,现在介绍Java数据结构和算法的好书却较少,使大家在进一步学习、使用Java的过程中遇到了一些困难。本书正是为此目的而撰写的。作者使用浅显易懂的语句来阐述一个个常见的数据结构,并配以大量的例子和代码...
集合源码分析 《Java业务开发常见错误100例》源码目录 专栏地址 点赞趋势 如果觉得源码对你有帮助,欢迎Star 源码说明 专栏的所有代码基于Java 8 + Spring Boot 2.2.1.RELEASE + Spring Cloud Greenwich.SR4 + ...
这对于查询、更新和维护带来了不少的困难,因此就需要有一套行之有效的计算机管理图书管的方案来提高图书管理的工作效率。本系统针对图书馆的工作特点,设计了图书管理、读者管理、借书管理、归还管理等4个主要的...
阅读英文的书籍就是如此,不是想象中的那么困难:)宁可在沙场上战死,也不能被吓死不是吗:) 信息筛选,搜索出来的结果不见得能够完全匹配,建议大家多阅读前几页的搜索结果,多打开几个网页看看,不过,我的...
JaSoMe:Java源度量 Jasome(JAH-suhm,韵律很棒)是一种源代码分析器,仅基于源代码就可以从项目中挖掘内部质量指标。 这使Jasome与类似的工具区分开来,因为它... 最佳猜测指标分析意味着,即使单个文件比较困难,Ja
集合源码分析 《Java业务开发常见错误100例》源码目录 专栏地址 点赞趋势 如果觉得源码对你有帮助,欢迎Star 源码说明 专栏的所有代码基于Java 8 + Spring Boot 2.2.1.RELEASE + Spring Cloud Greenwich.SR4 + ...
书中展示了许多实际的代码示例,并对一些实例做了深入的分析,通过这些内容,为读者展示JSP 2.0的许多新特性,并强调Web开发的一些最佳实践。本书配有习题和综合项目,非常适合作为相关院校JSP程序设计课程的教材。 ...
设计方案论证 2.1需求分析 对于一个图书管理系统来说,图书的查询及数据的维护管理是其中的核心环节。在现 现行的图书管理中存在几个共同的问题: 〔1图书种类过多,数据庞大;这是几乎所有图书馆都会遇到的共同问题,...
遵循软件工程的知识,从软件问题定义开始,接着进行可行性研究、需求分析、概要设计、详细设计,最后对软件进行了测试,整个开发过程贯穿软件工程的知识体系。 此次设计在Microsoft Windows XP系统下,以Java为开发...
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。 exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。 16、...
学生信息管理系统java课程设计(含源代码) JAVA程序设计 课程设计报告 课 题: 学生信息管理系统 姓 名: 学 号: 同组姓名: 专业班级: 指导教师: 设计时间: 目 录 一、系统描述 2 1、需要实现的功能 3 2、设计...