数组
什么是数组?
数组是存放数据长度固定的容器,并且其数据类型也是一致的。
怎么声明数组?
下面这个就是声明数组的例子
int[] arr;
int 数组的数据类型,数组中要存储什么类型的数据
[] 代表它是一个数组
arr 数组的名字,自己定义的
数组怎么声明并初始化?
这里有三个方法:
方式一 静态初始化
数组的数据类型[] 数组名 = new 数组的数据类型[]{元素1,元素2,元素3...};
例:
int[] arr0 = new int[]{2,4,6,8};
这个数组有四个元素 所以它的长度为4
方式二 隐式初始化
数组的数据类型[] 数组名 = {元素1,元素2,元素3...}
例:
double[] arr1 = {2.2,3.3,4.4};
方式三 动态初始化
数组的数据类型[] 数组名 = new 数组的数据类型[长度];
数组名[下标] = 值;
[长度]:数组的长度,可以存放多少个元素
这里明确一个概念,数组的下标是从0开始计算的
例:
int[] arr2 = new int[3];//[3]代表这个数组可以存放3个元素
arr[0] = 2;//[0]代表数组的第1个数据 将2存进去到数组第1个位置
arr[1] = 4;//[1]代表数组的第2个数据 将4存进去到数组第2个位置
arr[2] = 6;//[2]代表数组的第3个数据 将6存进去到数组第3个位置
学会初始化和声明数组了,那么,要怎么样才可以输出数组呢?
我们访问数组一般都是通过下标(索引)来查找的
比如:
int[] arr = {3,6,9,12,15};
//我们用下标来找12,12的下标是多少呢,我们数组的下标都是自动从0开始的编号,
//所以12的下标为3 我们输出看看对不对
int res = arr[3];//这里用了一个变量接收了一下 是可以直接输出的
System.out.println(res);//输出12
下标
说到这里,你可能会问,下标是什么?
那么,就要记住了,下标简单来说是一个从0开始的编号,像上面这一段代码,3开始到15,下标依次编号为0、1、2、3、4
输出的时候,int res = arr[3];这里[]里面的下标为3,也就是对应数组中的“12”,所以会输出12
求数组长度
这里数组长度并不长,那如果有一个数组中,有n个数值,我们不知道有多少个呢?那我们怎么样可以知道这个数组有多长?
这里就会用到一个length语法
length怎么用呢?看一下就知道了:
//怎么知道数组的长度是多少,我们这里有一个长度属性length
//使用 数组名.length就可以了 数组最大下标为 数组名.length-1
int[] arr = {21,33,44,55,66,77};
int len = arr.length;
System.out.println(len);//结果为6 正是数组的长度
没错,在数组名后加一个.length就可以了,length就是他的长度,也就是数组里面有多少个数字
如何遍历数组?
什么是遍历?
所谓遍历 (Traversal),是指沿着某条搜索 路线 ,依次对树(或图)中每个节点均做一次访问。
也就是说,数组的遍历就是对数组中的每一个数进行一个输出!
我们之前学过循环了,现在用它来遍历数组
int[] arr = {12,34,65,76,89,99};
for(int i=0;i<arr.length;i++){
//数组的下标从0开始的我们将i设为0,arr.length数组的长度
System.out.println(arr[i]);//正确输出
}
这里,我们用for循环,来遍历数组,输出数组arr中所有的数
这里,我们可以看到,i<arr.length,也就是说,i<数组arr的长度,不会超出数组最大值,总不能数组中6个数,你却要他输出7个数吧!
因为数组下标,也就是数组中每个数的编号,是从0开始的,所有我们的循环里面i必须为0
输出时,System.out.println(arr[i])中,i会从0依次叠加到数组的最大下标,输出数组的所有数值
这里,提出一个问题:
怎么获取数组中最大的值?
先给出个思路:
先定义一个变量保存数组索引为0的元素,然后再使用循环遍历数组,在循环中将遍历到的元素和先前定义的变量比大小,如果大于变量,那就将变量交换为当前元素,直到循环结束,就可以找出最大值了
思路看不懂也没什么关系,跟着文章来
public static void main(String[] args) {
int[] arr = {3,5,6,8,9,7};
int max = arr[0];//定义变量,将数组下标为0的元素存入
for(int i=1;i<arr.length;i++){//因为下标为0的元素存入到变量中了,所以从下标1开始循环
if(max < arr[i]){//判断当前遍历到的元素是否大于变量max
max = arr[i];//如果大于变量max ,那就将当前遍历到的元素替换掉变量原先的值
}//如果不大于,继续循环
}
System.out.println(max);//最后输出结果 结果为:9
}
//最大值会求了 那最小值也同样的道理,还有求数组的总和都是一样的思路,大家自己去试一下
这里有一个循环,目的是什么呢?
这里我们可以看到,我们定义了一个空的最大值“max”
目的呢,就是利用循环,让数组中的每一个数值与最大值max(现在还是个空值)比较,利用if选择,在挨个进行比较时,当max这个数,小于数组中的数时,我们就将它与max交换,因为我们要保证max是数组中最大的那个数
挨个比较之后,就会输出max这个最大值了!
下面我们看一下经典的冒泡排序
什么是冒泡排序?
就是使用循环将数组中的元素按从大到小或从小到大排序好
这里,我也给个思路:
这里需要使用到两个for循环,外边的循环每循环一次就可以找到一个最大值
里边的循环每循环一次就产生一次对比,在内层循环中在判断前一个元素是否比后一个元素小,是的话互换位置,最后输出
这个可能会有一点难度,做好准备!
别着急,先看代码
public static void main(String[] args) {
int[] arr = {3,11,6,20,9,7};
//外层循环每循环一次确定一个最大的元素
for(int i=0;i<arr.length;i++){
//内层循环每循环一次产生一次对比
for(int j=0;j<arr.length-1;j++){
//将当前的元素与后一个元素比较
if(arr[j]<arr[j+1]){
//如果当前元素小于后一个元素 互换位置
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
//最后循环输出 从大到小排序
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
}
看到这个长度,哎,肯定不简单哪,不过,我们先来分析分析!
我们先来看看第一个循环,也就是外层循环,外层循环每进行一次啊,内层循环就进行一次比较,总共可以进行i<arr.length次比较
这里可能会有点迷糊,不用管他,慢慢摸索就可以
看看第二个循环,这个循环就是最关键的循环,利用if,使数组中前一个数值与后一个数组进行比较,如果,前一个元素比后一个数小,就将他们互换,记住是互换!
于是就会出现一个结果,有一个最小的数值被调换到了最后!
这里我们看看一张图
我将第一个循环注释掉了
这里我们发现,单纯第二个循环,只能将一个最小数值调换到最后
那么这里就体现了第一个循环(也就是外部循环)的作用,外部循环会让第二个循环,也就是内部循环再次执行
再次内部循环后
于是第二小的数值被调换到倒数第二个位置
外部循环i<arr.length次后,才可以利用内部循环全部将数组中的数从大到小依次排好
最后,利用循环,遍历数组并且输出
去掉外部循环的注释,我们运行一下看看!
这里从大到小排序成功了
那么,从小到大排序同理,相反的算法
不懂的话,慢慢摸索吧!
数组异常与错误
*数组角标越界异常java.lang.ArrayIndexOutOfBoundsException:
出现原因:访问了数组中不存在的角标值!
解决方案:更改角标在范围之内.
*空指针异常java.lang.NullPointerException
**出现原因:代码结构不严谨(某个对象已经为空)
**解决方案:需要给该对象进行非空判断!
面试题
*数组中有没有length属性,字符串中有没有length属性,集合中有没有length属性:
**数组中有length属性
**字符串中没有length属性:String类中有:length();
**集合中没有length属性:集合中:size();
文章到此结束,不懂可以评论哦!