大数据中的java是什么?

Python021

大数据中的java是什么?,第1张

Java是由Sun Microsystems公司推出的Java面向对象程序设计语言(以下简称Java语言)和Java平台的总称。Java由James Gosling和同事们共同研发,并在1995年正式推出。Java最初被称为Oak,是1991年为消费类电子产品的嵌入式芯片而设计的。1995年更名为Java,并重新设计用于开发Internet应用程序

用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动态Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器均支持Javaapplet。另一方面,Java技术也不断更新。Java自面世后就非常流行,发展迅速,对C++语言形成有力冲击。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。2010年Oracle公司收购Sun Microsystems大数据技术是以数据为本质的新一代革命性的信息技术,在数据挖潜过程中,能够带动理念、模式、技术及应用实践的创新。本书系统性地介绍了大数据的概念、发展历程、市场价值、大数据相关技术,以及大数据对中国信息化建设、智慧城市、广告、媒体等领域的核心支撑作用,并对对数据科学理论做了初步探索。

当然是面向对象的思想咯。  OOP的许多原始思想都来之于Simula语言,并在Smalltalk语言的完善和标准化过程中得到更多的扩展和对以前的思想的重新注解。可以说OO思想和OOPL几乎是同步发展相互促进的。与函数式程序设计(functional-programming)和逻辑式程序设计(logic-programming)所代表的接近于机器的实际计算模型所不同的是,OOP几乎没有引入精确的数学描叙,而是倾向于建立一个对象模型,它能够近似的反映应用领域内的实体之间的关系,其本质是更接近于一种人类认知事物所采用的哲学观的计算模型。由此,导致了一个自然的话题,那就是OOP到底是什么?[D&T 1988][B.S 1991] .。在OOP中,对象作为计算主体,拥有自己的名称,状态以及接受外界消息的接口。在对象模型中,产生新对象,旧对象销毁,发送消息,响应消息就构成OOP计算模型的根本。

对象的产生有两种基本方式。一种是以原型(prototype)对象为基础产生新的对象。一种是以类(class)为基础产生新对象。原型的概念已经在认知心理学中被用来解释概念学习的递增特性,原型模型本身就是企图通过提供一个有代表性的对象为基础来产生各种新的对象,并由此继续产生更符合实际应用的对象。而原型-委托也是OOP中的对象抽象,代码共享机制中的一种。一个类提供了一个或者多个对象的通用性描叙。从形式化的观点看,类与类型有关,因此一个类相当于是从该类中产生的实例的集合。而这样的观点也会带来一些矛盾,比较典型的就是在继承体系下,子集(子类)对象和父集(父类)对象之间的行为相融性可能很难达到,这也就是OOP中常被引用的---子类型(subtype)不等于子类(subclass)[Budd 2002]。而在一种所有皆对象的世界观背景下,在类模型基础上还诞生出了一种拥有元类(metaclass)的新对象模型。即类本身也是一种其他类的对象。以上三种根本不同的观点各自定义了三种基于类(class-based),基于原型(prototype-based)和基于元类(metaclass-based)的对象模型。而这三种对象模型也就导致了许多不同的程序设计语言(如果我们暂时把静态与动态的差别放在一边)。是的,我们经常接触的C++,Java都是使用基于类的对象模型,但除此之外还有很多我们所没有接触的OOPL采用了完全不一样的对象模型,他们是在用另外一种观点诠释OOP的内涵。

什么是类型(type)?

类型以及类型系统的起源以及研究与发展是独立于OOP的。早在五十年代的FORTRAN语言编译器实现中,就已经采用类型系统作为类型检查的一种手段。广义的类型一般被定义为一种约束,也就是一种逻辑公式。而在对类型的研究过程中产生多种方法,比如[C&W 1985]等。而代数方法(algebraic approach)是一种非常好的建立类型的形式化规范的方法。代数中的一个类型对应于一系列元素,在它们之上定义代数操作。同时在此基础上二阶λ演算已经被用于继承和模板所支持的模型。在上面两种方法中,类型被认为是一系列满足确定约束条件的元素,更抽象的方式可以把一个类型当作规定一个约束条件,如果我们规定的约束条件越好,相对应的被定义元素的集合就越精密,所以逻辑公式(logical formulas)就成为描叙类型特征的最合适工具。在这里,我们不想深入的探究对于类型理论的各种不同的数学模型,我们需要明白的是类型(type)以及类型理论这个在编程语言中经常应用到的概念的内涵是极其丰富的,而其自身理论的发展并非局限于OOP之中,但当两者相结合的时候就对我们的程序观产生了巨大的影响。

