数字
通常情况下,当我们处理数字时,使用原始数据类型,如 byte,int,long,double 等。
示例
1
2
3
|
int i = 5000 ; float gpa = 13.65 ; byte mask = 0xaf ; |
然而,在开发中,我们会遇到需要使用对象而不是原始数据类型的情况。为了实现这个, Java 为每个原始数据类型提供包装类。
所有的包装类 (Integer, Long, Byte, Double, Float, Short) 是抽象类 Number 的子类。
这种包装是由编译器处理,这个过程称为装箱。因此,当一个原始数据类型被使用,当需要一个对象时,编译器将原始数据放入其包装类。同样地,编译器也能将对象取出返回到原始数据类型。Number 是 java.lang 包的一部分。
这里是装箱和拆箱的一个例子:
1
2
3
4
5
6
7
8
|
public class Test{ public static void main(String args[]){ Integer x = 5 ; // boxes int to an Integer object x = x + 10 ; // unboxes the Integer to a int System.out.println(x); } } |
这将产生以下结果:
当 x 被分配整数值,则编译器将整数放入箱中,因为 x 为整数对象。然后,x 被拆箱,以便它们可以被添加为整数。
Number 方法
以下是对 Number 类实现的所有子类中实现的实例方法的列表:
SN |
方法描述 |
---|---|
1 |
xxxValue() |
2 |
compareTo() |
3 |
equals() |
4 |
valueOf() |
5 |
toString() |
6 |
parseInt() |
7 |
abs() |
8 |
ceil() |
9 |
floor() |
10 |
rint() |
11 |
round() |
12 |
min() |
13 |
max() |
14 |
exp() |
15 |
log() |
16 |
pow() |
17 |
sqrt() |
18 |
sin() |
19 |
cos() |
20 |
tan() |
21 |
asin() |
22 |
acos() |
23 |
atan() |
24 |
atan2() |
25 |
toDegrees() |
26 |
toRadians() |
27 |
random() |
数组
Java 提供了一个数据结构:数组,用于存储相同类型的元素的一个固定大小的连续集合。数组是用于存储数据的集合,但往往将数组认为是相同类型的变量的集合。
跟声明单个变量相反,如 number0, number1, ... number99, 声明一个数组变量,如数字和使用 numbers[0], numbers[1] ..., numbers[99] 来表示各个变量。
此次教程将介绍如何使用索引变量声明数组变量,创建数组,并处理数组。
声明数组变量
要使用一个程序的数组,必须声明一个变量来引用数组,必须指定数组的变量可以引用的类型。下面是来声明一个数组变量的语法:
1
|
dataType[] arrayRefVar; // preferred way. |
or
1
|
dataType arrayRefVar[]; // works but not preferred way. |
注 风格 dataType[] arrayRefVar 是首选的。风格 dataType arrayRefVar[] 来自于 C/C++ 语言, 方便Java 继承 C/C++ 的编程风格。
示例
下面的代码片段是这种语法的例子:
1
|
double [] myList; // preferred way. |
or
1
|
double myList[]; // works but not preferred way. |
创建数组
可以通过使用 new 运算符使用以下语法创建一个数组:
1
|
arrayRefVar = new dataType[arraySize]; |
上面的语句做了两件事:
-
它创建了一个使用 new dataType[arraySize] 的数组;
-
它将新创建的数组引用分配给变量 arrayRefVar。
声明数组变量,建立一个数组,并分配给变量数组引用可以在一个语句中组合使用,如下所示:
1
|
dataType[] arrayRefVar = new dataType[arraySize]; |
另外,可以创建数组,如下所示:
1
|
dataType[] arrayRefVar = {value0, value1, ..., valuek}; |
数组元素通过索引访问。数组的下标是从0开始的,也就是说,它们从0开始到 arrayRefVar.length-1。
示例
下面的语句声明一个数组变量 myList,创建 double 类型的10个元素的数组,并把它的引用分配到 myList :
1
|
double [] myList = new double [ 10 ]; |
以下图片代表数组 myList。在这里,myList 有10个 double 值,索引是从0到9。
处理数组
当处理数组元素时,经常使用的是 loop 循环或 foreach 循环,因为一个数组中所有的元素是相同类型的并且数组的大小是已知的。
示例
下面是一个演示如何创建,初始化和处理数组的完整例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public class TestArray { public static void main(String[] args) { double [] myList = { 1.9 , 2.9 , 3.4 , 3.5 }; // Print all the array elements for ( int i = 0 ; i < myList.length; i++) { System.out.println(myList[i] + " " ); } // Summing all elements double total = 0 ; for ( int i = 0 ; i < myList.length; i++) { total += myList[i]; } System.out.println( "Total is " + total); // Finding the largest element double max = myList[ 0 ]; for ( int i = 1 ; i < myList.length; i++) { if (myList[i] > max) max = myList[i]; } System.out.println( "Max is " + max); } } |
这将产生以下结果:
1
2
3
4
5
6
|
1.9 2.9 3.4 3.5 Total is 11.7 Max is 3.5 |
foreach 循环
JDK 1.5 引入了一个新的 for 循环被称为 foreach 循环或增强的 for 循环,它无需使用一个索引变量来完整的遍历数组。
示例
下面的代码显示数组 myList 中的所有元素:
1
2
3
4
5
6
7
8
9
10
11
|
public class TestArray { public static void main(String[] args) { double [] myList = { 1.9 , 2.9 , 3.4 , 3.5 }; // Print all the array elements for ( double element: myList) { System.out.println(element); } } } |
这将产生以下结果:
1
2
3
4
|
1.9 2.9 3.4 3.5 |
将数组传递给方法
正如传递基本类型值的方法,也可以将数组传递给方法。例如,下面的方法显示在一个 int 数组中的元素:
1
2
3
4
5
|
public static void printArray( int [] array) { for ( int i = 0 ; i < array.length; i++) { System.out.print(array[i] + " " ); } } |
你可以通过传递数组调用它。例如,下面的语句调用方法 PrintArray 显示3,1,2,6,4,2:
1
|
printArray( new int []{ 3 , 1 , 2 , 6 , 4 , 2 }); |
从一个方法返回一个数组
一个方法也可以返回一个数组。例如,下面所示的方法返回一个数组,它是另一个数组的反转:
1
2
3
4
5
6
7
8
|
public static int [] reverse( int [] list) { int [] result = new int [list.length]; for ( int i = 0 , j = result.length - 1 ; i < list.length; i++, j--) { result[j] = list[i]; } return result; } |
Arrays 类
java.util.Arrays 中的类包含各种静态方法用于排序和搜索数组、数组的比较和填充数组元素。这些方法为所有基本类型所重载。
SN |
方法和描述 |
---|---|
1 |
public static int binarySearch (Object[] a, Object key) |
2 |
public static boolean equals (long[] a, long[] a2) |
3 |
public static void fill(int[] a, int val) |
4 |
public static void sort(Object[] a) |