程序员
4.3 数字 为了处理数值类型,你可以使用Number类。这个Number类是所有在JAVA平台中所有数字类的父类。它的子类包括Float、Interger等等。 本节教程将讨论java.lang和它的子类中的Number类。特别地,这节教程要讨论为什么你需要这些类,并指出通用的方法和类变量,以及向你介绍如何将实例转换为字符串。 此外,这节教程还讨论你需要的其它类来处理数字。比如,如果你需要以某个特殊格式来显示数字的时候,你可以使用在java.test中的NumberFormat和DecimalFormat类来格式化它。同时,java.lang中的Math包含了类方法来执行数学函数。这个类还有用于三角函数、指数函数等等的方法。 如图18所示: (图18) 数字类包含: Number :这个抽象类Number是Byte、Double、Float、Integer、Long和Short的父类。Number的子类必须提供将数值转换为byte、double、float、int、long以及short的方法。 Byte:这个类是Number的子类,它是用于字节数值的标准wrapper。 Double:这个Double类在对象中包装了原始类型double。Double类的对象包含单一类型(double)的对象。另外,这个类提供了几个用于将double转换为String或者将String转换为double的方法。 Float :这个Float类在对象中包装了原始类型Float。Float类的对象包含单一类型(Float)的对象。另外,这个类提供了几个用于将Float转换为String或者将String转换为Float的方法。 Integer:这个Integer类在对象中包装了原始类型Integer。Integer类的对象包含单一类型(Integer)的对象。另外,这个类提供了几个用于将Integer转换为String或者将String转换为Integer的方法。 Long :这个Long类在对象中包装了原始类型Long。Long类的对象包含单一类型(Long)的对象。另外,这个类提供了几个用于将Long转换为String或者将String转换为Long的方法。 Short:这个类是用于short数值的标准wrapper。 8. BigDecimal:不可变的、任意精度的有符号的十进制数字。BigDecimal包含了任意精度的整型数和非负的32位的整型数,BigDecimal 提供了用于基本算术运算、比较、格式转换等等的操作。这个BigDecimal类给了用户对舍入行为的完全控制,并且强迫用户为舍弃精度的操作显性指定一个舍入行为。基于这个目的有八种舍入模式。对BigDecimal有两种类型的操作:比例/舍入操作和十进制点移动操作。比例/舍入操作返回一个BigDecimal,它的数值大约或者精确地等于运算对象,但是它的数值范围要指定,也就是说,它们可以对它的数值最小的影响来增加或者减少数字的精度。十进制点移动操作(movePointLeft和movePointRight)返回一个由运算对象创建的BigDecima,它是通过在指定方向和指定距离来移动十进制点的。为了达到简短和清晰的目的,伪代码用在了BigDecimal方法的描述中。比如伪代码表达式(i j)就代表了“BigDecimal的数值是由BigDecimal i加上BigDecimal j的数值”。而伪代码表达式(i==j)代表“当且仅当BigDecimal i的数值与BigDecimal j相同的时候才为true”。其它的伪代码表达式也有类似的解释。 BigInteger:不可变任意精度的整型数。BigInteger为所有的Java原始整型操作以及所有在java.lang.Math中的相关方法提供相似的操作。另外BigInteger伪模数运算、GCD计算、位操作等等提供了运算。算术运算的语义模仿了定义在JAVA语言规范中的Java的整型算术运算。比如,如果除数为0就会导致ArithmeticException(算术异常)等等。所有在规范中的溢出都将被忽略,因为BigIntegers将尽量适应运算结果的需要。 而移位操作扩展了Java的移位操作,它允许负方向的移位。以负的位距来往右移就相当于往左移位。而无符号的右移运算符(>>>)这里就不再使用。 而按位逻辑操作跟Java的按位操作是相似的。比较运算执行有符号的整型比较,它跟Java的是相似的。 模数算术运算提供计算余数、执行乘幂等方法。这些方法总是返回一个非零的结果(介于0到-1之间)。为了简洁和清晰的目的,伪代码也用在BigInteger方法中。这个伪代码表达式(i j)代表了“等于BigInteger i加上BigInteger j的BigInteger数值”。而伪代码表达式(i==j)代表了“当且仅当BigInteger i等于BigInteger j的时候才返回true”。 其它的数据类型: Boolean :这个Boolean类在对象中包装了原始类型Boolean。Boolean类的对象包含单一类型(double)的对象。另外,这个类提供了几个用于将Boolean转换为String或者将String转换为Boolean的方法。 Character :这个Character类在对象中包装了原始类型Character。Character类的对象包含单一类型(Character)的对象。另外,这个类提供了几个用于将字符由小写转换为大写或者由大写转换为小写的方法。 Void:这个Void类是一个占位符类,它保留对代表原始JAVA类void的引用。 非基本算术类型Math: 这个Math类包含了用于执行数值操作的方法,比如初步的指数、对数、平反根以及三角函数。 不象StrictMath类中的有些数值函数,这个Math类的所有函数不是定义为返回bit-for-bit相同的结果。这允许更好的执行,因为严格的再现情已经不需要了。 缺省地,许多Math函数简单代表了在StrictMath中的等价函数。代码发生器支持使用特殊平台的本地库或者微处理器指令以提供性能更高的Math函数实行。这样高性能的执行必须符合Math的规范。 4.4 数组 在任何的编程语言中,数组都是一个重要的数据结构。数组是一个固定长度的结构,它存储多个相同类型的数值。你可以在数组中集合相同类型的数值。数组直接被JAVA编程语言所支持,所以没有一个数组类。数组是一个Object类的一个不明显的扩展,所以你可以指定一个数组给一个类型定义为Object的变量。 JAVA平台集合了它的类到功能包中。不是编写你自己的类,你可以使用有平台提供的类。这节教程中要讨论的绝大多数的类都是java.lang包的成员函数。所有java.lang中的类对你的程序都是有效的。 数组的长度在数组创建的时候就已经确定。一旦创建以后,数组就有了固定长度的结构,如图19所示: 图19) 数组元素就是数组中的一个数值,可以通过数组中的位置来访问它。 如果你想在一个结构中存储不同类型的数据,或者如果你需要一个长度可以动态改变的结构,可以使用Collection,比如Vector而不用数组。 本教程中将讨论以下的几个方法: 声明一个变量来引用一个数组 创建一个数组 访问数组元素 获得数组的大小 数组初始化程序 4.4.1 创建和使用数组合 (1)声明一个变量来引用一个数组 以下的代码是声明一个数组变量: int[] anArray; // 声明整型的数组 象声明其它类型的变量,一个数组声明有两个组件:数组的类型和数组的名字。数组的类型是这样来写的type[],其中type可以是float、boolean、Object、String等,而[]代表了这是一个数组。这里记住在数组中的所有元素都是相同类型的。上面的例程中使用了int[],所以数组anArray就将容纳整型数据了。以下是声明其它类型的数组: float[] anArrayOfFloats; boolean[] anArrayOfBooleans; Object[] anArrayOfObjects; String[] anArrayOfStrings; 就象声明其它类型的变量,声明数组变量也没有为数组元素分配任何内存。所以必须在引用数组之前被数组赋值 (2)创建一个数组 你可以使用JAVA的new运算符来创建一个数组。下面的语句是为10个整型元素分配一个数组内存: anArray = new int[10]; // create an array of integers 总得说来,当创建数组的时候,你可以使用new操作符,后面跟着数组元素的数据类型然后就是用方括号[和]括起来的元素的数目,格式如下所示: new elementType[arraySize] 如果在上面的例程中new语句没有的话,编译器将打印除一个如下的错误是的编译发生错误: ArrayDemo.java:4: Variable anArray may not have been initialized(变量anArray 可能还没有初始化。) (3)访问数组元素 既然已经给数组分配了内存,我们来为数组元素赋值吧: for (int i = 0; i < anArray.length; i++) { anArray[i] = i; System.out.print(anArray[i] + " "); } 这部分的代码给出了怎样引用一个数组元素,或者示为它赋予一个数值,或者访问数值。在方括号之间的数值指示了要访问的元素的索引。在JAVA中,数组的索引是从0开始的并且以-1结束。 (4)获得数组的大小 为了获得数组的大小,你可以使用下面的代码: arrayname.length 这里还提醒一下:JAVA的新手可能会在length后面加一个圆括号(和)。这样是否错误的,因为length不是一个方法。Length是由JAVA平台为所有数组提供的一个属性。 在上面的例程中的for循环在anArray的每一个元素进行循环,并给每个元素赋值。这个for循环使用了anArray.length来决定什么时候终止循环。 (5)数组初始化程序 JAVA编程语言为创建和初始化数组提供了简捷的语法。一下是这个语法的例子: boolean[] answers = { true, false, true, true, false }; 数组的length(长度)是由大括号{和}之间的数值的数目决定的。 4.4.2 对象的数组 数组可以保留引用类型。你可以用创建原始类型数组的方法来创建这样一个数组。以下是一个小的程序ArrayOfStringsDemo,它创建了一个数组包含了三个String对象并且将这三个字符串以小写字母的形式打印出来: public class ArrayOfStringsDemo { public static void |