类(class),类型(type),接口(interface)

这三个概念是在OOP中出现频率最多,也最容易混淆的。而对于这三个概念的澄清也是文章写作的初衷。让我们先看看大师们对于这三个概念的描叙----

“The fundamental unit of programming in Java programming language is the class, but the fundamental unit of the object-oriented design is the type.while classes define types,it is very useful and powerful to be able to define a type without defining a class.Interface define types in an abstract form as a collection of methods or other types that form the contract for the type.” [Jams 2000]。

“In C++,A class is a user definite type”[B.S 1998]。

“A type is a name used to denote a particular interface……An object may have many types,and widely different objects can share a type.Part of an object’s interface may be characterized by one type ,and other parts by other types.Two objects of the same type need only share parts of their interface.Interface can contain other interface as subset.We say that a type is a subtype of another if its interface contain the interface of its supertype.Often we speak of a subtype inheriting the interface of its supertype”[Gamma 1995]

在其中,一共出现了四个概念:类(class),类型(type),接口(interface)以及契约(contract)。这里我们说到的类型和上面提到的类型有所不同,是狭义的OOP中的类型。为了理解这几个概念,我先划分出三个概念域:一个是针对现实世界的,一个是针对特定程序设计范型的(在这里就是OO设计范型),最后一个是针对编译器实现的。也就是说,在现实世界中的概念必须有一种手段映射到OO范型中去,而OO范型中的概念也应该在编译器实现中有相同的概念对应。由此,我们可以这样说,类是做为现实世界中的概念,而传统的OOPL都会提供class关键字来表示对现实世界模拟的支持。而接口,是作为OO程序设计范型中与类对应的一个概念。在OO设计中,我们所要做的就是针对接口进行设计和编程,而接口的实质含义就是对象之间的一种契约。而类型就是编译器实现中针对类和接口所定义的对应概念。可以这样说,类是现实世界中存在的客观概念,是唯物的。接口是设计人员定义出来的,存在于设计人员心中的概念,是唯心的。而类型是类和接口这两种概念的编译器实现的映射概念,也是唯物的。类型主要是用来指导编译器的类型检查的谓词,类是创建现实对象的模板,接口是OO设计中的关键概念。这三个概念相互区别(分别位于不同的概念域),又相互联系(都是代表相同的概念的不同概念域的映射)。有了上面的理解,我们看看下面最常见的Java语句:

people a=new man()

这代表了什么?程序员向编译器声明了一个people类型(type)的对象变量a,而对象变量a本身却指向了一个man类(class)的实体(而在编译器中理解是对象变量a指向了一个类型为man的实体)。再让我们回到[Jams 2000],其中句子的根本含义我们可以概括如下:声明一个类或者一个接口都同时向编译器注册了一个新的类型,而此类或者接口以及类型都是共享同样的一个名字。也就是说。编译器所能理解的全部都是类型,而程序员的工作是把现实中的类概念转化为设计中的接口概念,而编译器对应于上两种概念都有直接的支持,那就是一个类声明或者接口声明在编译器的理解来看就是一个类型声明。但是反过来却不一定成立。一个类可以有多个接口(一个类完全有可能实现了设计人员的多个契约条件),同时也就可能有多个类型(因为类型不过是接口这个设计域内的概念在编译器中的实现)。

多态,替换原则,对象切割

多态作为OO中的核心机制之一拥有着丰富的内涵。顾名思义,多态就是一种名称多种形态的意思。其主要有三种形式:函数多态,对象变量多态,泛型多态。函数多态主要包括函数重载(overload)和改写(overriding)。泛型多态(genericity)主要是提供了一种创建通用工具的方法,可以在特定的场合将其特化。在这里,我们重点要考量的是对象变量多态。在理解对象变量多态之前,我们首先了解一下OO核心机制之一的替换原则。静态类型的OOPL的一个特征就是一个变量所包含的值(value)的类型可能并不等于这个变量所声明的类型,在传统的编程语言中并不具备这样的特征,因为我们不可能把声明为整型的变量赋上字符串的变量值。而替换原则发生作用的情况就隐含的描叙了两种不同类型所具有的关联----类型继承。Barbara Liskov曾经这样描叙替换原则以及起作用的类型之间的关联:对于类型为S的每个对象s,存在一个类型为T的对象t,对于根据类型T所定义的所有程序P,如果用对象s替换对象t,程序P的行为保持不变,那么类型S就是类型T的子类型[Liskov 1988]

