数组的基本概念及作用:
1.数组是相同数据类型元素的集合。
2.数组不同于基本数据类型,是一种引用数据类型,即数组也是可被创建的对象,作为一种基本容器,数组可以存储同一基本数据类型,也可以存储对象
3.数组是一种特殊的数据结构,数组在内存中是一片连续的存储空间。
数组的特点和声明
数组的大小一旦声明便不可更改,数组名既是数组在内存中的首地址。
可以通过数组下标(索引)访问存储在数组中的元素;需要注意的一点是:这里的下标是从0开始的,而实际的物理顺序是从1开始的!
下面是数组的第一种声明方式:
此种方式一般用于已知存储大小,内容未定的情况,未给定初始值时,数组会自动以默认值填补。
例:
int[] a=new int[10];
这里声明了一个大小为10的数组a,数组a是int类型数组,由于未进行赋值,数组会自动用0进行填充,数组的声明过程实质上是申请一片了以数组名a为首地址的连续存储空间,根据数组类型会进行默认值填充。
如下代码可进行验证
System.out.println(a.length); System.out.println(Arrays.toString(a));
需要注意的一点是在JAVA中System.out.print()语句默认输出的是对象在数组中的存储地址,即对象的Hash值,对于数组这一引用类型,需要调用Arrays.toString()方法.
Arrays.toString()会以String的形式返回数组中存储的数据
第二种声明方式:
该种方式可直接进行数组元素的初始化,不需要指定数组的大小,适用于存储内容已知的情况
int[] b=new int[]{1,2,3,4};
第三种声明方式:
String[] str={"我",“是”,“中”,“国”,“人”};
查看str数组的hash值
System.out.println(str.hashcode());
需要注意的一点是对于String类型的数组,当str为空时,数组会全部以null这一关键字进行填充.
数组元素的访问,以及数组对象属性探究:
数组对象的存储能力是有限的,不仅受到存储类型的影响,在实际运用中还会受到系统等硬件的影响。
1.数组的存储上限
以int举例:
可通过Integer.MAX_VALUE获得int数组的存储上限
实际上,由于操作系统的限制,以及内存碎片化的影响,往往无法申请到Integer.MAX_VALUE个连续的存储空间.
数组常被广泛用于排序和查找等数据整理工作
这里介绍十大常用排序算法中较为基础的两种:
冒泡排序,利用循环嵌套实现代码如下:
这里使用循环生成0-7的数组
int[] array2=new int[8];
for (int i = 0; i < array2.length; i++) { array2[i]=i+1; }
该算法的特点是原始数组有序程度越高,该算法的时间复杂度越高,最多需要比较数组.length-1趟.
for (int i = 0; i < array2.length-1; i++) { for (int j = 0; j < array2.length-(i+1); j++) { //降序排序 if(array2[j]<array2[j+1]){ //设置中间值保存变量 int middlevalue=array2[j]; array2[j]=array2[j+1]; array2[j+1]=middlevalue; } } }
选择排序:
该算法的基本思想为:
每次选出第i+1大/小的元素并放入i位置,该算法与冒牌排序相反,原始数据有序程度越高,该算 法时间复杂度越低
升序排列实现代码如下:
for (int i = 0; i < array2.length-1; i++) { //array[j]存储的是被比较元素 for (int j = i+1; j < array2.length; j++) { if (array2[i]>array2[j]){ int middlevalue=array2[i]; array2[i]=array2[j]; array2[j]=middlevalue; } } System.out.println("第"+(i+1)+"次排序结果为:"); System.out.println(Arrays.toString(array2)); }
最后简单介绍一下二维数组的声明与遍历:
int[][] array3=new int[4][]; //此时array3的存储情况为:{null,null,null,null} //具体创建array3中的一维数组 for (int i = 0; i < array3.length; i++) { array3[i]=new int[array3.length]; }
二维数组创建完毕后使用两种方式对二维数组进行遍历:
1.将Arrays.toString()方法放入循环内部,通过数组下标i进行遍历,但这是一种较为粗糙的遍历,只能进行简单地提取,无法对单个元素进行操作。
for (int i = 0; i < array3.length; i++)
{ System.out.println(Arrays.toString(array3[i])); }
2.通过循环嵌套进行逐个遍历
通过循环嵌套进行遍历 for (int i = 0; i < array3.length; i++) { for (int j = 0; j < array3[i].length; j++) {
System.out.println(array3[i][j]+" ");
}
System.out.println(); }
在进行遍历时,需要注意经常会出现各种异常,其中以数组下标越界(也成数组下标不合法)最为常见,这种错误在循环嵌套时最容易出现。