1.数组
1.数组的介绍
2.数组的定义与静态初始化
1.数组的定义
2.数组的初始化
3.数组的元素访问
1.索引
2.数组的元素访问
4.数组遍历
1.数组遍历
2.案例遍历数组并求和
3.案例统计个数
4.案例变化数据
5.数组动态初始化
1.动态初始化
2.数组默认初始化值的规律
3.静态初始化跟动态初始化的区别
6.数组内存图
7.数组常见问题
8.数组常见操作
1.求最值
2.求和并统计个数
3.交换数据
4.打乱数组中的数据
1.数组的介绍
- 数组是一种容器,可以用来存储同种数据类型的多个值
- 数组容在存储数据的时候,需要结合隐式转换考虑。
- 比如类型大的可以包含小的
- 容器的类型,和存储的数据类型保持一致
2.数组的定义与静态初始化
1.数组的定义
-
格式
-
格式一:数据类型 [] 数组名
范例: int [] array
-
格式二: 数据类型 数组名 []
范例: int array []
-
2.数组的初始化
-
静态初始化
- 初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程
- 完整格式:数据类型 [] 数组名 = new 数据类型 [] { 元素1 元素2 元素3 ……};
- 范例:int [] array = new int [] {11,22,33,44};
- 简化格式:数据类型 []数组名 = { 元素1 元素2 元素3 ……};
- 范例:int [] array = {11,22,33};
-
数组的地址值
- 数组的地址值就是表示数组在内存中的位置
- 地址值的格式含义:比如[D@776ec8df
- [:表示一个数组
- D:表示当前数组里面的元素都是double类型的
- @:表示一个间隔符号(固定用法,无特殊含义)
- 776ec8df:才是数组真正的地址值,(十六进制数)
- 平时我们习惯性的会把这个整体叫做数组的地址值。
3.数组的元素访问
1.索引
索引:也叫做下标,角标。
索引的特点:从0开始,逐个+1增长,连续不间断
a | b | c | d | e |
---|---|---|---|---|
0 | 1 | 2 | 3 | 4 |
下面的 01234就是索引
2.数组的元素访问
-
格式:数组名 [索引];
package Scanner; public class Demo11 { public static void main(String[] args) { //利用索引对数组中的元素进行访问 //1.获取数组里面的元素 //格式:数组名 [索引]; int [] arr = {1,2,3,4,5}; //获取数组中的第一个元素 int number = arr[0]; System.out.println(number); //也可以直接放在输出语句中,并打印出来 System.out.println(arr[1]); //2.把数据存储到数组当中 //格式:数组名[索引] = 具体的数据或者变量; //一旦覆盖之后,原来的数据就不存在了 arr[3] = 100; System.out.println(arr[3]); } }
4.数组遍历
1.数组遍历
数组遍历:将数组中所有的内容取出来,取出来之后可以(打印,求和,判断……)
注意:遍历指的是取出数据的过程,不要局限的理解为,遍历就是打印
package Scanner;
public class Demo12 {
public static void main(String[] args) {
//定义数组
int [] arr = {1,2,3,4,5};
//2.获取数组里面的所有元素
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
System.out.println(arr[4]);
//可以利用循环改进代码
//开始条件:0
//结束条件:4
for (int i = 0; i <= 4; i++) {
System.out.println(arr[i]);
}
//在java中关于数组的一个长度属性:length
//调用方式:数组名.length
//可以看出数组的长度
System.out.println(arr.length);
//所以上面的代码可以改进为
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
- 另外,在idea中可以快速生成数组的遍历方式,
- 格式:数组名.fori
2.案例遍历数组并求和
package anli;
//需求:定义一个数组,存储12345,遍历数组得到每一个元素,求数组里面所有的数据和
public class anli1 {
public static void main(String[] args) {
//定义一个数组
int [] arr = {1,2,3,4,5};
//求和变量
int sum = 0;
//遍历数组
for (int i = 0; i < arr.length; i++) {
//i依次表示数组里面的每个索引
//arr[]依次表示数组里面的每一个元素
sum = sum +arr[i];
}
//当循环结束,sum的值就是累加之后的结果
System.out.println(sum);
}
}
3.案例统计个数
package anli;
/*需求:定义一个数组,存储1,2,3,4,5,6,7,8,9,10,
遍历数组得到每一个元素,统计数组里面一共有多少个能被3整除的数字
*/
public class anli2 {
public static void main(String[] args) {
//定义一个数组,存储1,2,3,4,5,6,7,8,9,10,
int arr [] = {1,2,3,4,5,6,7,8,9,10};
//统计变量
int count = 0;
//遍历数组,得到每一个元素
for (int i = 0; i < arr.length; i++) {
//判断当前的元素是否为3的倍数,如果是那么统计变量就需要自增一次
if (arr[i] % 3 == 0){
count++;
}
}
//当循环结束之后,就表示数组里面所有的数字都判断完毕了,直接打印count就行了
System.out.println("数组中能被3整除的数字有" + count +"个");
}
}
4.案例变化数据
package anli;
//需求:定义一个数组,存储1,2,3,4,5,6,7,8,9,10
// 遍历每一个元素
// 要求:
// 1.如果是奇数,则将当前的数字扩大两倍
// 2.如果是偶数,则将当前的数字变为二分之一
public class anli3 {
public static void main(String[] args) {
//定义一个数组
int [] arr = {1,2,3,4,5,6,7,8,9,10};
//遍历每一个元素
for (int i = 0; i < arr.length; i++) {
//进行判断
if (arr[i] % 2 == 0){
//偶数 变为二分之一
arr[i]= arr[i] / 2;
}else {
//奇数 变为2倍
arr[i] = arr[i] * 2;
}
}
//遍历数组
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
5.数组动态初始化
1.动态初始化
- 动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
- 格式:数据类型 [] 数组名 = new 数据类型 [数组长度]
- 范例:int [] arr = new int [3]
2.数组默认初始化值的规律
- 整数类型:默认初始化值为0
- 小数类型:默认初始化值为0.0
- 字符类型:默认初始化值为’/u0000’ 展示方式是一个空格
- 布尔类型:默认初始化值为false
- 引用数据类型:默认初始化值为 null
3.静态初始化跟动态初始化的区别
- 动态初始化:手动指定数组长度,由系统给出默认初始化值
- 只明确元素个数,不明确具体数值,推荐使用动态初始化
- 举例:使用数组容器来存储键盘录入的5个整数
- int [] arr = new int[5];
- 静态初始化:手动指定数组元素,系统会根据元素个数,计算出数组的长度
- 需求中明确了要操作的具体数据,直接静态初始化即可
- 举例:将全班的学生成绩存入数组中 11,22,33,
- int [] arr = {11,22,33};
6.数组内存图
1.java的内存分配
- 栈:方法运行时使用的内存,比如main方法运行,进入方法栈中执行
- 堆:存储对象或者数组,new来创建的,都存储在堆内存
- 方法区:存储可以运行的class文件
- 本地方法栈:JVM在使用操作系统功能的时候使用
- 寄存器:给CPU使用
7.数组常见问题
- 当访问了数组中不存在的索引,就会引发索引越界异常
package anli;
public class anli4 {
public static void main(String[] args) {
//定义一个数组
int [] arr = {1,2,3,4};
//长度是4
//最小索引是0
//最大索引是3(数组长度-1)
//如果这时候调用不存在索引,比如
System.out.println(arr[10]);
//此时就会出现索引越界异常
// Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
//at anli.anli4.main(anli4.java:11)
}
}
8.数组常见操作
1.求最值
package anli;
//需求:已知数组元素为{33,5,22,44,55},请找出数组中最大值并打印在控制台
public class anli5 {
public static void main(String[] args) {
//定义数组
int [] arr = {33,2,22,44,55};
//定义max变量准备记录擂台上的变化
int max = arr[0];
//遍历数组
for (int i = 0; i < arr.length; i++) {
//判断找出最大值
if (arr[i] > max){
max = arr[i];
}
}
//循环结束,输出比较后的值
System.out.println(max);
}
}
2.求和并统计个数
package anli;
import java.util.Random;
/*需求:生成10个1~100之间的随机数存入数组
1.求出所有数据的和
2.求所有数据的平均数
3.统计有多少个数据比平均值小
*/
public class anli6 {
public static void main(String[] args) {
//定义数组
int [] arr = new int[10];
//生成随机数,把随机数存入数组中
Random r = new Random();
//生成10次
for (int i = 0; i < arr.length; i++) {
int number = r.nextInt(100) + 1;
arr[i] = number;
}
//求和
int sum = 0;
//遍历数组
for (int i = 0; i < arr.length; i++) {
//循环每一个元素
//并把元素累加起来
sum = sum + arr[i];
}
System.out.println("数组中所有元素的和"+ sum);
//2.求所有数据的平均数
int avg = sum / 10;
System.out.println("平均数为"+ avg);
//3.统计有多少个数据比平均值小
//统计变量
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] < avg){
count++;
}
}
//循环结束之后,就表示已经找到了比平均值小的数字的个数
System.out.println("在数组中低于平均数的数字一共有"+ count +"个");
//遍历数组验证答案
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
}
3.交换数据
package anli;
//需求:定义一个数组,存入1,2,3,4,5.按照要求交换索引对应的元素
//交换前:1,2,3,4,5
//交换后:5,4,3,2,1
public class anli7 {
public static void main(String[] args) {
//定义一个数组
int [] arr = {1,2,3,4,5};
//利用循环去交换数据
for (int i = 0 , j = arr.length - 1;i < j; i++ , j--){
//利用第三方变量进行交换
//交换变量i和变量j指向的元素
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//当循环结束,那么数组中的数据就实现了头尾交换
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
}
}
4.打乱数组中的数据
package anli;
import java.util.Random;
//需求:定义一个数组,存入1~5.要求打乱数组中所有数据顺序
public class anli8 {
public static void main(String[] args) {
//定义数组
int [] arr = {1,2,3,4,5};
//循环遍历数组,从0索引开始打乱数据的顺序
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
//生成一个随机索引
int randomIndex = r.nextInt(arr.length);
//拿着随机索引指向的元素跟i指向的元素进行交换
int temp = arr[i];
arr[i] = arr[randomIndex];
arr[randomIndex] = temp;
}
//当循环结束后,数组中的所有数据就已经打乱了
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}