Java数组

1.数组的概念

什么是数组,一组数据,一堆数据:

         所谓数组,是在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种数据形式。这些按一定顺序排列的同类型数据的集合称为数组。而数组中的每一个数据称之为数组元素,数组中的元素以索引来表示其存放的位置,索引从0开始,步长是1,有点像Excel表格的行号,逐行递增。 好比宾馆的房间.

2.数组的定义:

方式1: 数组元素的类型[]  数组名;   int[] ages;推荐的. 可以吧int[]看成是一种数据类型,int类型的数组类型.
方式2: 数组元素的类型  数组名[];    int ages[];
数组必须先初始化,才能使用,因为初始化表示在内存中分配空间
.

3.数组的初始化

Java中数组必先初始化后才能使用,所谓初始化就是给数组元素分配内存,并为每个元素赋初始值。
初始化数组的两种方式:
静态初始化;
动态初始化;

无论,以哪种方式初始化数组,一旦初始化完成,数组的长度就固定了,不能改变,除非重新初始化。也就是说数组是定长的。
数组是定长的: 数组一旦初始化成功,数组中的元素个数就已经固定了,不能更改,如果需要更改,只能重新做初始化.


数组的静态初始化操作:
   特点:有我们自己来为每一个数组元素设置初始化值,而数组的长度由系统(JVM)决定.
语法:
   数组元素类型[]  数组名 = new 数组元素类型[]{元素1,元素2,元素3,.......};
举例:
   int[] nums = new  int[]{1,3,5,7,9};
简单写法,必须声明之后,立刻初始化,不能先声明后初始化:
    int[] nums = {1,3,5,7,9};


4.数组的动态初始化

数组的动态初始化操作:
    由我们来设置数组的元素个数(数组长度),而每一个数组元素的初始值有系统决定.
语法:
    数组元素类型[]  数组名 = new  数组元素类型[ length ];
    比如:
    int[] ages = new  int[100];
-------------------------------------------------------------
  int[] nums = new  int[5]{1,3,5,7,9};//写法是错误的,不能同时使用静态初始化和动态初始化.
-------------------------------------------------------------
什么时候使用静态初始化,什么时候使用动态初始化.
当我们事先知道,需要存储哪一些数据的时候,选用静态初始化.
当我们事先不知道,需要存储哪些数据的时候,只能使用动态初始化
.



5.数组的基本操作

数组的基本操作:
1:数组基本操作:
       获取元素:          元素类型 变量 =  数组名[index];
       设置元素:          数组名[index] = 值;
       遍历数组元素: 建议使用for循环,事先知道循环的次数.
       数组长度:  int len = 数组名.length;  length是属性,不是方法.
       索引范围:  从0开始,逐一递增.   [0,数组名.length-1]
2:操作数组常见异常:
       NullPointerException:空指针异常(空引用).
            当数组还未初始化,就直接操作数组.
        String[] bs = null;
        System.out.println(bs.length)
       ArrayIndexOutOfBoundsException:数组的索引越界异常.
3:获取数组最大最小元素(getMax,getMin).
	//获取数组最大值
	static int getMax(int[] arr){
		int max = arr[0];
		for(int i = 1;i < arr.length;i++){
			if(arr[i] > max){
				max = arr[i];
			}
		}
		return max;
	}

