数组
概念:存储多个元素并且多个元素是同一种类型的容器
数组的定义:
1)数据类型[] 数组名;
2)数据类型 数组名[];
举例:
int[] a 定义了一个int类型的数组变量a /*推荐使用*/
int a[] 定义了一个int类型变量a数组
这两种方式的定义虽然写法不一样,读法不一样,但是表达的效果一样,都是在定义一个数组,推荐使用第一种方式;
数组的初始化:
1)动态初始化: 给数组指定长度,数组中的元素值由系统默认给定
2)静态初始化: 给定数组元素的值,数组的长度由系统给定;
动态初始化: 数据类型[] 数组名 = new 数据类型[数组长度] ;
举例: int[] arr = new int[3] ;
int[] arr ;
System.out.println(arr);
没有被初始化的数组是不能使用的
Java内存分配空间图解
分析数组初始化语句:
int[] arr = new int[3] ;
左边: 1)int[]: 定义的是一个int类型的数组
2)arr: 数组名称
右边:
1)new :创建一个数组对象(它会在堆内存中创建)
2)int[]: 当前int类型的数组
3) 3: 当前数组的长度是3
如何获取数组中的元素
通过数组名称获取
格式:
数组名称[索引值],索引值从0开始,最大的索引值为数组长度-1(数组的长度为数组名.length)
举例:
int arr[]=new arr[3];
System.out.println(arr[0]); //输出第一个数组元素
System.out.println(arr[1]); //输出第二个数组元素
System.out.println(arr[2]); //输出第三个数组元素
需求:
1)创建一个数组,先输出数组名称和它的元素值
2)给当前数组中的某些元素进行赋值,然后再输出数组名称和元素值
代码:
Java两个数组的内存分配图解
需求:
1)创建两个数组,分别输出数组名称和数组中的元素
2)给两个数组中的某些元素进行赋值,再次分别输出数组名称和数组中元素
Java三个数组的内存分配图解
需求:
1)创建两个数组,分别输出数组名称和元素,给前两个数组进行赋值;
2)创建第三个数组,将第一个数组的名称赋值给第三个数组,通过第三个数组的名称进行赋值,输出第一个数组的元素
代码:
数组的静态初始化
指定数组的元素,长度由系统给定
原始格式:
数据类型[] 数组名称 = new 数据类型[]{元素1,元素2,元素3....} ;
简写方式:
数据类型[] 数组名称= {元素1,元素2,元素3..} ;
举例:
int[] arr = new int[]{1,2,3} ;
int[] arr = {1,2,3} ;
int[] arr = new int[]{21,432,543,764};
注意!!!
这种方式错误:动静结合。定义数组要么动态初始化,指定长度,要么静态初始化,指定数组元素。
int[] arr2 = new int[3]{1,2,3} ;
代码:
数组中经常会出现的异常:
ArrayIndexOutOfBoundsException:数组角标越界异常
出现的原因:访问了数组中不存在的索引值;
解决方案:观察数组中到底有索引值到多少; 数组长度-1
NullPointerException:空指针异常 (在实际开发中该异常是最多的)
出现的原因:对象为null,而开发者还要去使用对象,就会出现问题
解决方案:给某个对象进行非空判断。
OOM异常:OutOfMemory:内存溢出 Android 解决加载大量图片的问题:图片加载器:ImageLoader等等防止程序空 指针异常
对于异常:
1)将从头到尾遇见的异常建立文档;
2)出现该异常的原因;
3)如何解决异常;
Test代码:
1)
package org.westos.array;
/**
* 数组中的应用:
* 给定一个数组,静态初始化的,遍历这个数组;
* @author Administrator
*
*/
public class ArrayTest {
public static void main(String[] args) {
//定义数组,静态初始化
int[] arr = {11,22,33,44,55} ;
/**
* 获取数组中的元素值,通过数组名称[索引]获取
*/
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]);
System.out.println("----------------------");
//遇见这种重复性高的代码,可以采用for循环 :循环的思想
for(int x = 0 ; x < 5 ; x ++) {
System.out.println(arr[x]);
}
System.out.println("----------------------");
int[] arr2 = {11,22,33,44,56,78,23,10,20,30} ;
//如果数组中的元素非常多,元素个数非常麻烦
/**
* 针对这种情况,Java提供数组的属性:lenth属性
* 获取数组中的长度
*/
System.out.println(arr.length);
System.out.println(arr2.length);
System.out.println("----------------------");
//将上述代码继续改进,使用数组的长度进行操作
for(int x = 0 ;x < arr.length ; x ++) {
System.out.println(arr[x]);
}
//继续改进:学习方法,所以将遍历的功能写成一个独立的代码块
//调用
printArray(arr2);
System.out.println("------------------------");
printArray(arr) ;
System.out.println("------------------------");
//遍历数组之后:[11, 22, 33, 44, 55]
printArray2(arr);
printArray2(arr2);
}
/**
* 定义方法:两个明确
* 1)返回值类型: 没有具体返回值:void
* 2)参数类型:int类型数组
*
*/
public static void printArray(int[] arr) {
for(int x = 0 ; x < arr.length ; x ++) {
System.out.println(arr[x]);
}
}
//最终改进:
public static void printArray2(int[] arr) {
//左中括号
System.out.print("[");
for(int x = 0 ; x < arr.length ; x ++) {
//判断当前x是否是最后一个索引
if(x==arr.length-1) {//如果是最后一个索引
System.out.println(arr[x]+"]");
}else {
System.out.print(arr[x]+", ");
}
}
}
}
2)
package org.westos.array;
/**
* 数组中的最值应用:
* 自定义一个数组,静态初始化,求数组中的最大值或者最小值;
*
* 分析: 最大值:
* 1)定义一个数组,静态初始化
* 2)定义一个参照物,分别和数组中的其他元素进行比较,如果后面的元素都大于参照物,将后面作为参照物作为最大值
* 3)输出
* @author Administrator
*
*/
public class ArrayTest2 {
public static void main(String[] args) {
//定义一个数组
int[] arr = {13,98,24,30,10} ;
//定一个参照物,假设参照物就是最大值
int max = arr[0] ;
//从1开始遍历其他元素
for(int x = 1 ; x < arr.length ; x ++) {
//获取每一个元素
//依次和参照物进行比较,如果后面的元素都大于参照物,将后面作为参照物作为最大值
if( arr[x] > max) {
//将arr[x]赋值给max
max = arr[x] ;
}
}
//输出
System.out.println("最大值是:"+max);
System.out.println("------------------------------");
int max2 = max(arr) ;
System.out.println("最大值是:"+max2);
}
/**
* 定一个方法
* 两个明确:
* 1)明确返回值类型: int类型
* 2)明确参数类型:int[] arr
*/
public static int max(int[] arr) {
//定义参照物
int max = arr[0] ;
//遍历其他元素
for(int x = 1 ; x < arr.length ; x ++) {
//获取到每一个元素,分别和参照物进行比较,如果大了,就作为最大值进行继续比较
if(arr[x] > max) {
max = arr[x] ;
}
}
return max ;
}
}
3)
package org.westos.array;
/**
* 定义一个数组,元素逆序
*
* 分析:
* 定义一个数组,静态初始化
* 将数组中0索引对应的元素和arr.length-1索引对应的元素进行互换
* 将1索引对应的元素和arr.length-1-1索引对应的元素进行互换
* ....
* 只要保证数组的长度arr.length/2
* @author Administrator
*
*/
public class ArrayTest3 {
public static void main(String[] args) {
//定义一个数组,静态初始化
int[] arr = {12,98,50,76,24,78} ;//78 24 76 50 98 12
System.out.println("遍历前:");
printArray(arr);
System.out.println("------------------");
System.out.println("逆序后:");
// reverse(arr);
revers2(arr);
printArray(arr);
}
/**
* 逆序的方法
* 1)明确:明确返回值类型 void
* 2)明确参数类型:int[] arr
* @param arr
*/
public static void reverse(int[] arr)
//使用中间的方式进行互换
//第一次交换
// int temp = arr[0] ;
// arr[0] = arr[arr.length-1-0] ;
// arr[arr.length-1-0] = temp ;
//
// //第二次互换
// temp = arr[1] ;
// arr[1] = arr[arr.length-1-1] ;
// arr[arr.length-1-1] = temp ;
//
// //第三次
// temp = arr[2] ;
// arr[2] = arr[arr.length-1-2] ;
// arr[arr.length-1-2] = temp ;
//第四次
//....
for(int x = 0 ; x < arr.length/2 ; x ++) {
int temp = arr[x] ;
arr[x] = arr[arr.length-1-x] ;
arr[arr.length-1-x] = temp ;
}
}
//方式2;
public static void revers2(int[] arr) {
for(int start = 0,end = arr.length-1 ; start<=end ;start++,end --) {
//temp中间变量
int temp = arr[start] ;
arr[start] = arr[end] ;
arr[end] = temp ;
}
}
//遍历数组的方法
public static void printArray(int[] arr) {
System.out.print("[");
for(int x = 0 ; x < arr.length ; x ++) {
//是否是最后索引对应的元素
if(x==arr.length -1) {
System.out.println(arr[x] +"]");
}else {
System.out.print(arr[x] +", ");
}
}
}
}
4)
package org.westos.array;
import java.util.Scanner;
/**
* 数组中的元素基本查找法: ----->数值中的元素的查找,查找的是该元素在数组中的索引
*
* 有一个字符串数组
* String[] str = {"星期一","星期二","星期三","星期四","星期五","星期六","星期天"} ;
*
* 键盘录入一个数据,查找值对应星期几..
*
* @author Administrator
*
*/
public class ArrayTest4 {
public static void main(String[] args) {
// int a ;//必须初始化,(在使用之前)
//定义一个字符串数组
String[] str = {"星期一","星期二","星期三","星期四","星期五","星期六","星期天"} ;
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//接收数据
System.out.println("请输入一个数据:(0-6):");
int index = sc.nextInt() ;
System.out.println("你要查找的是:"+str[index]);
}
}
5)
package org.westos.array;
/**
* 数组中的元素查找法(数组中的基本查找法)
* 定义一个数组,静态初始化,查找某个元素在该数组中第一次出现的索引
*
* 分析:
* 1)给出了数组
* 2)写一个查找数组中的元素的索引的方法
* @author Administrator
*
*/
public class ArrayTest5 {
public static void main(String[] args) {
//定义一个数组:
int[] arr = {200,250,38,101,300} ;
//需求1:查找250这个元素在数组中第一次出现的索引
int index = findIndex(arr, 250) ;
System.out.println("250元素在数组中第一次出现的索引是:"+index);
// //需求2:查找2500这个元素在数组中第一次出现的索引
int index2 = findIndex(arr, 2500) ;
System.out.println("2500元素在数组中第一次出现的索引是:"+index2);
int index3 = getIndex(arr, 38) ;
System.out.println("index3:"+index3);
int index4 = getIndex(arr, 380) ;
System.out.println("index4:"+index4);
}
/**
* 定义一个查找数组中元素的方法
* 两个明确
* 1)返回值类型:int
* 2)参数类型:int [] arr ,两个参数, 第二个参数:int value
*/
public static int findIndex(int[] arr,int value) {
//遍历arr数组元素
for(int x = 0 ; x < arr.length ; x ++) {
//判断:如果查找的元素恰好就是value值,那么直接返回该索引
if(arr[x] == value) {
return x ;
}
}
//不但要考虑找到的情况,还要考虑到找不到的情况
//在Java中,数组查找元素,如果找不到,返回-1 ,(找不到)
return - 1;
}
//方式2,假设法
public static int getIndex(int[] arr,int value) {
//如果没有找到这个元素,假设找不到
int index = -1 ;
//遍历数组
for(int x = 0 ; x < arr.length ; x ++) {
//获取到每一个元素,如果找到,修改索引值
if(arr[x] == value) {
//修改
index = x ;
break ;
}
}
return index ;
}
}
二维数组
二维数组的声明与实例化:
定义:
1)数据类型[][] 数组名=new 数据类型[行的个数][列的个数];
2)数据类型 数组名[][] = new 数据类型[m][n]
3)数据类型[] 数组名[] = new 数据类型[m][n]
访问二维数组元素的语法为:数组名[行的索引][列的索引];
初始化:
1)静态初始化
数据类型[][] 数组名称 = {{元素1,元素2,元素3},{....}} ;
代码实例:
public class ArrayDemo3 {
public static void main(String[] args) {
//定义一个二维数组,静态初始化
int[][] arr = {{1,2,3},{4,5},{6}} ;
System.out.println(arr);
System.out.println(arr[0][1]);
System.out.println(arr[1][1]);
System.out.println(arr[2][0]);
}
}
2)动态初始化
数据类型[][] 数组名 = new 数据类型[m][] ;
只给定m个一维数组,每一个一维数组的长度由动态给定
代码实例:
package org.westos.array;
/**
* 二维数组定义的第二种格式:
*
* 数据类型[][] 数组名 = new 数据类型[m][] ;
* 只给定有m个一维数组,每一个一维数组长度动态给定
* @author Administrator
*
*/
public class ArrayDemo2 {
public static void main(String[] args) {
//定义一个二维数组
int[][] arr = new int[3][] ;
System.out.println(arr);
//动态给定每一个一维数组的长度
arr[0] = new int[2] ;
arr[1] = new int[3] ;
arr[2] = new int[2] ;
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[0][1]);
System.out.println(arr[2][0]);
//赋值
arr[0][1] = 100 ;
arr[2][1] = 200 ;
System.out.println(arr[0][1]);
System.out.println(arr[2][1]);
}
}
获取二维数组的行数: 数组名.length;
获取二维数组的列数: 首先要确定是哪一行,因为二维数组每一行的元素个数不一定相同,再利用数组名[行的索引].length;
代码测试
package org.westos.array;
/**
* 关于二维数组的遍历
*
* 给定一个二维数组,静态初始化,遍历其中每个元素
* @author Administrator
*
*/
public class ArrayTest {
public static void main(String[] args) {
//定义一个二维数组,静态初始化
int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
//谁代表{1,2,3}
for(int x = 0 ; x < arr[0].length ; x ++) {
System.out.println(arr[0][x]);
}
System.out.println("---------------------");
//{4,5,6}
for(int x = 0 ; x < arr[1].length ; x ++) {
System.out.println(arr[1][x]);
}
System.out.println("---------------------");
for(int x = 0 ; x < arr[2].length ; x ++) {
System.out.println(arr[2][x]);
}
System.out.println("----------------------------");
//改进:通过外循环,arr.length :外层循环是二维数组的长度
for(int x = 0 ; x < arr.length ; x ++) {
for(int y = 0 ; y < arr[x].length; y++) {
System.out.print(arr[x][y]+" ");
}
}
System.out.println("----------------------------");
//最终版代码:定义一个遍历二维数组的功能
printArray2(arr);
}
/**
* 两个明确:
* 1)明确返回值类型:void
* 2)明确参数类型:int[][] arr
*/
public static void printArray2(int[][] arr) {
for(int x = 0 ; x < arr.length ; x ++) {
for(int y = 0 ; y < arr[x].length ; y++) {
System.err.print(arr[x][y]+" ");
}
}
}
}