数组概要Array
1、什么是数组
package a数组概要;
/*
*Array
* 1、Java语言中数组是一种引用数据类型,非基本数据类型。数组的父类是Object类
* 2、数组就像一个容器,可以同时容纳多个元素,即数组是一组数据的集合,字面意思:一组数据
* 3、数组之中可以存储基本数据类型的数据,也可以存储引用数据类型的数据
* 4、数组是引用数据类型,所以数组对象存储在堆内存中
* 5、数组当中存的是Java对象的话,实际上存的是对象的(引用)内存地址
* 6、Java中规定,数组一旦被创建,其长度不可被更改(数组长度不可变)
* 7、数组分一维数组、二维数组、三维数组....多维数组(一维数组使用较多,二维次之)
* 8、所有的数组对象都有length属性(Java自带),用来获取数组中元素的个数
* 注意:length是属性,不是方法,调用后面不带()
* 9、Java中数组中的数组元素类型要统一,如定义的是int类型数组只能存储int类型的数组元素,Person类型数组只能存储Person类型
* 例:某超市购物袋只能装苹果,不能苹果和橘子一起装
* 10、数组的内存存储方面,数组的元素内存地址(存储的每个元素都是有规则挨着排列的)是连续的,这是数组存储元素的特点
* 数组是一种简单的数据结构
* 11、所以数组都已第一个小方框(第一个数组对象)的内存地址作为整个数组对象的内存地址,
* 12、数组的每一个元素都有一个下标,其从0开始,以1递增;最后一个下标是length-1
* 下标非常重要,对数组中元素进行“存取”,都需要通过下标进行
* 13、数组的优缺点
*
* 优点:查询/查找/检索某个下表上的元素时效率极高,可以说查找效率最高的一个数据结构
* 为什么?
* 1.数组元素中的内存地址在空间存储上是连续的
* 2.数组元素类型相同,所占用的空间大小一样
* 3.知道第一个元素的内存地址及其元素占用空间大小,又知道下标,即可通过数学表达式计算出某个下标
* 的元素的内存地址,然后通过内存地址定位元素。
* 数组中存100个元素和100万个元素的检索效率是一样的,因为数组中的元素查找不是一个一个找的,而是
* 通过数学表达式计算出内存地址直接定位的
* 缺点:1.为了保证数组中元素内存地址的连续性,在数组上随机增删元素时效率降低,原因是随机增删元素会涉及到
* 后面元素统一向前或向后位移的操作
* 2.数组不能存储大数据量,原因:
* 在堆内存空间中被建立了许多不规则保存如对象等的内存空间,导致堆内存中很难定义一块特别大且连续的内存
* 注意:对于数组的最后一个元素的增删是没有效率影响的
* 14、声明/定义一个数组
* 语法格式:
* int[] array1;
* String[] array2;
* double[] array3;
* boolean[] array4;
* Object[] array5;
* 15、初始化一维数组
* 两种方式:
* 静态初始化一维数组与动态初始化一维数组
* 静态初始化语法:
* int[] array1 = {100,255,666};
*
* 动态初始化语法:
* int[] array1 = new int[5];//初始化一个长度为5(5个数组元素)的数组,每个元素默认0
* String[] array2 = new String[6];//初始化一个长度为6(6个数组元素)的数组,每个元素默认null
*/
public class ArrayTest1 {
public static void main(String[] args) {
//数组的静态初始化
int[] a = {10,25,62,3,55,455};
//int b[] = {12,65,45};---->C++式写法
//数组都有length属性
System.out.println("数组中的元素个数="+a.length);
//数组的每个元素都有下标
//通过下标对数组元素进行存取
//取(读)
System.out.println("The first value of Array a is "+a[0]);//读取数组第一个元素
System.out.println("The last value of Array a is "+a[5]);//读取数组最后一个元素
System.out.println("The last value of Array a is "+a[a.length-1]);//读取数组最后一个元素
//改
//第一个改为123
a[0]=123;
System.out.println("The first value of Array a is "+a[0]);
//最后一个改为666
a[5]=666;
System.out.println("The last value of Array a is "+a[5]);
//数组的遍历
for(int i =0;i<=a.length-1;i++) {
System.out.println(a[i]);
}
//当输出不存在的a[6]时会报什么异常?
//System.out.println(a[6]);//ArrayIndexOutOfBoundException(下标越界异常--著名异常)
//数组从最后一个元素遍历到第一个元素
for (int j = a.length-1; j >= 0; j--) {
System.out.println("反遍历输出为"+a[j]);
}
}
}
2、数组的初始化
package a数组概要;
/*
* 数组初始化方式的选择:
* 1、当已经确定数组中所要存储元素的值时,采用静态初始化
* 2、不确定将来数组要存储哪些具体数据时,采用动态初始化,预先分配内存空间
*/
public class ArrayTest2 {
public static void main(String[] args) {
//动态初始化一维数组
int[] a = new int[5];//创建一个int类型长度为5的一维数组,每个元素默认值为0
//遍历数组a
for (int i = 0; i < a.length; i++) {
System.out.println("下标为"+i+"的元素值是 "+a[i]);
}
//后期赋值
a[0]=2;
a[1]=5;
a[2]=9;
a[3]=8;
a[4]=6;
for (int i = 0; i < a.length; i++) {
System.out.println("下标为"+i+"的元素值是 "+a[i]);
}
System.out.println("=========================================");
//动态初始化一个Object类型的一维数组
Object[] o = new Object[3];
for (int i = 0; i < o.length; i++) {
Object object = o[i];
System.out.println("下标为"+i+"的元素值为"+object);
}
//静态初始化Object类型数组
//创建对象
Object o1 = new Object();
Object o2 = new Object();
Object o3 = new Object();
//创建数组
Object[] objects = {o1,o2,o3};
for (int i = 0; i < objects.length; i++) {
System.out.println(objects[i]);//调用Object中的toString()方法,因为未改写的toString是引用的字符串表示
}
System.out.println("=========================================");
}
}
3、方法中的参数数组
package a数组概要;
/*
* 方法中的数组参数
*/
public class ArrayTest3 {
public static void main(String args[]) {
//创建int类型数组传参
int[] a = {1,2,3};
m1(a);
System.out.println("==============================>");
//直接传递静态数组时语法如下
//Error-->m1({45,46,89});
m1(new int[] {78,56,84});
System.out.println("==============================>");
//创建动态初始化String类型数组
String[] strings = new String[4];
m2(strings);
System.out.println("==============================>");
//或者直接传动态数组
m2(new String[3]);
}
//传参数为int类型数组
public static void m1(int[] array1) {
for (int i = 0; i < array1.length; i++) {
System.out.println(array1[i]);
}
}
//传参为String类型数组
public static void m2(String[] array1) {
for (int i = 0; i < array1.length; i++) {
System.out.println(array1[i]);
}
}
}