死循环
死循环 : 停不下来的循环叫死循环
for ( ; ; ) {
}
while ( true ) {
}
死循环推荐while 格式, 在一定的需求场景下死循环还是很好用的! !
控制循环的关键字
break : 中断, 结束
使用场景 : 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 ;
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. 如何遍历容器 遍历: 依次获取容器中的元素
一维数组的基本使用
创建容器:
定义容器: 数据类型[ ] 数组名 ( 推荐) / 数据类型 数组名[ ] ;
数组只定义不初始化, 数组是不可以使用的! !
动态初始化: 在定义数组时, 由程序员决定数组的长度, 数组中最开始的元素值由计算机提供( 动态初始化元素的默认值)
* 数据类型[ ] 数组名 = new 数据类型[ m] ;
格式解释:
1. new : 创建对象
2. 数据类型 : 赋值= 号前后的数据类型必须一致
3. m : 整数 -> 代表的数组的长度/ 代表的是数组中元素的个数
静态初始化: 在定义数组时, 由程序员决定每一个数组元素的具体值, 由计算机自动计算数组的长度/ 元素的个数;
完整版 : 数据类型[ ] 数组名 = new 数据类型[ ] { 元素1 , 元素2 , 元素3. . . . . } ;
* 简化版 : 数据类型[ ] 数组名 = { 元素1 , 元素2 , 元素3. . . . . } ;
[ I @4554617c : 数组在内存中的地址值
[ : 一维数组
I : int
@ : 没意思 -> 分隔
4554617 c : 在内存中的地址值 ( 16 进制的数)
数组是引用数据类型, 直接输出数组看到的是数组在内存中的地址值
基本数据类型直接输出的话, 看到的基本数据类型的具体值
增删改查四类功能:
数组一旦被定义, 长度是不能发生改变的;
增/ 删: 因为数组长度不能发生改变, 所以数组没有增删的功能!
* 改 : 要先查到元素再修改元素值
数组名[ 索引] = 要修改的值;
* 查 : 数组中的元素有编号
元素类型 变量名 = 数组名[ 索引] ;
数组有一种属性: length -> 获取数组中的元素个数/ 获取数组的长度
数组名. length
数组元素的遍历:
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. 展示程序的执行流程的 -> 方法的进栈和出栈 ( 先进后出, 方法的执行在栈中)
2. 方法存在于栈中, 方法中的变量叫局部变量, 局部变量也在栈中!
特点:
栈内存中的方法执行完毕立刻弹栈! !
堆内存: 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. 常量池 : 存放常量的池子
本地方法区: native 本地
本地方法区提供本地方法的存放和运行
本地方法指的是和计算机操作系统交互的方法;
寄存器: 跟CPU运算有关
两个数组的内存图
两个引用指向同一个内存空间的内存图
关于数组操作的2个小问题
ArrayIndexOutOfBoundsException : 数组索引超出范围异常
产生原因: 访问了数组中不存在的索引编号
解决 :
1. 不访问
2. 使用正确的索引编号 ( 索引最大值 = 长度 - 1 )
NullPointerException : 空指针异常
产生的原因 : 访问了地址值为null 的对象 ( 调用了对象的方法, 访问了对象的内部空间, 访问了对象的属性)
解决 :
1. 找到调用方法的对象, 检查这个对象是否被赋值为null