前段时间转了一篇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的优点都保留,发明一种即支持基础批量数据计算类库、表达式参数机制和动态数据结构,又支持计算分步、一致的有序集合对象、对象引用机制等运算机制的程序语言,是否就能很好地解决数据计算的困难了?
相关推荐
JAVA 学生信息管理系统需求分析 基于java语言开发的学生信息管理系统是现代教育系统中不可或缺的一部分。该系统的主要目的是为了提高教学办公室的工作效率,减轻行政人员的工作负担,并为学生提供更加方便、快捷的...
然而,Smali代码对于非专业人士来说,阅读和理解起来相当困难,这就引出了Smali2Java工具的出现。 Smali2Java的核心功能在于将Smali代码转换为Java源代码。这个过程极大地简化了逆向工程师的工作,因为Java代码对于...
此外,调试分析部分反映了学生在编程过程中遇到的困难,如最初缺乏编程思路,通过模仿解决了界面设计问题,但在数据库连接和用户验证方面遇到了挑战。尽管如此,学生表示已经基本实现了大部分功能,但用户管理和一些...
SOPA为分析java流程的eclipse插件,其主要用途如下: 1. 孙子曰:凡治众如治寡,分数是也。每个交易所涉及的方法众多,如何才能整体把握所用到的方法很关键。流程分析图将众多方法进行层次整理,使开发人员方便的...
不遵循规范可能导致代码难以阅读、维护困难。例如,命名约定不一致,注释不足,或者没有充分利用面向对象的设计原则(如单一职责、开闭原则等)。解决方法包括制定并严格执行团队编码规范,使用代码审查工具,以及...
PMD正是这样一种工具,可以直接使用它自带的规则(当然也可以使用自己的规则)对Java源程序进行分析找出程序存在的问题,可以很大程度上的减轻代码检查工作的繁琐,为项目组今后的维护和开发工作起到指导的作用。...
但一直以来人们使用传统人工的方式管理文件档案,这种管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。 随着科学技术的不断提高,...
在Java编程环境中,数值分析是计算科学中的一个重要领域,它涉及到使用计算机来处理数学问题,如求解方程、积分、微分等。本上机测试着重于非线性方程的解法以及线性方程组的求解。下面我们将深入探讨这两个核心主题...
在描述中提到,阅读SPSS的Java脚本可能有些困难,这是因为SPSS的API涉及到很多特定的类和方法,这些类和方法往往与SPSS的内部工作流程紧密关联。例如,`com.spss.statistics.Command`用于执行SPSS命令,`...
Java课程在现代教育中占有重要地位,特别是在信息技术...这份分析报告("基于SPOC实践平台的Java课程分析.pdf")将详细阐述以上各个方面的具体实施策略和技术,对于教育工作者和Java学习者来说都是一份宝贵的参考资料。
2. Java语言的挑战: 传统的静态分析方法在面对Java这样的动态类型语言时遇到困难,因为Java的动态特性如类加载、动态绑定和运行时优化使得WCET预测变得更为复杂和不可靠。 3. 新方法概述: 本文提出的新方法通过在源...
作者可能还会分享如何测试和调试并发程序,这是并发编程中非常困难且容易被忽视的一部分。包括性能分析、死锁检测以及如何使用日志和监控工具来诊断并发程序中的问题。 此外,该书可能会对Java中一些新的并发API...
本课程设计旨在通过黑白棋游戏的开发,不仅让学生掌握Java编程的基础知识,还能在实践中学习面向对象编程的思想、Java标准类库的使用方法以及简单的AI算法。此外,还能够锻炼学生的综合分析能力和问题解决能力,为...
在Java编程语言中,判断文件或...需要注意的是,这些方法都有其局限性,特别是对于没有BOM且包含混合字符集的文件,可能会比较困难。因此,最好的实践是在创建文件或数据时就明确记录编码类型,以避免后期的识别问题。
Java字节码文件保护分析与研究 Java字节码文件保护是指保护Java字节码文件免受非法反编译和窃取的保护方法。Java字节码文件是一种平台无关的文件格式,可以在任何支持Java虚拟机(JVM)的设备上运行。然而,Java...
本文首先讨论了保护Java程序的基本方法,然后对代码混淆问题进行深入研究,最后结合一个实际的应用程序,分析如何在实践中保护Java程序。 Java代码保护的重要性 Java语言的应用在全世界范围正流行,它广泛的应用在...
- 两种Web服务的适用场景分析。 2. **WebService开发**: - 使用JAX-WS实现SOAP服务。 - 使用JAX-RS开发RESTful服务。 - 安全性考虑(认证、授权)。 综上所述,《Java开发经常遇到的经典265道题》不仅覆盖了...
然而,由于Java的字节码是二进制格式,对于开发者来说,直接阅读和理解这些class文件可能会非常困难。这就引出了我们的主题——"java反编译软件 class转java"。 反编译是将已编译的机器代码转换回源代码的过程。在...
Java Bytecode Editor(简称JBE)是一款强大的工具,专门用于查看和分析Java字节码。在深入探讨JBE的功能和用途之前,我们首先需要理解什么是Java字节码。Java字节码是Java源代码经过Java编译器编译后的中间表示形式...
通过使用Wookiee,开发人员可以快速且简单地搭建微服务架构,减少配置上的困难。 6. DevOps与容器化交付管道:介绍了实际应用中如何使用基于容器的交付管道来自动化地将容器化的Java EE应用部署到云环境中,具体是...