Java语言有三种控制结构:顺序结构、分支结构、循环结构
1、顺序结构
顺序结构就是程序从上而下逐行地执行,中间没有任何判断和跳转
2、分支结构
- if…else…
- switch
控制表达式只允许byte、short、char、int、String和枚举类型
swicth(expression){
case condition1:{
statement(s)
break;
}
case condition2:{
statement(s)
break;
}
...
default:{
statement(s)
}
}
// 注意每个case中需要带有break;
switch中的每个case中都需要带有break,因为switch语句遇到相等的值,程序就开始执行这个case标签后的代码,不再判断与后面case,default标签的条件是否匹配,除非遇到break;才会结束
3、循环结构
- 循环语句包含的4个部分:
初始化语句init_statement
循环条件test_expression
循环体body_statement
迭代语句iteration_statement
- while
[init_statement]
while(test_expression){
statement;
[iteration_statement]
}
例:
int count = 0;
while(count<10){
System.out.println(count);
count++;
}
- do…while
// 循环体至少执行一次
[init_statement]
do{
statement;
[iteration_statement]
}while(test_expression);
例:
int count = 0;
do{
System.out.println(count);
count++;
}while(count<10);
- for循环
for([init_statement];test_expression;[iteration_statement]){
statement;
}
- 嵌套循环,就是循环中套有循环
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
System.out.println(i+j);
}
}
4、控制循环结构
- break
结束当前循环
- break outer
// 结束至指定循环
outer:
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
System.out.println(i+j);
if(j==1){
break outer;
}
}
}
- continue
// 忽略本次循环
for(int i=0;i<5;i++){
if(i==2){
continue;
System.out.println(i);
}
}
- continue outer类似break outer
- return 全部退出
5、数组类型
数组用于存储多个数据,每个数组元素存放一个数据,通常可通过数组元素的索引来访问数组元素,包括为数组元素赋值和取出数组元素的值
- 理解数组
Java语言中数组必须先初始化,然后才可以使用。所谓初始化,就是为数组元素分配内存空间,并为每个数组元素赋初始值。只要为数组元素分配了内存空间,数组元素就具有了初始值。初始值的获得由两种形式:一种是由系统自动分配,另一种由程序员指定。
- 定义数组
String[] strArray(推荐)
String strArray[]
- 数组静态初始化:初始化时由程序员显示指定每个数组元素的初始值,由系统决定数组长度。
arrayName=new type[ ] {element1,element2,element3.....};
初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度
int[] intArray = new int[]{5,6,7,8}
int[] intArray = {5,6,7,8}
- 数组动态初始化 :执行动态初始化时,程序员只需要指定数组的长度,即为每个数组元素指定所需的内存空间,系统将负责为这些数组元素分配初始值。
arrayName=new type[length];
int[] intArray = new int[4];
初始值如下:
整型(byte、short、int和long),初始值是0
浮点(float、double),初始值是0.0
字符(char),初始值是'\u0000'
布尔(boolean),初始值是false
引用类型(类、接口和数组),初始值是null
- 使用数组
数组下标从0开始,intArray[0]是第一个元素
可以使用for或foreach遍历数组
- 内存中的数组
数组变量只是一个引用,实际的数组对象被存储在堆(heap)中
如果引用的对象是局部变量,那么它被存储在栈(stack)中
- 二维数组就是每个元素都是一个数组
String[][] strArray = new String[][]{new String[3],new String[]{"hello"}}
- 操作数组的常用API:
Java提供了操作数组的工具类:java.util.Arrays;Arrays类包含的一些static修饰的方法可以直接操作手数组。
查找元素出现索引(要求元素已经升序排序):
int Arrays.binarySearch(type[] a,type key)
如果数组不包含key,则返回负数
在指定范围查找元素出现索引(要求元素已经升序排序):
int Arrays.binarySearch(type[] a,int fromIndex,int toIndex,type key)
复制数组,如果小于原来长度则取前面的元素,如果大于则多出来的补默认值
type[] Arrays.copyOf(type[] original,int length)
在指定范围复制数组,与上面类似
type[] Arrays.copyOfRange(type[] original,int from,int to)
对比数组,如果长度相等且数组元素也一一相同,返回true
boolean Arrays.equals(type[] a,type[] b)
数组赋值,把数组元素全部复制为val
void Arrays.fill(type[] a,type val)
在指定范围数组赋值
void Arrays.fill(type[] a,int fromIndex,int toIndex,type val)
排序
void Arrays.sort(type[] a)
在指定范围数组排序
void Arrays.sort(type[] a,int fromIndex,int toIndex)
转换成字符串,按顺序把多个数组元素连缀在一起,多个数组元素使用英文逗号和空格隔开
String Arrays.toString(type[] a)
Java8新增操作数组API
Java8增强了Arrays类的功能,为Arrays类增加了一些工具方法,这些工具方法可以充分利用多CPU并行的能力来提高设值、排序的性能。
int[] arr1 = new int[]{3,-4,25,16,30,18};
// 并发排序,性能更强
Arrays.parallelSort(arr1);
int[] arr2 = new int[]{3,-4,25,16,30,18};
// 前一个元素乘积和后一个元素相乘,第一个元素时乘以1
{1*3=3,3*-4=-12,-12*25=-300,-300*16=-48000,-48000*30=-144000,-144000*18=-2592000}
Arrays.parallelPrefix(arr2,new IntBinaryOperator(){
public int applyAsInt(int left,int right){
return left*right;
}
});
int[] arr3 = new int[5];
// 与索引值相乘
{0,5,10,15,20}
Arrays.parallelSetAll(arr3,new IntUnaryOperator(){
public int applyAsInt(int operand){
return operand*5;
}
});