在理解了多态以及替换原则后,我们可以继续深入理解继承与替换原则相结合所带来的新的观点。可以说继承与替换原则的引入影响了几乎所有的OOPL,包括类型系统,值语义/引用语义,对象内存空间分配等等。下面,我将试图逐步的拨开其中的各种因果。

首先考虑,people a这样的代码在编译器中将如何实现?可以肯定是首先将把类型people绑定到对象a上,然后必须为对象a分配空间。同时,我们创建people的子类man,由于man IS A people。根据多态以及替换原则,我们当然可以让对象a保存一个man类型的值(这就是替换原则的表现)。这是一种直观的描叙,但在编程语言的实现过程中就出现一些困难。我们知道继承是一种扩展接口与实现的方式,那么我们就很难保证man类型不对people类型做扩展,而一旦做出扩展,我们如何能用存储people对象的空间去存储man类型的对象值呢?

people a;

man b=new man()

a=b

这样的代码将首先把b对象进行切割,然后再存储到a对象空间去。然而这并不是我们所期望的。那么,为了支持OOP的继承,多态,替换原则,但却需要避免对象切割的发生,面对对象a我们将采用何种分配空间模型呢?常用的有下面三种方式:

1, 只为a分配基类people的存储空间,不支持对象多态以及替换原则。这样的模型内存分配紧凑,存储效率很高。

2, 分配继承树中的最大类对象所需要空间(在这里是man类的对象值空间),这样的模型简单,同时可以实现多态和替换原则而避免对象切割问题,但是十分浪费内存空间十分明显。

3, 只分配用于保存一个指针所需要的存储空间,在运行时通过堆来分配对象实际类型所需要的空间大小,这样也可以实现多态和替换原则而避免对象切割问题。(也就是说a只是一个对象的引用,而不是真实的对象,真实对象的生成必须靠程序员显式的声明)。

对于上面提到的三种内存模型,1和3都被一些程序设计语言所采用。相信说到这里,大家应该开始慢慢明白了。是的,C++作为C语言的继承者,对于效率的追求迫使它必须采用第一种最小静态空间分配的方式,由于基于栈空间的程序运行效率要比基于堆空间的程序运行效率高出许多,所以C++允许用栈空间保存对象,但同时也允许堆空间保存对象,可以说C++是采用了1和3两种相混合的内存模型,而C++中基于1内存模型的对象,也就是说基于栈内存空间的对象是没有办法体现多态和替换原则的(请思考一下在C++中什么对象是基于栈的),而基于3内存模型的对象将支持多态和替换原则(又想一想在C++中什么对象是基于堆的)。这里,我们终于可以揭开第一层迷雾了,很多人都知道在C++中只有指针和引用才能支持对象的多态行为,但是为什么会如此?上面做出了最好的解释。

Java语言由于设计理念和C++有着很大的区别,它采用的是第3种对象模型,一切对象(除了基本类型对象)都是基于堆分配的。这也是Java语言必须采用虚拟机的原因所在。在C++中很大一部分对象是不需要程序员进行管理的(静态空间对象),而在Java中,如果不采用虚拟机机制,所有的对象都需要程序员管理,而这样的开发代价将是巨大而不现实的。这也就揭开了第二层迷雾,当我们在对比C++和Java语言的时候总是为虚拟机是否有其价值而争论不休,但当你抛开所谓的好与不好的简单讨论,进入到其语言本身的内在对象存储本质的时候,也许对于各种声音才会有一个属于自己的清醒认识。

