001.Java基础 ——程序流程控制和数组基础
顺序结构
程序从上到下逐行地执行,中间没有任何判断和跳转。
分支结构
根据条件,选择性地执行某段代码。 有if…else和switch两种分支语句。
循环结构
根据循环条件,重复性的执行某段代码。
有while、do…while、for三种循环语句。
注:JDK1.5提供了foreach循环,方便的遍历集合、数组元素。
// 1.导包 import java.util.Scanner; class TestScanner{ public static void main(String[] agrs){ // 2.创建一个Scanner类的对象 Scanner s = new Scanner(System.in); System.out.println("请输入一个字符串"); // 3.调用此对象的相应的方法,完成键盘输入的值的获取 //=> next():表示从键盘获取一个字符串 String str = s.next(); System.out.println(str); } }
条件语句总结:
1.条件判断之间可以嵌套
2.①如果多个条件之间是“互斥”关系(即条件之间没有联系,没有公共部分),多个条件语句上下的顺序是自由的
②如果多个条件之间存在“包含”关系,要求范围小的要写在范围大的上面
说明:如果 if-else if-else条件的执行语句块{}只有一条语句的话,那么这一对{}可以省略,但是建议不要省略
switch语句
/* switch(变量){ case 值1: case 值2: case 值3: default: } 1.根据变量的值,选择相应的case去判断,一旦满足case条件,就执行case的相应语句。如果没有break或者已经到结尾的话,就会继续执行其下的case语句。 2.default:是可选的(可写,可不写),而且位置是灵活的 3.变量可以是哪些类型?char byte shor int 枚举 string(jdk1.7 以后的版本才可以放string类型的变量) 4.case 条件:其中条件只能是值,不能是取值范围 */ package com.base.java; public class TestSwitch1 { public static void main(String[] args ){ int i = 2; switch (i){ case 0: System.out.println("zero"); break; case 1: System.out.println("one"); break; case 2: System.out.println("two"); break; case 3: System.out.println("three"); break; default: System.out.println("other"); break; //=> default 是结构比较灵活,可以放在其他位置,但是习惯上写在最后,为了保险起见也加一个break } } }
习题与注意事项:
package com.base.java; /* 习题:对学生成绩大于60分的,输出“合格”。低于60分的,输出“不合格”。 说明:当多个case语句处理的语句块一致时,可以统一的来书写。 习题:根据用于指定月份,打印该月份所属的季节。 3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬季,同理用下面这种方法 */ public class TestSwitch02 { public static void main(String[] args){ int score = 67; switch (score/10){ case 10: case 9: case 8: case 7: case 6: System.out.println("及格"); break; default: System.out.println("不及格"); } } }
无限循环:
for(;;){}
while(true){}
说明:在无限循环内部,要有条件终止的语句,使用break,若没有,那就是死循环。
练习:
// 100以内的质数(素数) 质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。 package com.base.java; public class TestPrimeNumber { public static void main(String[] args) { boolean flag = false; long start = System.currentTimeMillis(); for (int i = 2; i <= 100000; i++) { for (int j = 2; j <= Math.sqrt(i); j++) { // j < i; 中的i改成 Math.sqrt(i) if (i % j == 0) { flag = true; break; } } if (!flag) { System.out.println(i); } flag = false; } long end = System.currentTimeMillis(); System.out.println("花费的时间为:" + (end - start)); // 23609,+break 提升了10倍速度 2356 ,i改成Math.sqrt(i) 速度为 190 } }
break and continue
//=> 设置break标签,决定跳出哪层循环 public class BreakContinue { public static void main(String[] args) { lable: //=> 设置跳出标签 lable for (int i = 1; i < 5; i++) { for (int j = 1; j < 10; j++) { if (j % 4 == 0) { break lable; // continue lable continue 也可以用标签 // System.out.println("永远不执行,还会报错"); continue 和 break 下面跟着的语句不会执行 } System.out.print(j); // 123 } } } }
输出十万以内质数的第二种写法
// 输出十万以内质数的第二种写法,这个写法运用到了跳出循环的标签设置,修改后的代码如下 public class TestPrimeNumber { public static void main(String[] args) { // boolean flag = false; long start = System.currentTimeMillis(); lable:for (int i = 2; i <= 100000; i++) { for (int j = 2; j <= Math.sqrt(i); j++) { // j < i; 中的i改成 Math.sqrt(i) if (i % j == 0) { // flag = true; // break; continue lable; } } //if (!flag) { System.out.println(i); //} //flag = false; } long end = System.currentTimeMillis(); System.out.println("花费的时间为:" + (end - start)); // 23609,+break 提升了10倍速度 2356 ,i改成Math.sqrt(i) 速度为 190 } }
练习输出1000以内的完数
//1000以内的完数,完数是除了它本身,其他约数的和等于它的数,比如:6 = 1 + 2 + 3 public class YinShu { public static void main(String[] args) { int current = 0; for (int i = 1; i < 1000; i++) { for (int j = 1; j < i; j++) { if (i % j == 0) { current += j; } } if (current == i) { System.out.println(i); } current = 0; // 这里要注意 } } }
数组
public class TestArray { public static void main(String[] args){ // 1.如何定义一个数组 // 1.1数组的声明 String[] names; int[] scores; // 1.2初始化 //第一种:静态初始化:初始化数组与给数组元素赋值同时进行 names = new String[]{"Sam", "Daniel", "Jim"}; //第二种:动态初始化:初始化数组与给数组元素赋值分开进行 scores = new int[4]; //2.如何调用相应的数组元素:通过数组元素的下角标的方式来调用 //下角标从0开始,到n-1结束,其中n表示数组长度。 scores[0] = 88; scores[1] = 58; scores[2] = 98; scores[3] = 68; // 3.数组的长度,通过数组的length属性。 System.out.println(names.length); // 3 System.out.println(scores.length); // 4 // 4.如何遍历数组元素 for(int i = 0; i < name.length; i++){ System.out.println(names[i]); } } }
数组元素的默认初始化值
public class TestArray { public static void main(String[] args) { String[] strs = new String[4]; strs[0] = "AA"; strs[1] = "BB"; // strs[2] = "CC"; //=>如果有一项没有赋值,则遍历的时候会出现null strs[3] = "DD"; // 遍历数组 for (int i = 0; i < strs.length; i++) { System.out.println(strs[i]); } // 对于基于基本数据类型的变量创建的数组:byte,char,short,int,long,float.double,boolean // 1.对于byte short int long 而言:创建数组以后,默认值为0 // 2.对于float double而言,默认值是0.0 // 3.对于char而言,默认的为空格 // 4.对于boolean而言,默认为false // 5.对于引用类型的变量构成的数组而言,默认初始化值为null。以String为例 } }
注意:数组一旦初始化,其长度是不可变的。只能重新定义个数组,并且先把之前的数组值拷贝过来,再添加所需要的内容。
多维数组的使用
package com.java.base; public class TestArray { public static void main(String[] args) { int[] scores1 = new int[10]; int[] scores2; String[][] names; // 1.二维数组的初始化 scores2 = new int[][]{{1,2,3},{4,5,6},{6}}; // 静态初始化 names = new String[6][5]; // 动态初始化的方式一 names = new String[6][]; // 动态初始化的方式二 names[0] = new String[5]; names[1] = new String[4]; names[2] = new String[9]; names[3] = new String[5]; names[4] = new String[2]; names[5] = new String[8]; // 错误的初始化方式 // names = new String[][]; 什么都没写是错的 // names = new String[][5]; 前面没有后面有是错的 // 2.若何来引用具体的某一个元素 int[][] i = new int[3][2]; // 另一种写法int[] i[] = new int[3][2]; 一样的 i[1][0] = 90; i[2][1] = 100; // 3.关于数组的长度 // 二维数组的长度,length属性 System.out.println(i.lenght); // 二维数组中元素的长度 System.out.println(i[0].lenght); // 4.如何遍历二维数组(嵌套for循环) for(int m =0; m < scores2.length; m++){ for(int n = 0; n < scores2[m].length; n++){ System.out.println(scores2[m][n]); } } } }
数组的常见异常:越界
public class TestArray { public static void main(String[] args) { // 1.数组下标越界异常:java.lang.ArrayIndexOutOfBoundsException int[] i = new int[10]; i[0] = 100; // i[10] = 98; //=>这里的下标为10,则数组长度却为11,因此越界 for (int j = 0; j <= i.length; j++) { // 此处如果是有“=”号,则又是越界,长度多1个 System.out.println(i[j]); } } }
数组的常见异常:空指针错误异常
public class TestArray { public static void main(String[] args) { // 2.空指针异常:java.lang.NullPointerException // 第一种: boolean[] b = new boolean[3]; b = null; // 此处将引用数据类型设置为null,指针就消失了,下面在b[1]访问数组会报错 System.out.println(b[1]); // 第二种: String[] str = new String[4]; System.out.println(str[3].toString()); // new之后的数组并没有赋值,这时候选择某个元素,则为null,再调用方法就是报错,空指针异常 // 第三种:二维数组的 int[][] j = new int[3][]; j[2][0] = 12; // 这里是没有给 j[2]赋值,则j[2]是null,所以null没法指向[0]这里 } }
注意:
int[] x, y[];
// 相当于
// int[] x; //=> 声明一个一维数组
// int[] y[]; //=> 声明一个二维数组
x = y[];这种赋值是可以通过的,因为x是一维数组,y[]也是一个一维数组
数组的写法(以下写法都可以):
一维数组:int[] x 或者 int x[]
二维数组:int[][] y 或者 int[] y[] 或者 int y[][]
数组中涉及的常见算法
// 数组中涉及的常见算法 /* * 1.求数组的最大值,最小值,平均数,总和等 * 2.数组的复制、反转 * 3.数组元素的排序 * */ public class TestArray3 { public static void main(String[] args) { int[] ary = new int[]{5, 21, 99, 2, 19, 6, 81, 19}; // 求最大值 int max = ary[0]; for (int i = 0; i < ary.length; i++) { if (max < ary[i]) { max = ary[i]; } } System.out.println(max); // 求最小值 // 求总和 // 求平均数 // 比较简单,先不写了 } }