Random与一位数组介绍
l 随机数:
作用:
用于产生一个随机数
使用步骤(和Scanner类似)
导包
import java.util.Random;
创建对象
Random r = new Random();
获取随机数
int number = r.nextInt(10);
产生的数据在0到10之间,包括0,不包括10。
括号里面的10是可以变化的,如果是100,就是0-100之间的数据
l 数组定义格式:
数组概念
数组是存储同一种数据类型多个元素的容器。
数组既可以存储基本数据类型,也可以存储引用数据类型。
数组的定义格式
格式1:数据类型[] 数组名; 推荐这种方式。
格式2:数据类型 数组名[];
注意:这两种定义做完了,数组中是没有元素值的。
如何对数组的元素进行初始化呢?
l 数组的初始化:
数组初始化概述:
Java中的数组必须先初始化,然后才能使用。
所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
l 数组的初始化方式:
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。(人指定长度:叫动态)
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。
l 动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。
格式:数据类型[] 数组名 = new 数据类型[数组长度];
数组长度其实就是数组中元素的个数。
一位数组内存结构及静态初始化
l Java中的内存分配:
Java 程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
栈 存储局部变量
堆 存储new出来的东西
方法区 (面向对象进阶讲)
本地方法区 (和系统相关)
寄存器 (给CPU使用)
Java中的
l Java中数组的内存图解
图解1:
定义一个数组,输出数组名及元素。然后给数组中的元素赋值,再次输出数组名及元素。
package com.itheima_01;
/*
* 需求:定义一个数组,输出数组名及元素。然后给数组中的元素赋值,再次输出数组名及元素。
*/
public class ArrayTest {
public static void main(String[] args) {
//定义一个数组
int[] arr = new int[3];
//输出数组名及元素
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//给数组中的元素赋值
arr[0] = 100;
arr[2] = 200;
//再次输出数组名及元素
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
图解2:
定义两个数组,分别输出数组名及元素。然后分别给数组中的元素赋值,分别再次输出数组名及元素。
图解3:
定义两个数组,先定义一个数组,赋值,输出。然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。然后给第二个数组赋值,再次输出两个数组的名及元素。
/*
* 需求:定义两个数组,先定义一个数组,赋值,输出。然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。
* 然后给第二个数组赋值,再次输出两个数组的名及元素。
*/
public class ArrayTest3 {
public static void main(String[] args) {
// 先定义一个数组,赋值,输出
int[] arr = new int[3];
arr[0] = 100;
arr[1] = 200;
arr[2] = 300;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
// 然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组
int[] arr2 = arr;
// 然后给第二个数组赋值
arr2[0] = 111;
arr2[1] = 222;
arr2[2] = 333;
// 再次输出两个数组的名及元素
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
}
}
代码内存图解如下:
package com.itheima_01;
/*
* 需求:定义两个数组,分别输出数组名及元素。然后分别给数组中的元素赋值,分别再次输出数组名及元素。
*/
public class ArrayTest2 {
public static void main(String[] args) {
//定义两个数组
int[] arr = new int[2];
int[] arr2 = new int[3];
//分别输出数组名及元素
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
//然后分别给数组中的元素赋值
arr[1] = 100;
arr2[0] = 200;
arr2[2] = 300;
//再次输出数组名及元素
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
}
}
代码内存图解:
l 数组的初始化
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。
格式:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};
举例:
int[] arr = new int[]{1,2,3};
解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值,并且值分别是1,2,3。
其实这种写法还有一个简化的写法
int[] arr = {1,2,3};
数组元素的访问:
* 数组:存储同一种数据类型的多个元素的容器。
*
* 定义格式:
* A:数据类型[] 数组名;
* B:数据类型 数组名[];
* 举例:
* A:int[] a; 定义一个int类型的数组,数组名是a
* B:int a[]; 定义一个int类型的变量,变量名是a数组
*
* 数组初始化:
* A:所谓初始化,就是为数组开辟内存空间,并为数组中的每个元素赋予初始值
* B:我们有两种方式对数组进行初始化
* a:动态初始化 只指定长度,由系统给出初始化值
* b:静态初始化 给出初始化值,由系统决定长度
*
* 动态初始化:
* 数据类型[] 数组名 = new 数据类型[数组长度];
*/
public class ArrayDemo {
public static void main(String[] args) {
//数据类型[] 数组名 = new 数据类型[数组长度];
int[] arr = new int[3];
/*
* 左边:
* int:说明数组中的元素的数据类型是int类型
* []:说明这是一个数组
* arr:是数组的名称
* 右边:
* new:为数组分配内存空间
* int:说明数组中的元素的数据类型是int类型
* []:说明这是一个数组
* 3:数组的长度,其实就是数组中的元素个数
*/`
System.out.println(arr); //[I@3fa5ac,地址值
//我们获取到地址值没有意义,我要的是数组中的数据值,该怎么办呢?
//不用担心,java已经帮你想好了
//其实数组中的每个元素都是有编号的,编号是从0开始的,最大的编号就是数组的长度-1
//用数组名和编号的配合我们就可以获取数组中的指定编号的元素
//这个编号的专业叫法:索引
//格式:数组名[编号] -- 数组名[索引]
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
一位数组常见问题及联系
数组操作的两个常见小问题:
数组索引越界
ArrayIndexOutOfBoundsException
访问到了数组中的不存在的索引时发生。
空指针异常
NullPointerException
数组引用没有指向对象,却在操作对象中的元素时。
* 两个常见小问题:
* A:java.lang.ArrayIndexOutOfBoundsException
* 数组越界异常
* 产生的原因:就是你访问了不存在的索引元素。
* B:java.lang.NullPointerException
* 空指针异常
* 产生的原因:数组已经不指向堆内存的数据了,你还使用数组名去访问元素。
* 为什么我们要记住这样的小问题呢?
* 编程不仅仅是把代码写出来,还得在出现问题的时候能够快速的解决问题。
获取数值长度:数值名.length
数组获取最值(获取数组中的最大值最小值)
package com.itheima_03;
/*
* 需求:数组获取最值(获取数组中的最大值最小值)
*/
public class ArrayTest2 {
public static void main(String[] args) {
//定义数组
int[] arr = {12,98,45,73,60};
//定义参照物
int max = arr[0];
//遍历数组,获取除了0以外的所有元素,进行比较
for(int x=1; x<arr.length; x++) {
if(arr[x] > max) {
max = arr[x];
}
}
System.out.println("数组中的最大值是:"+max);
}
}
二维数组的定义和使用
1.1 二维数组的概述和基本使用
1.2 二维数组操作之遍历二维数组
l 二维数组概述
我们黑马程序员的Java基础班每个班有很多个学生,所以,可以用数组来存储,而我们又同时有很多个Java基础班。这个也应该用一个数组来存储。如何来表示这样的数据呢?Java就提供了二维数组供我们使用。
由此可见:其实二维数组其实就是一个元素为一维数组的数组。
* 二维数组:就是元素为一维数组的数组。
*
* 定义格式:
* A:数据类型[][] 数组名;
* B:数据类型 数组名[][]; 不推荐
* C:数据类型[] 数组名[]; 不推荐
*
* 如何初始化呢?
* A:动态初始化
* 数据类型[][] 数组名 = new 数据类型[m][n];
* m表示这个二维数组有多少个一维数组
* n表示每一个一维数组的元素有多少个
* B:静态初始化
* 数据类型[][] 数组名 = new 数据类型[][]{{元素...},{元素...},{元素...},...};
* 简化格式:
* 数据类型[][] 数组名 = {{元素...},{元素...},{元素...},...};
二维数组的操作:
遍历思想:首先使用循环遍历出二维数组中存储的每个一维数组,然后针对每个遍历到的一维数组在使用循环遍历该一维数组中的元素
二维数组遍历,其中每一位数组个数不同时的遍历方法
变量定义在循环之内时,每次循环都会创建内存,最好定义到循环之外
老师补充:
随机数
小游戏:用户随机输入一个1到100之间的整数,系统提示大小,如果不对继续输入,直到满足条件,猜对了位置。
问题:如何完成不对就让用户一直输入的代码
数组:
是一个 相同类型数据 多个 的一个集合。
int a = 9;
int b = 10;
int c = 20;
声明类型 arr = {9,10,20}
数组元素:就是数组里面的每一个值 如:9 10 20 都是数组中的一个元素
内存:
在系统(Java)运行的时候,产生的虚拟空间,计算机的虚拟内存,特点:关机就没了。Java内存,在程序运行完毕之后就没了。
Java中的变量等内容,都是在运行的时候,从Java文件读取到内存的。
在Java的内存中,又有3个大的分区:
堆
栈
内存地址:就是存放具体内容的一个地址。假如有a b两个区域,a放的就是变量名,b放的就是变量的值。
如何关联起来:变量名=变量值的地址(身份证) 根据身份证去找到对应的值。
遍历:
就是循环输出每一个元素
int[] arr2 = {1,2,3,10,20};
for(int i=0;i<=最大索引;i++)
for(int i=0;i<=最大长度-1;i++)
for(int i=0;i<最大长度;i++)
属性:用来描述一个事物的固有特性 比如:高度、长相、婚否
数组的属性之一就是:长度
获取属性的用法固定:就是数组名.属性
获取数组长度:arr.length
从这个数组中,拿出一个元素,当做参照,并且存到一个变量中。
然后遍历数组,拿每一个元素与之比较,如果满足条件,就把这个变量更新。