让我们继续望下走,不同的对象内存分配模型直接影响到其程序设计语言的赋值的含义。在各种编程语言中,赋值可以给出两种不同的语义解释:复制语义和指针语义。很明显,由于C++支持两种相混合的对象存储模型(但是默认的存储方式是栈存储),所以在C++中默认赋值语义采用的是前者,但C++同时提供了指针语义的功能支持(在拷贝构造函数和=运算符重载中用户进行自定义)。而在Java中采用的是后者。这也就是我们揭开的最后一道迷雾,不同的对象存储模型直接导致了不同的赋值语义。

面向对象的计算模型和可计算性

编程就是用计算所需要的指令构成一种运算装置,无论我们的程序设计思想以及程序设计语言如何发展和提高,最终我们所使用的底层计算数学模型并没有改变。但高级程序设计语言给我们带来的变革是在其语言环境中构建起了一个全新的,更抽象的虚拟计算模型。Smalltalk语言引入的对象计算模型从根本上改变了以前的传统计算模型,以前的计算模型突出的是顺序计算过程中的机器状态,而现在的对象计算模型突出的对象之间的协作其计算结果由参加计算的所有的对象的状态总体构成。而由于对象本身具有自身状态,我们也可以把一个对象看成是一个小的计算机器。这样,面向对象的计算模型就演变成了许多小的计算机器的合作计算模型。图灵机作为计算领域内的根本计算模型,精确的抓住了计算的要点:什么是可计算的,计算时间和空间存储大小开销有多大。计算模型清楚的界定了可计算性的范围,也就界定了哪些问题是可求解,哪些问题是不可求解的。OOP为程序员提供了一种更加抽象和易于理解的新的计算模型,但其本身并没有超越冯.诺依曼体系所代表的图灵机数学计算模型。所以我们不能期望OOP能帮助我们解决更多的问题,或者减少运算的复杂度。但OOP却能帮助我们用一种更容易被我们所理解和接受的方式去描叙和解决现实问题。

Java基础——Java开发前奏

Java的特点

Java最主要的特点是:一次编译,到处运行(Write Once, Run Anywhere.)。

原理:Java源程序经编译后生成.class字节码文件,.class文件由Java虚拟机(JVM)解释执行。不同的操作系统下,只要有相应的Java字节码解释程序,.class文件就能够运行,这是Java跨平台性的根本。c和java编程与执行的过程如下图所示:

Java的内涵

1、是一种编程语言

2、是一套开发工具

3、是一个运行环境

Java应用平台

1、J2EE(Java 2 Platform Enterprise Edition)——用于企业级应用程序的开发

2、J2SE(Java 2 Platform Standard Edition)——用于普通标准应用程序的开发

3、J2ME(Java 2 Platform Micro Edition)——用于小型消费类电子产品或嵌入式系统的开发

J2SE包括4部分——JVM、JRE、JDK与Java语言。

环境变量的设置

环境变量——在操作系统中定义的变量,可供操作系统上所有的应用程序使用。

1、查看环境变量

a.命令提示行:环境变量的命令——set (环境变量名)

b.窗口方式:我的电脑->属性->高级->环境变量

2、设置path环境变量

path环境变量的作用:设置操作系统寻找和执行应用程序的路径。

JAVA_HOME:C:\Program Files\Java\jdk1.6.0_14

path:%JAVA_HOME%\bin%JAVA_HOME%\jre\bin

3、设置classpath环境变量

classpath环境变量的作用:让Java执行环境找到指定的java程序(.class文件)。

classpath:.%JAVA_HOME%\lib\dt.jar%JAVA_HOME%\lib\tools.jar

注意:a.%JAVA_HOME%前面有“.”,“.”表示当前目录,两个路径之间用“”隔开。

b.设置classpath的路径中不能有空格,也不能有中文字符。

JVM的运行过程

Java反编译工具——JAD、FrontEnd

Java开发工具

1、记事本

注意保存时文件名应为*.java。

2、UltraEdit、EditPlus

使用EditPlus编辑和编译Java程序,需要进行相应配置。选择“工具”->“参数选择”->“工具”->“用户工具”->“添加工具”->“应用程序”。首先设置“javac”的参数,具体如下图,其中“命令”为javac.exe文件的地址。

然后设置“java”的参数,如下图所示,其中“命令”为java.exe文件的路径。

设置好后默认“javac”工具的快捷键为Ctrl+1,“java”工具的快捷键为Ctrl+2。当编辑好Java源程序后,使用Ctrl+1即可对其进行编译,然后按Ctrl+2运行程序。如下图所示:

