数组
所谓的数组指的就是一组相关类型的变量集合,并且这些变量可以按照统一的方式进行操作。数组本身
属于引用数据类型,那么既然是引用数据类型,这里面实际又会牵扯到内存分配,数组变量是引用(地址)型变量
数组相关概念:
数组名,元素,角标、下标、索引 数组的长度:元素的个数 length
数组的特点: 数组是有序排列的 数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型 创建数组对象会在内存中开辟一整块连续的空间 数组的长度一旦确定,就不能更改。
数组的分类
按照维数:一维数组、二维数组、... ... 按照数组元素的类型:基本数据类型元素的按钮、引用类型元素的数组
数组的定义
1、声明并开辟数组
2、静态初始化数组 数组先开辟内存空间,而后再使用索引进行内容的设置,实际上这种做法都叫做动态初始化,而如果希
望数组在定义的时候可以同时出现设置内容,那么就可以采用静态初始化完成。
数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。 数组的特点:数组长度是固定的。 注:使用new关键字分配内存时,简单类型的数组中的元素都有初始值 数组元素的默认初始化值
数组元素是整型:0
数组元素是浮点型:0.0
数组元素是char型:0或'\u0000',而非'0' 数组元素是boolean类型:false,Oracle的JVM中采用byte[]方式进行存储
1 2 3 4
元素类型[] 数组名 = new 元素类型[元素个数或数组长度]; 示例:int[] arr = new int[5];
初始化操作
arr[0]=10;
1 2 3
元素类型[] 数组名 = new 元素类型[]{元素,元素,......};
int[] arr = new int[]{3,5,1,7};
int[] arr = {3,5,1,7};
数组内存分配
数组是对象,也就是说可以以操作对象的方式来操作数组。并且数组在虚拟机中有它特别的类型。 既然是对象,遵循Java语言中的规则所有类的顶层父类都是Object。数组的顶层父类也必须是 Object,这就说明数组对象可以向上直接转型到Object,也可以向下强制类型转换,也可以使用 instanceof关键字做类型判定
String[]的直接父类就是Object而不是Object[]。可是Object[]的引用也可以指向String[]类型的对 象。数组类直接继承了Object,关于Object[]类型的引用能够指向String[]类型的对象,这种情况只 能是Java语法之中的一个特例,并不是严格意义上的继承。也就是说,String[]不继承自Object[], 但是我可以允许你向上转型到Object[],这种特性是赋予你的一项特权。
数组类直接继承了Object,关于Object[]类型的引用能够指向String[]类型的对象,这种情况 只能是Java语法之中的一个特例,并不是严格意义上的继承。也就是说,String[]不继承自 Object[],但是我可以允许你向上转型到Object[],这种特性是赋予你的一项特权。
如果有两个类A和B,如果B继承extends了A,那么A[]类型的引用就可以指向B[]类型的对 象。
数组操作方式
数组的访问通过索引完成,即:数组名称[索引],但是需要注意的是,数组的索引从0开始,所以索 引的范围就是0 ~ 数组长度-1,例如开辟了3个空间的数组,所以可以使用的索引是0,1,2,如果此 时访问的时候超过了数组的索引范围,会产生ArrayIndexOutOfBoundsException 异常 当数组采用动态初始化开辟空间后,数组里面的每一个元素都是该数组对应数据类型的默认值 数组本身是一个有序的集合操作,所以对于数组的内容操作往往会采用循环的模式完成,数组是一 个有限的数据集合,所以应该使用 for 循环
在 Java 中提供有一种动态取得数组长度的方式:数组名称.length; 数组遍历通常使用for循环来实现。也可以用foreach实现
1 2 3 4 5 6
7 8 9
10 11
int a=100;
int[] arr1={a,2,6,7,9,4};
int[] arr2=new int[]{a,2,6,7,9,4};
int[] arr3=arr1;
System.out.println(arr); //输出默认格式为:元素数据类型@数据的hash地址值。类似的还有md5、sha-1、sha-256等消息摘 要算法
for(int i=0;i<arr1.length;i++)
System.out.println(arr1[i]);
System.out.println(Arrays.toString(arr1));