Java基础系列二之数组

数组

概念:存储多个元素并且多个元素是同一种类型的容器

数组的定义:

                  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]+" ");
			}
		}
	}
}


 










猜你喜欢

转载自blog.csdn.net/qq_40727767/article/details/79885791
今日推荐