第三章 流程控制与数组
3.1 顺序结构
从上到下逐行地执行,中间没有任何判断和跳转。
3.2 分支结构
3.2.1 if条件语句
//第一种
if ( logic expression )
{
statement...
}
//第二种
if ( logic expression )
{
statement...
}
else
{
statement...
}
//第三种
if( logic expression )
{
statement...
}
else if ( logic expression )
{
statement...
}
else
{
statement...
}
3.2.2 增强后的switch语句
public class SwitchTest {
public static void main(String[] args) {
//声明变量score,并为其赋值为‘C’
char score = 'C';
//执行switch分支语句
switch (score)
{
case 'A':
System.out.println("优秀");
break;
case 'B':
System.out.println("良好");
break;
case 'C':
System.out.println("中");
break;
case 'D':
System.out.println("及格");
break;
case 'F':
System.out.println("不及格");
break;
default:
System.out.println("成绩输入错误");
}
}
}
3.3 循环结构
3.3.1 while循环语句
[init_statement]
while(test_expression){
statement;
[iterattion_statement]
}
3.3.2 do while循环语句
[init_statement]
do
{
statement;
[init_statment]
}while(test_expression);
3.3.3 for循环
for([init_statement]; [test_expression]; [interation_statement]){
statement
}
3.3.4 嵌套循环
3.4 控制循环结构
3.4.1 使用break结束循环
3.4.2 使用continue忽略本次循环剩下语句
3.4.3 使用return结束方法
3.5 数组类型
3.5.1 理解数组:数组也是一种类型
Java的数组要求所有的数组元素具有相同的数据类型。
3.5.2 定义数组
type[] arrayName;
type arrayName[];
(定义数组时不能指定数组的长度)
3.5.3 数组的初始化
1.静态初始化
arrayName = new type[]{element1, element2, element3, element4 ... }
或:
type[] arrayName = new type[]{element1, element2, elemnnt3, element4 ... }
2.动态初始化
arrayName = new type[length];
例:
//数组的定义和初始化同时完成,使用动态初始化语法
int[] price = new int[5];
//数组的定义和初始化同时完成,初始化数组时元素的类型时定义数组时元素类型的子类
Object[] books = new String[4];
指定初始值时,系统按如下规则分配初始值。
- 数组元素的类型是基本类型中的整数类型(byte、short、int和long),则数组元素的值是0。
- 数组元素的类型是基本类型中的浮点类型(float、double),则数组元素的值是0.0。
- 数组元素的类型是基本类型中的字符类型(char),则数组元素的值是‘\u0000’。
- 数组元素的类型是基本类型中的布尔类型(boolean),则数组元素的值是false。
- 数组元素的类型是引用类型(类、接口和数组),则数组元素的值是null。
(不要同时使用静态初始化和动态初始化,也就是说,不要在进行数组初始化时,既指定数组的长度,也为每个数组元素分配初始值。)
3.5.4 使用数组
数组最常见的用法就是访问数组元素,包括对数组元素进行赋值和取出数组元素的值。
3.5.5 foreach循环
foreach循环的语法格式如下:
for( type variableName : array | collection )
{
// variableName 自动迭代访问每个元素...
}
3.6 深入数组
3.6.1 没有多维数组
Java语言里提供了支持多维数组的语法。但是本书还是想说,没有多维数组——如果从数组底层的运行机制上来看。
如果把int这个类型扩大到Java的所有类型(不包括数组类型),则出现了定义二维数组的语法:
type[][] arrayName;
Java语言采用上面的语法格式来定义二维数组,但它的本质还是一维数组,只是其数组元素也是引用,数组元素里保存的引用指向一维数组。
初始化多维数组时,可以只指定最左边维的大小;当然也可以一次指定每一维的大小。
3.6.2 Java8增强的工具类:Arrays
Java提供的Arrays类里包含的一些static修饰的方法可以直接操作数组,这个Arrays类里面包含了如下几个static修饰的方法(static修饰的方法可以直接通过类名调用)。
- int binarySearch(type[] a, type key):使用二分法查询key元素值在a数组中出现的索引;如果a数组不包含key元素值,则返回负数。调用该方法时要求数组元素已经按升序排列,这样才能得到正确结果。
- int binarySearch(type[] a, int fromIndex, int toIndex, type key):这个方法与前一个方法类似,但它只搜索a数组中的fromIndex到toIndex索引的元素。调用该方法时要求数组中元素已经按升序排序,这样才能得到正确结果。
- type[] copyOf(type[] original, int length): 这个方法将会把original数组复制成一个新数组,其中length是新数组的长度。如果length小于original数组的长度,则新数组就是原数组的前面length个元素;如果length大于original数组的长度,则新数组的前面元素就是原数组的所有元素,后面补充0(数值类型)、false(布尔类型)或者null(引用类型)。
- type[] copyOfRange(type[] original, int from, int to):这个方法与前面方法相似,但这个方法只复制original数组的from索引到to索引的元素。
- boolean equals(type[] a, type[] a2):如果a数组和a2数组的长度相等,而且a数组和a2数组的数组元素也一一相同,该方法将返回true。
- void fill(type[] a, type val):该方法将会把a数组的所有元素都赋值为val。
- void fill(type[] a, int fromIndex, int toIndex, type val):该方法与前一个方法的作用相同,区别只是该方法仅仅将a数组的fromIndex到toIndex索引的数组元素赋值为val。
- void sort(type[] a):该方法对a数组的数组元素进行排序。
- void sort(type[] a, int fromIndex, int toIndex):该方法与前一个方法相似,区别是该方法仅仅对fromIndex到toIndex索引的元素进行排序。
- String toString(type[] a):该方法将一个数组转换成一个字符串。该方法按顺序把多个数组元素连缀在一起,多个数组元素使用英文逗号(,)和空格隔开。
(要导入java.util.Arrays类)
除此之外,在System类里也包含一个static void arraycopy(Object src, int srcPos, Object dest, int destPos, int lenght)方法,该方法可以将src数组里的元素值赋值给dest数组的元素。
Java8为Arrays类添加的工具方法。
- void parallelPrefix(xxx[] array, XxxBinaryOperator op):该方法使用op参数指定的计算公式计算得到的结果作为新的元素。op计算公式包括left、right连个形参,其中left代表数组中前一个索引处的元素,right代表数组中当前索引处的元素,当计算第一个新数组元素时,left的值默认为1。
- void parallelPrefix(xxx[] array, int fromIndex, int toIndex, XxxBinaryOperator op):该方法与上一个方法相似,区别是该方法仅重新计算FromIndex到toIndex索引的元素。
- void setAll(xxx[] array, IntToXxxFunction generator):该方法使用指定的生成器(generator)为所有数组元素设置值,该生成器控制数组元素的值的生成算法。
- void paralllelSetAll(xxx[] array, IntToXxxFunction generation):该方法的功能与上一个方法相同,只是该方法增加了并行能力,可以利用多CPU并行来提高性能。
- void parallelSort(xxx[] a):该方法的功能与Arrays类以前就有的sort()方法相同,只是该方法增加了并行能力,可以利用多CPU并行来提高性能。
- void parallelSort(xxx[] a, int fromIndex, int toIndex):该方法与上一个方法相似,区别是该方法仅对fromIndex到toIndex索引的元素进行排序。
- Spliterator.OfXxx spliterator(xxx[] array):将该数组的所有元素转换成对应的Spliterator对象。
- Spliterator.OfXxx spliterator(xxx[] array, int startInclusive, int endExclusive):该方法与上一个方法相似,区别是该方法进准换startInclusive到endExclusive索引的元素。
- XxxStream stream(xxx[] array):该方法将数组转换为Stream, Stream是Java8新增的流式编程的API。
- XxxStream stream(xxx[] array, int startInclusive, int endExclusive):该方法与上一个方法相似,区别是该方法仅将fromIndex到toIndex索引的元素转换为Stream。