控制流程
块作用域
块(即复合语句)是指由一对大括号括起来的若干条简单的 Java 语句。块确定了变量的作用域。
- 块里面可以嵌套另一个块
- 不能在嵌套的两个块中声明同名变量
条件、循环、多重选择
- if 语句、while 循环、do/while 循环、for 循环、switch 语句与C++用法相同。
- switch语句中 case 标签可以是:
①类型为char、byte、short、int的常量表达式。
②枚举常量。
③从 Java SE 7开始,case标签还可以是字符串字面量。
中断控制流程语句break、Continue
break
一种是正常的控制程序从循环中跳出。
另一种是带标签的break语句。
- 请注意,标签必须放在希望跳出的最外层循环之前, 并且必须紧跟一个冒号。
Scanner in = new Scanner(System.in);
int n;
read_data:
while (. ..)
// this loop statement is tagged with the label
for (...)
// this inner loop is not labeled
{
Systen.out.print("Enter a number >= 0: ");
n = in.nextInt();
if (n < 0) // should never happen-can’t go on
break read_data;
// break out of readjata loop
...
}
}
- Tips:break只能跳出语句块而不能跳入语句块。
continue
continue语句越过了当前循环体的剩余部分,立刻跳到循环首部。
同样有带标签的continue语句。
大数值
如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math 包中的两个很有用的类:BigInteger 和 BigDecimal。
可以使用静态的 valueOf 方法可以将普通的数值转换为大数值:Biglnteger a = Biglnteger.valueOf(100);
但遗憾的是不能使用熟悉的算术运算符(如:+ 和 * )处理大数值。而需要使用大数值类中的 add 和 multiply 方法。
Biglnteger c = a.add(b); // c = a + b
Biglnteger d = c.multiply(b.add(Biglnteger.valueOf(2)));
// d = c * (b + 2)
- Java没有重载运算符的功能
Java的BigInteger类中常用的方法
BigInteger add(BigInteger other)
BigInteger subtract(BigInteger other)
BigInteger multiply(BigInteger other)
BigInteger divide(BigInteger other)
-
BigInteger mod(BigInteger other)
返冋这个大整数和另一个大整数 other 的和、差、 积、 商以及余数。 -
int compareTo(BigInteger other)
如果这个大整数与另一个大整数 other 相等,返回 0; 如果这个大整数小于另一个大整 数 other, 返回负数;否则,返回正数。 -
static BigInteger valueOf(long x)
返回值等于 x 的大整数。 BigDecimal add(BigDecimal other)
BigDecimal subtract(BigDecimal other)
BigDecimal multipiy(BigDecimal other)
-
BigDecimal divide(BigDecimal other RoundingMode mode) 5.0
返回这个大实数与另一个大实数 other 的和、 差、 积、 商。
要想计算商,必须给出舍入方式(rounding mode)。 int compareTo(BigDecimal other)
- 如果这个大实数与另一个大实数相等,返回 0 ; 如果这个大实数小于另一个大实数,返回负数;否则,返回正数。
static BigDecimal valueOf(1ong x)
-
static BigDecimal valueOf(1ong x,int scale)
返回值为 x 或 x / 10^scale 的一个大实数。
数组
数组的声明:数据元素类型紧跟 [ ] + 数组变量的名字。例: int[] a;
但这样并没有将a初始化为一个真正的数组,应该用new运算符创建数组: int[] a=new int[100]
- 数组的长度不要求是常量,可以是n。
- 也可以用
int a[];
的形式声明,但通常用上面那种。 - 创建一个数字数组时,所有元素都初始化为 0。boolean 数组的元素会初始化为false。字符数组的元素则初始化为一个特殊值 null,。
for each循环
- for each 循环格式:
for (variable : collection) statement
例如:打印数组 a 的每一个元素,一个元素占一行
for (int element : a)
System.out.println(element)
应该读作循环a中的每一个元素(for each element in a)。
- 与传统的for循环相比,for each循环不用考虑下标,在想对数组的全部内容进行处理时,for each更加简洁,但当只想用到数组中的一部分时,还是需要用到传统for循环。
- 有个更加简洁的办法打印数组内容: 即利用 Arrays 类的 toString 方法。
调用 Arrays.toString(a),返回一个包含数组元素的字符串,这些元素被放置在括号内,并用逗号分隔,例如,“ [2,3,5,7,11,13] ”、要想打印这个数组,可以调用System.out.println(Arrays.toString(a));
数组初始化以及匿名数组
1、Java中创建数组并赋初值的办法:int[] a={17,19,23,29,31,37};
注意:这种方法中没有用到new。
2、Java也支持匿名数组,即不需要给数组设置变量名:new int[] {17,19,23,29,31,37};
这种方法创建的数组内容为括号中的内容,长度为元素的个数,也可以用来给已定义过的变量重新赋值:a=new int[] {17,19,23,29,31,37};
- Java中允许数组长度为0,例:
new int[0];
- 注意:数组的长度为0与null不同。
数组拷贝
在 Java中,允许将一个数组变量拷贝给另一个数组变量。这时,两个变量将引用同一个数组:
int[] luckyNumbers = smallPrimes;
luckyNumbers[5] = 12; // now smallPrimes[5] is also 12
如果希望将 一个数组的所有值拷贝到一个新的数组中去, 就要使用 Arrays 类的 copyOf方法:int[] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers, luckyNumbers.length);
第 2 个参数是新数组的长度。这个方法通常用来增加数组的大小:luckyNumbers = Arrays.copyOf(luckyNumbers, 2 * luckyNumbers.length);
- 如果数组元素是数值型,那么多余的元素将被赋值为 0 ; 如果数组元素是布尔型,则将赋值为 false。相反,如果长度小于原始数组的长度,则只拷贝最前面的数据元素。
数组排序
要想对数值型数组进行排序,可以使用 Arrays类中的 sort 方法:
int[] a = new int[10000];
...
Arrays.sort(a)
这是一种效率比较高的方法。
多维数组
在 Java中,声明一个二维数组相当简单。例如:double[][] balances;
与一维数组一样,在调用 new 对多维数组进行初始化之前不能使用它。在这里可以这样初始化:balances = new double[NYEARS][NRATES]:
另外,如果知道数组元素,就可以不调用 new,而直接使用简化的书写形式对多维数组进行初始化。例如:
int[][] magicSquare = { {16, 3, 2, 13},
{5, 10, 11, 8},
{9, 6, 7, 12},
{4, 15, 14, 1} } ;
可以利用循环遍历每行每列。
- 要想快速地打印一个二维数组的数据元素列表,可以调用:
System.out.println(Arrays.deepToString(a));
输出格式为: [[16, 8, 2, 13], [5, 10, 11, 8], [9, 6, 7, 12], [4, 15, 14, 1 ]]
不规则数组
Java中其实没有二维数组,我们可以将其理解为“数组的数组”,例如:balances[10][6] 实际上是一个包含10个元素的数组,而每个元素又是一个由6个元素组成的数组。
由于可以单独地存取数组的某一行, 所以可以让两行交换。
double[] temp = balances[i];
balances[i] = balances[i + 1];
balances[i + 1] = temp;
利用这个特点,Java中也可以构造不规则数组,即每一行的长度可以不同。
要想创建一个不规则的数组, 首先需要分配一个具有所含行数的数组。int[][] odds = new int[NMAX + 1 ][];
接下来, 分配这些行。
for (int n = 0; n <= NMAX; n++)
odds[n] = new int[n + 1];