3、集成开发环境——Eclipse、MyEclipse、JBuilder等。

关于Eclipse和MyEclipse,刚用的时候感觉二者差不多,查了资料才知道Eclipse 是基础,如同操作系统;而MyEclipse是在Eclipse上面运行的程序,不过进行了增强并提供了新功能。

以前用过Microsoft的Visual Studio 2005,个人感觉VS2005是一个功能非常强大的集成开发环境,不过.NET和Java毕竟不是一家人,学Java还是要用Eclipse的。

JDK中的常用包

1、java.lang——包含一些Java语言的核心类,如String、Math、Thread、System、Integer类等。

2、java.awt——包含构成抽象窗口工具集的多个类,用来构建和管理应用程序的图形用户界面(GUI)。

3、java.applet——包含applet运行所需的一些类。

4、java.net——包含执行与网络相关操作的类。

5、java.io——包含能提供多种输入/输出功能的类。

6、java.util——包含一些实用工具类。

Java的命名习惯

1、包名中的字母一律小写。如:xxxyyyzzz。

2、类名、接口名应使用名词,每个单词的首字母大写。如:XxxYyyZzz。

3、方法名,第一个单词小写,后面每个单词的首字母大写。如:xxxYyyZzz。

4、变量名,第一个单词小写,后面每个单词的首字母大写。

5、常量名中的每个字母一律大写。如:XXXYYYZZZ。

Java基础——Java语法基础(1)

Java代码基本格式

Java中所有程序代码都必须存在于一个类中,用class关键字定义类,在class之前可以有一些修饰符。格式如下:

修饰符 class 类名

{

程序代码

}

注:

1、Java是严格区分大小写的。

2、Java程序中一句连续的字符串不能分开在两行中写。

Java程序的注释

Java里的注释有三种类型:

1、单行注释

在注释内容前面加“//”,格式为:

代码  //注释内容

2、多行注释

以斜杠加星号开头,以星号加斜杠结尾。

3、文档注释

以斜杠加两个星号开头,以一个星号加斜杠结束。

用这种方法注释的内容会被解释成程序的正式文档,并能包含进诸如javadoc之类的工具程序生成的文档里,用以说明该程序的层次结构及其方法。

补充:

1、多行注释中可以嵌套“//”注释,但不能嵌套多行注释符号。

2、程序注释一般占程序代码总量的20%-50%,“可读性第一,效率第二”。

Java中的标识符

Java中的包、类、方法、参数、变量的名字,可以由任意顺序的大小写字母、数字、下划线(_)、美元符号($)组成,但不能以数字开头,不能是Java中的保留关键字。

Java的关键字

1、用于类和接口的声明:class, extends, implements, interface

2、包引入和包声明:import, package

3、数据类型:byte, boolean, char, double, int, long, float, short

4、某些数据类型的可选值:flase, ture, null

5、流程控制:break, case, continue, default, do, else, for, if, return, switch, while

6、异常处理:catch, finally, throw, throws, try

7、修饰符:abstract, final, native, private, protected, public, static, synchronilzed, transient, volatitle

8、操作符:instanceof

9、创建对象: new

10、引用:this, supper

11、方法返回类型:void

12、保留字:const, goto

Java中的常量

1、整形常量

十进制

十六进制——以0x或0X开头

八进制——以0开头

长整形——以L(l)结尾

2、浮点数常量

单精度浮点数——后面加f(F)

双精度浮点数——后面加d(D)

注:

a.小数常量的默认类型是double型,所以float类型常量后一定要加f(F)。

b.浮点数常量可以用指数形式表示,如5.022e+23f

3、布尔常量

true或false

4、字符常量

由英文字母、数字、转义序列、特殊字符等的字符所表示,如'a'、'\t'等。

Java中的字符占两个字节,是用Unicode码表示的,也可以使用'\u'加Unicode码值来表示对应字符,如'\u0027'。

常用的转义字符有:

\t——表示接受键盘输入,相当于按了一下回车键

\n——表示换行

\t——表示制表符,相当于Tab键

\b——表示退格键,相当于Back Space键

\'——表示单引号

\”——表示双引号

\\——表示反斜杠“\”

5、字符串常量

字符串常量用双引号括起来。

6、null常量

