死循环 : 停不下来的循环叫死循环
//for循环的死循环格式:
for (;;) {
//死循环代码
}
//while循环的死循环格式
while(true){
}
死循环推荐while格式,在一定的需求场景下死循环还是很好用的!!
控制循环的关键字
break : 中断,结束 //用来提前结束和中断整个循环或者switch
使用场景 : switch 中 或者 循环中
continue : 继续 //用来结束本轮次循环,从下一次循环的步进表达式开始执行
使用场景 : 循环中
循环的嵌套
循环的循环体语句还是一个循环 --> 循环的嵌套
给循环取别名
原因: break,continue关键字只能控制他们所在的那层循环
给循环取别名:
格式:
别名:循环格式
//别名的命名方式和变量名一致
使用别名的格式:
break 别名; / continue 别名;
Random
使用步骤:
1. 导包
import java.util.Random;
2. 创建对象
Random r = new Random();
3. 生成随机整数
int 变量名 = 对象名.nextInt(m);//生成随机数
m: 随机数的范围 -> [0,m)
需求:
1. 生成[1-10]之间的随机数
int num = r.nextInt(10) + 1;//[0,9] + 1
2. 生成负数 [-10,-1]
int num = -(r.nextInt(10) + 1);
3. 生成[n,m]之间的随机数
r.nextInt(m - n + 1) + n
[1,10]:r.nextInt(10 - 1 + 1) + 1
[22,84]:r.nextInt(84 - 22 + 1) + 22 -> nextInt(63) + 22 -> [0,62] + 22
猜数字小游戏
一维数组概述
数组 : 容器 -> 存放一些同类型数据的容器
一维 : 维度 []
二维 : 维度 [][]
数组的特点:
*1. 数组一旦被定义长度不能发生改变,如果发生改变一定是生成了新的数组 -> 弊端
*2. 数组中的元素类型必须一致 -> 微观角度: 看单个数组
*3. 数组中的元素都有自己的编号 -> 索引 : 索引是从0开始
4. 数组中存储元素 是存取有序的! -> 依次存取
5. 数组中的元素可以是基本数据类型也可以是引用数据类型 -> 宏观角度 : 站在整个数组概念 -> 好处
6. 数组元素可以重复
一维数组 : 一根绳上的蚂蚱 蚂蚱: 数组中元素 / 绳结法 / 一包烟
二维数组 : 一条烟
学习容器知识点的方法
容器 : 数组/集合/数据库
1. 如何创建容器
2. 学习容器的增删改查四类功能
3. 如何遍历容器 遍历: 依次获取容器中的元素
一维数组的基本使用
创建容器:
定义容器: 数据类型[] 数组名 (推荐) / 数据类型 数组名[];
//例如: 定义一个元素类型为int类型的数组 -> int[] arr / int arr[]
数组只定义不初始化,数组是不可以使用的!!
动态初始化:在定义数组时,由程序员决定数组的长度,数组中最开始的元素值由计算机提供(动态初始化元素的默认值)
//不明确具体的元素值,只知道元素的个数就用动态初始化
*数据类型[] 数组名 = new 数据类型[m];
格式解释:
1. new : 创建对象
2. 数据类型 : 赋值=号前后的数据类型必须一致
3. m : 整数 -> 代表的数组的长度/代表的是数组中元素的个数
//例如 : double[] ds = new double[5];
静态初始化: 在定义数组时,由程序员决定每一个数组元素的具体值,由计算机自动计算数组的长度/元素的个数;
//明确每一个元素的值时就可以直接使用静态初始化定义数组元素
完整版 : 数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3.....};
*简化版 : 数据类型[] 数组名 = {元素1,元素2,元素3.....};
//例如 : int[] arr = {1,2,3,4,5};
[I@4554617c : 数组在内存中的地址值
[ : 一维数组
I : int
@ : 没意思 -> 分隔
4554617c : 在内存中的地址值 (16进制的数)
数组是引用数据类型,直接输出数组看到的是数组在内存中的地址值
基本数据类型直接输出的话,看到的基本数据类型的具体值
增删改查四类功能:
数组一旦被定义,长度是不能发生改变的;
增/删: 因为数组长度不能发生改变,所以数组没有增删的功能!
* 改 : 要先查到元素再修改元素值
数组名[索引] = 要修改的值; //修改指定索引位置上的元素值
* 查 : 数组中的元素有编号
元素类型 变量名 = 数组名[索引]; //获取指定索引位置上的元素值
数组有一种属性: length -> 获取数组中的元素个数/获取数组的长度
数组名.length
数组元素的遍历:
//利用数组的长度属性和for循环来遍历数组容器
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
动态初始化元素默认值
整数(byte,short,int,long) : 0
浮点数(float,double) : 0.0
字符(char) : '\u0000' -> 空字符;
布尔(boolean) : false
其他所有的引用数据类型数组(String[],Integer[],Student[]) : null
Java的内存分配(理解)
栈内存: stack
功能:
1. 展示程序的执行流程的 -> 方法的进栈和出栈 (先进后出,方法的执行在栈中) //q的d夹
2. 方法存在于栈中,方法中的变量叫局部变量,局部变量也在栈中!
//只要在方法内,只要在=号左边的变量都是局部变量!!
特点:
栈内存中的方法执行完毕立刻d栈!!
堆内存: memory
功能 : 存对象的 -> new 出来的都是对象
特点 :
1. 堆中元素都有地址值
2. 堆中对象内部的数据都有默认值 ;
整数(byte,short,int,long) : 0
浮点数(float,double) : 0.0
字符(char) : '\u0000' -> 空字符;
布尔(boolean) : false
其他所有的引用数据类型数组(String[],Integer[],Student[]) : null
3. 堆中数据使用完毕不会立即回收! 等到GC(垃圾回收机制)空闲时候回收!
方法区:
功能 :
1. 存放字节码对象 class文件(硬盘) --> class对象(也叫字节码对象)(内存)
字节码对象内: 当前类的概览(目录)!
2. 常量池 : 存放常量的池子
//常量池在JDK7/8的时候从方法区中搬家到了堆内存!
本地方法区: native 本地
本地方法区提供本地方法的存放和运行
本地方法指的是和计算机 *** 作系统交互的方法;
寄存器: 跟CPU运算有关
两个数组的内存图
两个引用指向同一个内存空间的内存图
关于数组 *** 作的2个小问题
ArrayIndexOutOfBoundsException: 数组索引超出范围异常
产生原因: 访问了数组中不存在的索引编号
解决 :
1. 不访问
2. 使用正确的索引编号 (索引最大值 = 长度 - 1)
NullPointerException : 空指针异常
产生的原因 : 访问了地址值为null的对象 (调用了对象的方法,访问了对象的内部空间,访问了对象的属性)
//只要对象被赋值为null 那么这个对象就废了!
解决 :
1. 找到调用方法的对象,检查这个对象是否被赋值为null
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)