Java基础知识(五)
数组的概述
1、数组:存储相同数据类型的容器
2、没有数组的情况
如果需要定义多个数据,只能int a,int b一直进行定义,而且数据和数据之间没有关系,只能通过变量名进行获取,非常的不方便
3、有数组的情况
如果需要定义多个数据,可以创建一个容器,将数据存储到容器里面,数组里面都是有索引的,通过数组名和有规律的索引去访问到每一个元素,这个容器就是数组
通过有规律的索引去访问没有规律的元素
数组的定义
1、格式
元素的数据类型[] 数组名称 = new 元素的数据类型[数组的长度];
int[] arr = new int[3];
2、解释
1、元素代表数组存储的数据

2、元素的数据类型,数据存储数据的类型
3、[] 代表的是一位数组
4、数组名称,合法的标识符,给变量取名,第一个单词全部小写,从第二个单词开始,首字母大写,其他字母小写
5、= 赋值符号,将右边的数据赋值给左边的变量
6、new 数组是一个引用类型,存储在堆内存里面,new 就相当于在堆内存里面开辟一段空间
7、第二个元素的数据类型要跟第一个元素的数据类型保持一致
8、数组的长度:定义数组的大小,如果定义为3,数组只能存储三个元素
9、元素一旦创建,长度是不可以改变的
3、直接打印数组的结果 [I@15db9742
1、数组是一个引用类型,直接打印的话打印的是数组的地址,而不是数组中元素的值
2、[ 代表的是一位数组
3、I 数组的类型是int
4、@ 代表普通的分隔符
5、15db9742: 通过hashcode方法算出的哈希值,在转成16进制的数字
6、以后给这一串数字和符号叫做数组的地址
class Demo01_数组的定义 {
public static void main(String[] args) {
//定义一个数组
int[] arr = new int[3];
System.out.println(arr);
}
}
数组的初始化
1、初始化:在创建数组的时候进行初始化,jvm好分配多大的内存空间
2、分类
1、动态的初始化
2、静态的初始化
3、动态初始化
1、创建数组的时候并不知道要给元素赋什么值,等创建数组完毕的时候,在对数组的元素进行一一赋值
2、元素的数据类型[] 数组名称 = new 元素的数据类型[数组的长度];
int[] arr = new int[3];
3、数组的长度一定要给,数组创建好之后,长度是不能改变的
4、数组的赋值 通过数组名和索引相结合的方式进行赋值
5、索引:下标、角标 从0开始,到数组的长度-1结束
第一个元素的索引是0,第二个元素的索引1 最后一个元素的索引是长度-1
6、数组名[索引] = 要赋的值;
7、如果是int类型的数组元素没有进行赋值,默认值就是0
4、静态初始化
1、在创建数组的时候,就叫里面的元素进行赋值
2、格式
元素的数据类型[] 数组名称 = new 元素的数据类型[]{元素的罗列};
int[] arr = new int[] {2,5,7};
3、元素罗列的数据类型必须跟前面声明的元素数据类型保持一致
4、元素的罗列通过逗号进行分割,最后一个元素不要给逗号
5、=号后面的中括号千万不要给长度
6、静态初始化的简写格式
元素的数据类型[] 数组名称 = {元素的罗列};
int[] arr = {1,2,3};
7、如果使用简写的方式,不能将数组的声明和数组的赋值分类开来
int[] arr; arr = new int[]{1,2,3}; 正确
int[] arr; arr = {1,2,3}; 错误
class Demo02_动态初始化 {
public static void main(String[] args) {
//动态初始化
int[] arr = new int[3];
//打印第一个元素 数组名[索引]
System.out.println(arr[0]);
//打印第二个元素
System.out.println(arr[1]);
System.out.println(arr[2]);
//对数组中的元素进行赋值
arr[0] = 100;
arr[1] = 200;
arr[2] = 300;
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
class Demo03_静态初始化 {
public static void main(String[] args) {
//静态初始化
int[] arr = new int[]{
1,2,3};
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//对元素进行重新赋值
arr[0] = 100;
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//静态初始化的简写格式
int[] arr1 = {
2,3,4};
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr1[2]);
System.out.println("---------------------------------");
/*int a; 变量的声明
a = 10; 变量的赋值*/
//数组的声明
int[] arr2;
//对数组进行赋值
arr2 = new int[] {
2,3,4};
System.out.println(arr2[0]);
//如果使用简写的格式,不能将数组的声明和赋值分离开来
/*int[] arr3;
arr3 = {1,2,3}; 错误*/
}
}
数组的遍历
1、遍历:一个一个的去经历元素,每个元素都访问一遍
2、索引,下标、角标、脚标
1、从0开始,到arr.长度-1结束
2、获取数组的长度:数组名称.length
3、访问对应索引的元素:数组名称[对应的索引]
class Demo06_数组的遍历 {
public static void main(String[] args) {
//使用静态初始化的简写方式
int[] arr = {
1,2,3,4,5,6,7,84,900,10,11};
//对数组进行遍历,一个个访问里面的元素 .length
for(int i = 0; i <= arr.length - 1; i++) {
System.out.print(arr[i] + "...");
}
System.out.prinln();
}
}
数组中容易出现的两个异常
1、异常:程序中的错误,当程序出现了跟生活中不符合的情况,没有必要让程序继续运行下去了,就抛出异常,让程序进行停止
2、两个异常
数组索引越界异常
空指针异常
3、数组索引越界异常
4、异常的原因
数组定义好之后,索引的范围0----arr.length - 1,访问了除了0—arr.length-1之外的索引,就会发生数组索引越界异常
5、避免
不访问奇奇怪怪的索引,只访问0----arr.length - 1的索引
6、空指针异常
[
7、发生异常的原因
null表示栈内存的引用不指向堆内存的任何数据,还强行去访问数组中的元素,只能报一个空指针异常
指针:在java中是不能直接操作内存的,c语言可以直接操作内存,通过hashcode算出的数字进行封装,以后就把这串数字叫做引用类型的地址
8、避免空指针异常
判断是否为空,如果不为空的时候,我才去访问数组中的元素,是空的话,就不进行访问
求一个数组的最大值
1、定义一个数组: int[] arr = {2,3,41,45,6789,45};求出这个数组的最大值
2、步骤
定义一个变量表示最大值,默认第一个元素就是最大值
循环变量数组,从第二个元素开始,跟最大值进行比较,如果它比最大值还要打,它就是最大值
循环遍历结束之后,max就是最大值
class Demo09_求数组的最大值 {
public static void main(String[] args) {
int[] arr = {
-1,-12,-234,-456,-789,-2000};
//定义变量max
int max = arr[0];
//遍历arr
for(int i = 1; i <= arr.length - 1; i++) {
//让arr[i]跟max进行比较
if(arr[i] > max) {
max = arr[i];
}
}
System.out.println(max);
}
}
查找指定元素的索引
1、给定一个数组(元素没有相同的),给定一个数,找出这个数在该数组中的位置
要求:将该功能定义成方法
import java.util.Scanner;
class Demo10_找出指定数在数组中的位置 {
public static void main(String[] args) {
//定义一个数组
/*int[] arr = {1,2,3,45,56,78};
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数字:");
int n = sc.nextInt();
//遍历数组
for(int i = 0; i < arr.length; i++) {
if(arr[i] == n) {
System.out.println(i);
return;
}
}
System.out.println("没有该数字");*/
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数字:");
int n = sc.nextInt();
int[] arr = {
1,2,3,45,56,78};
int index = getIndex(arr,n);
System.out.println(index == -1 ? "找不到该元素" : index);
}
/*
参数列表 数组 n
返回值 索引 int
*/
public static int getIndex(int[] arr, int n) {
for(int i = 0; i <= arr.length - 1; i++) {
if(arr[i] == n) {
return i;
}
}
//找不到return -1
return -1;
}
}