Java数组

来源:互联网 发布:只有我知 杭州见面会 编辑:程序博客网 时间:2024/05/17 03:47

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));}}



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 跑步跑的腿疼怎么办 第一次去健身房练瑜伽不会怎么办 跑步过后腿筋疼怎么办 俯卧撑只能做20个怎么办 被裤裆峰咬了怎么办? 新兵5公里不想跑怎么办 老公掉粪坑了你怎么办 在部队被欺负了怎么办 衣服上的标志洗掉了怎么办 整件白衬衣被染怎么办 遇到敲诈小混混该怎么办 纯棉衣服洗长了怎么办 纯棉的衣服洗后长了怎么办 睡觉把脖子扭了怎么办 微信限额10万了怎么办 新兵条令背不下来怎么办 武警部队改革去年入伍的新兵怎么办 规培考试没考上怎么办 规培如果没考上怎么办 农民工集体讨薪 领导不在怎么办 卷闸门钥匙丢了怎么办 邻居把路堵了该怎么办 邻居家的盆栽对准我家大门怎么办 袜子掉到了楼下的阳台怎么办? 合租房没有阳台晒衣服怎么办 车门锁了钥匙在里面怎么办 邻居忘带钥匙你看见会怎么办 把车钥匙锁车里了怎么办 偷了东西不承认怎么办 孩子偷了东西不承认怎么办 公司员工偷了东西不承认怎么办 知道被谁偷了没有证据怎么办 被贼偷了知道是谁没有证据怎么办 前任要去部队闹怎么办 站久了腿粗怎么办 机械表表带长了怎么办 恶魔之眼褪色了怎么办 恶魔之眼掉色后怎么办 练瑜伽出汗瑜伽垫手滑怎么办 cf多出来的神器怎么办 脖子痛得低不了怎么办