null常量表示对象的引用为空。

Java的变量类型

基本数据类型之间的转换

1、自动类型转换(隐式类型转换)

条件:

a.两种类型彼此兼容

b.目标类型的取值范围要大于源类型

2、强制类型转换(显示类型转换)

格式:目标类型 常量 = (目标类型)值

注:字符串可以使用加号“+”同其他的数据类型相连而形成一个新的字符串。

变量的作用域

代码块决定了变量的作用域,作用域决定了变量的可见性和存在时间。

局部变量

在一个函数或函数里面的代码块中定义的变量称为局部变量。

局部变量在进行取值操作前必须被初始化或进行过赋值操作。

函数

1、定义函数的格式

返回值类型 函数名(参数类型 形式参数1,参数类型形式参数2,...)

{

程序代码

return 返回值

}

2、函数的重载

函数的重载就是在一个类中可以同时存在一个以上的同名函数,只要它们的参数个数或类型不同即可。

Java基础——Java语法基础(2)——运算符

Java中的运算符

1、算术运算符

a.字符串 + 其他类型 = 字符串

b.如果对负数求余,可以把除数负号忽略不计,如5 % -1 = 1。但如果被除数是负数就另当别论了。

2、赋值运算符

a.在Java中,可以把赋值语句连在一起,如:x = y = z = 5

b.x += y相当于x = x + y

3、比较运算符

a.要注意比较运算符“==”和赋值运算符“=”的区别,特别是布尔型变量进行比较时。

b.可以将比较运算的表达式写为“false == 变量”的形式,以防止误写为赋值运算。

4、逻辑运算符

a.逻辑运算符用于对boolean型结果的表达式进行运算,运算的结果都是boolean型 。

b.“&”和“&&”的区别在于,如果使用前者连接,那么无论任何情况,“&”两边的表达式都会参与计算。如果使用后者连接,当“&&”的左边为false,则将不会计算其右边的表达式。“|”和“||”的区别与“&”和“&&”的区别一样。

5、位运算符

位运算——对数据按二进制位进行移位操作。

适用类型:byte, short, char, int, long

位运算包括:

& 位与

| 位或

^ 位异或

<< 左移,左移n位相当于乘以2的n次方

>> 右移,右移n位相当于除以2的n次方

>>> 无符号右移

注:

a.位运算符也可以与“=”赋值运算符组合产生新的赋值运算符,如:&=, <<=等。

b.移位不会改变变量本身的值,如a>>1在一行语句中单独存在毫无意义。

c.对低于int型的操作数将先自动转换为int型再移位;对int型整数移位a>>b,系统先将b对32取模,得到的结果才是真正移位的位数;对于long型整数移位时则是先将移位位数对64取模。

运算符的优先级

编程技巧:

1、不要在一行中编写太复杂的表达式,可以将其分解为几条语句。

2、多用括号。

Java基础——Java语法基础(3)

程序控制流程

1、顺序结构

按顺序执行

2、if条件语句

a.if...

b.if...else...

可简写为:变量 = 布尔表达式? 语句1:语句2

c.if...else if...else...

3、switch选择语句

switch(表达式)

{

case 取值1:

语句块1

break

...

case 取值n:

语句块n

break

default:

语句块n+1

break

}

4、while循环语句

while(条件表达式)

{

执行语句

}

5、do while循环语句

do

{

执行语句

}while(条件表达式)

6、for循环语句

for(初始化表达式循环条件表达式循环后操作表达式)

{

执行语句

}

7、增强for循环

for (循环变量类型 循环变量名称: 要被遍历的对象)

{

执行语句

}

8、break与continue语句

a.一个无标号的break语句会把控制传回当前最内层循环(while,do,for,switch)的下一条语句。

b.无标号的continue语句的作用是跳过当前循环的剩余语句块,接着执行下一次循环。

数组

1、数组的定义

如:int[] x = new int[100]

或int x[] = new int[100]

2、数组的静态初始化

如:int[] aa = new int[] {3,4,5}

3、多维数据

如:

int[][] xx = new int[3][]

xx[0] = new int[3]

xx[1] = new int[2]

4、一些与数组相关的函数

a. System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length)复制数组,将源数组srcPos开始的length个元素从目标数组的destPos位置开始存储。

b. Array.sort()数组升序排序