4:打印数组元素:
       直接打印数组的时候,打印出来是hashCode值,如[I@7439aca7.
       我们不喜欢,我们想打印数组的时候,把该数组的元素打印出来.
        String[] arr = {"A","B","C","D","E"};
定义方法打印:
字符串表示形式由数组的元素列表组成,括在方括号("[]")中。相邻元素用字符 ", "(逗号加空格)分隔。
打印格式:[A, B, C, D, E]
	//打印数组(int类型的数组,你也可以写一个String类型的数组)
	static void printArray(int[] arr){
		System.out.print("[");

		for(int i=0;i < arr.length ; i++){
			System.out.print(arr[i]);

			if(arr[i] != arr[arr.length-1] ){
				System.out.print(",");
			}
		}

		System.out.print("]");
	}

5:逆序排列数组元素:
        原数组:[1, 2, 54, 5, 6]
        逆序操作
        新数组:[6, 5, 54, 2, 1]
	//逆序打印数组
	static void reverse(int[] arr){
		System.out.print("[");
		
		for(int i = arr.length-1 ; i>=0 ; i--){
			System.out.print(arr[i]);

			if(arr[i]!=arr[0]){
				System.out.print(",");
			}
		}

		System.out.print("]");
	}

6:元素出现索引(第一次),线性搜索.
         int[] arr = {10,20,30,10,50,-30,10};
         获取元素10在arr数组中第一次出现的索引(indexOf):   0
	//元素在数组中第一次出现的索引
	static int indexOf(int[] arr, int key){
		for (int i = 0 ;i< arr.length ;i++ )
		{
			if(key==arr[i]){
				return i;
			}
		}
		return -1;
	}

6.多维数组

前面说了,数组是多个数据的集合.
int[] arr = new int[] {1,3,5,7,9};
如果现在有多个数组,我想把多个数组保存在一个集合中,此时我又应该如何完成.
int[] arr1 = {1,2,3};
int[] arr2 = {4,5};
int[] arr3 = {6};
把上述的每个数组都作为一个元素,那么此时元素的类型为:int[].
------------------------------------------------------------------------------
数组的语法:
数组元素类型[] 数组名;
int[][]  arr = new int[][]   {
arr1 ,arr2,arr3
};
int[][]  arr = new int[][]   {
{1,2,3} ,
{4,5},
{6}
};
------------------------------------------------------------------------------
一维数组:数组中的每一个元素都是一个值(基本类型和引用类型的值).
二维数组:数组中的每一个元素又是一个一位数组.
三维数组:数组中的每一个元素又是一个二维数组.
-------------------------------------------------------------------------------
严格上说,在Java中不存在多维数组的概念,和C语言做区分,一般称之为数组中的数组.

二维数组的初始化操作:
静态初始化:
int[][]  arr = new int[][]   {
{1,2,3} ,
{4,5},
{6}
};
动态初始化:
int[][]  arr = new int[3][5] ;创建一个长度为3的二维数组,每一个元素(一维数组)的长度为5.
int[][]  arr = new int[0][5] 
-------------------------------------
针对于N维数组,需要N个循环嵌套.

7.java5对数组的新语法支持

增强for循环-foreach:
我们在使用循环迭代数组的时候,往往是不关心迭代变量(数组的索引),有没有更好的方式,迭代数组元素的时候,就只操作数组元素,不去操作数组的索引.
从Java5开始(JDK1.5)开始,Java提供了一种新的语法:增强for循环(foreach).
语法:
for(数组元素类型 变量  :   数组名)
{
       循环体
}
-----------------------------------------------------------
通过反编译工具查看字节码,发现foreach其实在底层依然是使用for循环+索引来操作数组的.
我们把增强for循环,称之为编译器的新特性---->语法糖.
语法糖的最大甜头就是:让开发者写更少,更简单的代码,完成相同的功能.
-----------------------------------------------------------
for循环功能比foreach更彪悍.
------------------------------------------------------------
如果迭代数组元素,而不关心数组的索引的时候,首选使用foreach.

class ArrayDemo2 
{
	public static void main(String[] args) 
	{
		int arr[] = {1,4,6,6,723,3,4,54,4};

		for(int a : arr){
			System.out.print(a);
		}
	}
}
方法的可变参数:
Java5的另一个新特性,方法的可变参数,说的是参数的个数可变.
定义: 方法名(参数类型 ...参数名){}
比如: getSum(double ... arr){}
class ArrayDemo3 
{
	public static void main(String[] args) 
	{
		double[] arr = {10.0,3.0,8.0,33.0,66.0};

		System.out.println(getSum(arr));
		System.out.println(getSum2(10.0,3.0,8.0,33.0,66.0));
	}

	//原始的方法,需要传入一个数组的实参
	static double getSum(double[] arr){
		double sum = 0.0;
		for(double a : arr){
			sum+=a;
		}

		return sum;
	}
	//方法的可变参数,可以传入任意多个值
	static double getSum2(double ... arr){
		double sum = 0.0;
		for(double a : arr){
			sum+=a;
		}

		return sum;
	}
}
方法的可变参数,其实也是一个语法糖,编译器级别的新特性,让开发者写代码更简单.
方法的可变参数其底层是就是一个数组类型.
可变参数必须作为方法的最后一个参数,避免参数的歧义性.
  推论:方法最大只有一个可变参数.

8.数组工具类

数组的算法操作,使用太频繁了,SUN公司就直接在JDK中提供了一个数组的工具类(Arrays).
java.util.Arrays类:
几个重要的方法
int binarySearch(type[] arr,type key)使用二分法查找数组里某元素并返回其索引,若找不到返回负数.
void sort(type[] arr)使用调优后的快速法对指定数组排序。
String toString(type[] arr)返回指定数组内容的字符串表示形式。
public static type[] copyOf(type[] original, int newLength)复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。
---------------------------------------------
使用注意:必须java.util.Arrays.方法(参数);
class ArraysDemo 
{
	public static void main(String[] args) 
	{
		int[] arr = {1,5,6,89,54,3,456,3234};
		
		//数组打印
		System.out.println(java.util.Arrays.toString(arr));
		
		//数组排序
		java.util.Arrays.sort(arr);
		
		//排序后打印
		System.out.println(java.util.Arrays.toString(arr));
		
		//二分法查找指定元素在数组中的索引(注意:该数组必须是有序的)
		int index=java.util.Arrays.binarySearch(arr,456);
		System.out.println(index);
		
		//数组的复制
		int[] arr2 = java.util.Arrays.copyOf(arr,4);
		//复制后打印该新的数组
		System.out.println(java.util.Arrays.toString(arr2));
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值