java基础3(黑马)
一、循环
1.while循环
package cn.chang.loop;
public class WhileDemo3 {
public static void main(String[] args) {
// 目标:掌握while循环的书写格式,以及理解其执行流程
// 需求:打印多行Hello World
int i = 0;
while (i < 5) {
System.out.println("Hello World");
i++;
}
}
}
使用规范:如果一开始不知道循环次数的情况下,建议使用while循环解决更专业。一开始就知道循环几次的情况下,使用for循环解决更专业。
2.do-while循环
package cn.chang.loop;
public class DoWhileDemo4 {
public static void main(String[] args) {
// 目标:掌握do-while语句的书写格式、执行流程、应用场景
// 打印多行Hello World
int i = 1;
do {
System.out.println("Hello World");
i++;
} while( i <= 3);
}
}
do-while的特点:先执行后判断。
do-while控制流程:
for循环和while循环的其他区别:
1.在for循环中,控制循环的变量只能在循环中使用。
2.while循环中,控制循环的变量在循环后还是可以继续使用。
3.死循环
可以一直执行下去的一种循环,如果没有干预不会停下来。
死循环的写法:
经典应用场景:服务器程序。
循环嵌套:循环中又包含嵌套。
例:
package cn.chang.loop;
public class LoopNestedDemo6 {
public static void main(String[] args) {
// 目标:搞清楚循环嵌套的执行流程
// 场景:老婆罚你说三天,每天5句我爱你。
for (int i = 1; i <= 3; i++) {
System.out.println("第" + i + "天: ");
for (int j = 1; j <= 5; j++) {
System.out.println(j + ": 我爱你");
}
System.out.println("----------");
}
}
}
打印星型案例:
package cn.chang.loop;
public class LoopNestedDemo6 {
public static void main(String[] args) {
// 目标:搞清楚循环嵌套的执行流程
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 4; j++) {
System.out.print("*"); //打印*,不换行
}
System.out.println(); //换行
}
}
}
4.跳转关键字
break:跳出并结束当前所在循环的执行,也就是结束循环。
continue:用于跳出当前循环里的当次执行,直接进入循环里的下一次执行。
package cn.chang.loop;
public class BreakContinueDemo8 {
public static void main(String[] args) {
// 目标:掌握break和continue的作用
// break: 跳出并结束当前所在循环的执行
for (int i = 1; i <= 5; i++) {
System.out.println("我爱你" + i);
if (i == 3) {
break;
}
}
}
}
public class BreakContinueDemo8 {
public static void main(String[] args) {
// 目标:掌握break和continue的作用
// break: 跳出并结束当前所在循环的执行
for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue;
}
System.out.println("洗碗" + i);
}
}
}
注意事项:
break: 只能用于结束所在循环,或者结束所在switch分支的执行。
continue:只能在循环中使用。
4.Random的使用
注意:nextInt(n) 功能只能生成:0 至 n-1之间的随机数,不包含n。
package cn.chang.random;
import java.util.Random;
public class RandomDemo1 {
public static void main(String[] args) {
// 目标:掌握使用Random生成随机数的步骤
Random r = new Random();
for(int i = 0; i < 10; i++) {
System.out.println(r.nextInt(10));
}
}
}
Random生成指定区间随机数:
技巧:减加法。
先区间减去1,让前面的数为0,变成0-9,那么nextInt函数中参数填写9,然后把1加回来。
package cn.chang.random;
import java.util.Random;
public class RandomDemo1 {
public static void main(String[] args) {
// 目标:掌握使用Random生成随机数的步骤
// 生成1-10之间的随机数
Random r = new Random();
for (int i = 0; i < 20; i++) {
int data = r.nextInt(10) + 1;
System.out.println(data);
}
}
}
生成3-17的随机数:
先减去3, 让区间变成0-14, nextInt里面填14,然后再把3加回来。
代码如下:
package cn.chang.random;
import java.util.Random;
public class RandomDemo1 {
public static void main(String[] args) {
// 目标:掌握使用Random生成随机数的步骤
// 生成3-17之间的随机数
Random r = new Random();
for (int i = 0; i < 20; i++) {
int data = r.nextInt(14) + 3;
System.out.println(data);
}
}
}
二、数组
数组:就是一个容器,用来存储同一批同种类型的数据。
1.数组的定义
静态初始化数组:定义数组的时候直接给数组赋值。
静态初始化数组的格式:
注意:
1.“数据类型[] 数组名” 也可写成 “数据类型 数组名[]”。
2.什么类型的数组只能存放什么类型的数据。
package cn.chang.define;
public class ArrayDemo1 {
public static void main(String[] args) {
// 目标:掌握数组的定义方式:静态初始化数组
int[] ages = new int[]{12, 24, 36};
double[] scores = new double[]{89.9, 99.5, 59.5, 88};
// 简化写法
int[] ages2 = {12, 24, 36};
double[] scores2 = {89.9, 99.5, 59.5, 88};
// “数据类型[] 数组名” 可以写成 ”数据类型 数组名[]"
int ages3[] = {12, 24, 36};
double scores3[] = {89.9, 99.5, 59.5, 88};
// 什么类型的数组,只能放什么类型的数据
int[] ages4 = {12, 24, 36, "chang"}; // 报错
}
}
数组在计算机中的基本原理:
数组变量指向数组对象。
ages变量中保存的是数组对象的地址。
2.数组的访问
就是访问数组中的数据。
语法格式:数组名称[索引]。
数组中的数据默认是有编号的,默认是从0开始,这个编号就是索引。
数组的长度属性:length
package cn.chang.define;
public class ArrayDemo2 {
public static void main(String[] args) {
// 目标:掌握数组的访问
int[] arr = {12, 24, 36};
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
}
}
3.数组的遍历
遍历:就是一个一个的访问容器中的数据。
package cn.chang.define;
public class ArrayDemo3 {
public static void main(String[] args) {
// 目标:掌握数组的遍历
int[] ages = {12, 24, 36};
for(int i = 0; i < ages.length; i++) {
System.out.println(ages[i]);
}
}
}
动态初始化数组:定义数组的时候,先不存入具体的元素值,只确定数组存储的数组类型和数组的长度。后期再为该数组赋值。元素的默认值都是有规则的。
注:静态初始化数组和动态初始化数组的写法是独立的,不可以混用。
动态初始化数组元素默认值规则:
三、数组在计算机中的执行原理
java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
Java内存的分配介绍:
1)方法区:将编译后的字节码文件放到方法区中。
2)栈内存:方法运行时所进入的内存,变量也是在这里。main就是在这里执行的。
3)堆内存:new出来的东西会在这块内存中开辟空间并产生地址。new的数组是放在堆里的
基本类型:存储的是具体的值。
引用变量:存储的是地址。
多个变量指向同一个数组的问题:
package cn.ensource.memory;
public class ArrayDemo2 {
public static void main(String[] args) {
// 目标:认识多个变量指向同一个数组对象的形式,并掌握注意事项
int[] arr1 = {11, 22, 33};
// 把int类型的数组变量arr1赋值给int类型的数组变量arr2
int[] arr2 = arr1; // 赋值的是地址
System.out.println(arr1); // 地址:[I@4eec7777
System.out.println(arr2); // 地址:[I@4eec7777
arr2[1] = 99;
System.out.println(arr1[1]);
}
}
注:如果某个数组变量存储的地址是null,那么该变量将不再指向任何数组对象。