基本流程结构
- 顺序结构
- 分支结构
- 循环结构
Scanner类
- 导入Scanner类;
- 实例化Scanner对象;
- 调用Scanner类的相关方法,获取指定类型的变量。
根据相应的方法输入相应的值,若输入类型和要求类型不匹配时,会抛异常。
int grade = scan.nextInt();
double weight = scan.nextDouble();
String name = scan.next();
取字符串s索引为0位置上的字符c。
char c = s.charAt(0);
if-else
判断是否是闰年
-
可以被4整除但不可被100整除;
或者
-
可以被400整除。
switch
- 未遇到break,依旧会继续往下执行其余的case语句。
- switch(表达式)中的表达式只能是以下6种数据类型之一:byte、short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增)。
- default结构可选可不选,类似于if-else中的else,且位置不固定。
- 多个case可以合并。
- switch-case都可以转换为if-else,但反之不成立。
- switch-case执行效率比if-else稍高。
while
- 注意死循环。
- while和for可以相互转换。
do-while
至少执行一次循环体。
for
for(;;)相当于while(true),属于不限制循环次数的结构。常用break跳出循环。
例题
绘菱形
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for(int i=1;i<=n;i++){
for(int j=1;j<=n-i;j++){
System.out.print(" ");
}
System.out.print("*");
for(int j=1;j<=i-1;j++){
System.out.print(" *");
}
System.out.println();
}
for(int i=1;i<=n-1;i++){
for(int j=1;j<=i;j++){
System.out.print(" ");
}
System.out.print("*");
for(int j=2;j<=n-i;j++){
System.out.print(" *");
}
System.out.println();
}
输出示例:
*
* *
* * *
* * * *
* * * * *
* * * *
* * *
* *
*
输出100以内质数
long time1 = System.currentTimeMillis();
System.out.println("2");
label:for(int i=3;i<100;i+=2){
for(int j=3;j<=Math.sqrt(i);j+=2){
if(i%j==0){
continue label;
}
}
System.out.println(i+" ");
}
long time2 = System.currentTimeMillis();
System.out.println(time2-time1);
break和continue
break结束当前循环。
continue结束当此循环。
break默认跳出离break语句最近的那层循环,如果想跳出更外层的循环,使用标签。同理,continue也可以配合标签使用。
label:for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
System.out.println(" ");
if(j<i){
break label;
}
}
}
数组
- 数组是多个相同类型数据按照一定顺序排列的集合。
- 数组是有序的。
- 数组属于引用数据类型,数组的元素既可以是基本数据类型,也可以是引用数据类型。
- 创建的数组对象在内存中是一块连续的内存空间。
- 数组的长度一旦确定,就不能更改。
一维数组
初始化:
//动态初始化
int[] array1 = new int[5];
//静态初始化
int[] array2 = new int[]{1,2,3,4,5};
获取数组长度:
//获取数组长度
int[] array1 = new int[5];
int len1 = array1.length;
//获取字符串长度
String str = "hello";
int len2 = str.length();
遍历:
for循环、for-each循环。
默认初始化值:
整形->0、浮点型->0.0、char型->0(ASCII码)、boolean型->false、引用数据类型->null
数组内存解析:
二维数组
初始化:
//动态初始化
int[][] array1 = new int[2][3];
int[][] array2 = new int[2][];
//静态初始化
int[][] array3 = new int[][]{{1,2,3},{},{}...};
其中array1外层元素默认初始值为地址值,内层元素初始值与一维数组相同。
其中array2外层元素默认初始值为null,内层元素初始化值不能调用,会报空指针异常错误。
其余概念类比一维数组很好理解。
例题:杨辉三角。
数组相关算法
1.数组元素的赋值(杨辉三角、回形数等);
2.求最大值、最小值、平均值、总和等;
int[] array = new int[5];
int arrayMax = array[0];
for(int i=1;i<array.length;i++){
if(arrayMax < array[i]){
arrayMax = array[i];
}
}
3.数组的复制、反转、查找(线性查找、二分查找);
array1 = array2;//这不是数组的复制,而是赋值。
复制:应当新创建一个数组,通过循环依次赋值原数组的值。
反转:可使用双指针或其他方法。String类型反转可借助StringBuffer中的reverse函数进行。
查找:
- 线性查找:遍历数组,依次判断每个元素。 O(n)
- 二分查找:分治思想。(需要先排序) O(lgn)
public static int binarySearch(int[] num, int target, int left, int right){
int mid = (left + right) /2;
if(left>right) return -1;
if(num[mid] == target){
return mid;
}else if(num[mid] > target){
return binarySearch(num,target,left,mid-1);
}else return binarySearch(num,target,mid+1,right);
}
4.数组元素的排序算法;
明天学。
取[a,b]之间的随机数:
(int)(Math.random()*(b-a+1)+a)