数组
Random引用数据类型
引用数据类型的使用方法
- 导入相关的开发包 import lang包可以不导入
- 创建引用数据类型的内容
引用数据类型 变量名 = new 引用数据类型(); - 使用相关引用数据类型的功能
案例
猜数字小游戏
- 需要获取一个1-100的随机数—>Random
- 需要获取用户键盘输入的内容—>Scanner
- 根据生成的随机数和用户输入的数字来进行比较
- 如果随机数大于用户猜的数字提醒用户猜小了
- 如果随机数小于用户猜的数字提醒用户猜大了
- 如果相等就结束游戏
import java.util.Scanner;
import java.util.Random;
public class GuessNumGame{
public static void main(String[] args){
// 创建相关引用数据类型的内容
// 获取用户输入的内容
Scanner sc = new Scanner(System.in);
// 获取一个随机数字 1 - 100
Random r = new Random();
int randomNum = r.nextInt(100) + 1;
while(true){
System.out.println("请输入一个1-100之间的数字");
int guessNum = sc.nextInt();
// 比较数字
if (randomNum > guessNum){
System.out.println("猜小了,请继续");
}else if(randomNum < guessNum){
System.out.println("猜大了,请继续");
}else{
System.out.println("正确,游戏结束");
break;
}
}
}
}
数组
数组的概念
存放相同数据类型的一个容器,容器中的每一个内容称之为元素(变量)。
数组的使用
初始化数组–定义数组
格式1
数组类型[] 数组名;(int[] array;)
格式2
数据类型 数组名[];
创建数组
格式1:动态初始化
动态初始化在初始化时直接指定好数组的长度,系统会根据数组的长度自动给元素默认值
格式:
- 数据类型[] 数组名 = new 数据类型[数组长度];
- 数据类型 数组名[] = new 数据类型[数组长度];
注意:[]代表是一个数组 new开辟内存空间,默认输出数组,内容是数组的内存地址。
格式2:静态初始化
在初始化时指定好的数组的具体元素,然后系统会根据元素的个数来确定数组的长度。
格式:
完全格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,…元素n,};
简便格式:数据类型[] 数组名 = {元素1,元素2,元素3,…元素n,};
访问数组元素
格式:数组名[n]; n:代表的是一个索引(下标),索引的范围是0到(数组长度-1)获取到的结果就是数组中的数组中的某一个元素(变量)
Java内存介绍
分为5大区域:栈、堆、方法区、本地方法区、寄存器
栈(stack):用于存放局部变量(在 if switch main等等{}中的变量)
堆(heap):凡是new出来的内部都存放在堆中。堆中会自动开辟内存空间,并且给变量赋默认值。
默认值:
基本数据类型:byte/short/int 是0 ,long是0L ,float 0.0F,double0.0 ,
char ‘\u0000’,boolean false。
引用数据类型:null
方法区:存储和.class相关的信息
本地方法区:执行本地方法,和开发无关,和操作系统相关。
寄存器:和CPU相关,性能极高。
数组的常见问题
数组使用的常见问题–>数组越界异常 ArrayIndexOutOfBoundsException
空指针异常:NullPointerException
数组的遍历
普通for循环遍历
for (int i=0;i<arr.length;i++){
System.out.println(arr[i]);//i代表数组的索引
}
增强for循环遍历
增强for循环,只能用于查看元素,修改值是没有效果的
for (int i;arr){//i代表的是数组的元素
i+=3;//在栈中修改i的值,并没有真正去堆中覆盖
System.out.println("i="+i);//i代表数组的索引
}
数组案例
数组的最值
public class ArrayPractice01{
public static void main(String[] args){
int[] arr = {6,78,45,1,56,123};
// 定义一个最大值的变量
int max = arr[0];
for (int i = 1;i < arr.length;i++){
if (arr[i] > max){ // 123 > 78
max = arr[i];// 123
}
}
System.out.println("最大值是 : " + max);
}
}
数组的反转
// 数组反转方式一:
public class ArrayPracticeReverse02{
public static void main(String[] args){
int[] arr = {1,2,3,4,5};
int[] arr1 = new int[5];
for (int i = 0;i < arr.length;i++){
arr1[i] = arr[arr.length - 1 - i];
}
重新给原数组赋值
arr = arr1;
for (int i = 0;i < arr.length;i++){
System.out.println(arr[i]);
}
}
}
// 数组反转方式二:
public class ArrayPracticeReverse02{
public static void main(String[] args){
int[] arr = {1,2,3,4,5};
for (int i = 0;i < arr.length / 2;i++){
// 数据交换
int temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
for (int i = 0;i < arr.length;i++){
System.out.println(arr[i]);
}
}
}
// 数组反转方式三:
public class ArrayPracticeReverse02{
public static void main(String[] args){
int[] arr = {1,2,3,4,5};
for (int min = 0,max = arr.length - 1;min < max;min++,max--){
// 交换数据
int temp = arr[min];
arr[min] = arr[max];
arr[max] = temp;
}
for (int i = 0;i < arr.length;i++){
System.out.println(arr[i]);
}
}
}
数组的查找
public class ArrayPractice03{
public static void main(String[] args){
//int[] arr = {3,5,7,8,9};
遍历查找数组元素
需要查找的数字
//int num = 8;
//for (int i = 0;i < arr.length;i++){
// // 判断元素和需要查找的数字是否相等
// if (num == arr[i]){//找到了
// System.out.println("需要查找的元素位置在" + i);
// }
//}
// 增强for循环寻找
// 定义一个计数器
//int count = 0;
//for (int i : arr){
// if (i == num){
// break;
// }
// count++;// 记录索引
//}
//System.out.println(count);
int[] arr = {3,5,7,8,9};
// 遍历查找数组元素
// 需要查找的数字
int num = -1;
// 最小的索引
int min = 0;
// 最大的索引
int max = arr.length - 1;
// 中间的索引
int mid = (min + max) / 2;
// 设定一个标记
boolean flag = true;
// 3 5 7 8 9
while(arr[mid] != num){//没有找到
if (arr[mid] > num){
max = mid - 1;
}
if (arr[mid] < num){
min = mid + 1;
}
// 重新计算新的中间值
mid = (min + max) / 2;
if (min > max){//表示没有找到数字
System.out.println("查无此数!!!");
flag = false;
break;
}
}
if (flag)
System.out.println("查找数字的索引在" + mid);
}
}