一、一维数组概述和内存结构

1.Java语言中的数组是一种引用数据类型。不属于基本数据类型。数组的父类是Object。
2.数组实际上是一个容器,可以同时容纳多个元素。(数组是一个数据的集合)
数组:“一组数据”
3.数组当中可以存储“基本数据类型”和“引用数据类型”的数据
4.数组因为是引用类型,所以数组对象是堆内存当中的。(数组储存在堆当中)
5.数组当中如果储存的是“Java对象”的话,实际上储存的是对象的“引用(内存地址)”

6.数组一旦创建,在Java中规定,长度不可变。(数组长度不可变)
7.数组的分类:一维数组较多,二维偶尔使用。
8.所有数组对象都有length属性(Java自带),用来获取数组元素的个数。
9.Java中的数组要求数组中元素的类型统一。例如int类型数组只能储存int类型。
10.数组在内存方面储存的时候,数组中的元素内存地址是连续的。(储存的每一个元素都是有规则的挨着排列的)内存地址连续是数组储存的特点。数组实际上是一种简单的数据结构。
11.所有的数组都是拿第一个小方框的内存地址做整个数组对象的内存地址。(数组中首元素的内存地址做整个数组对象的内存地址)因为数组的内存地址是连续的。
12.数组元素的下标从0开始,最后一个元素的下标是length-1

5(5)

二、一维数组的优点和缺点

13.优缺点
优点:查询/查找/检索某个下标上的元素时效率极高。是查询效率最高的一个数据结构。
为什么检索效率高?
第一:每一个元素的内存地址在空间储存上是连续的。
第二:每一个元素的类型相同,所以占用空间大小是一样的。
第三:知道一个元素的内存地址,知道每一个元素占用空间的大小,又知道下标,所以通过一个数学表达式就可以计算出某个下标上元素的内存地址。直接通过内存地址定位元素,所以数组的检索效率是最高的。
数组中储存100个元素和储存100万个元素,在元素检索方面效率是相同的,因为数组中元素的查找不是一个一个算出来的,而是通过数学表达式直接求出来的。(算出一个内存地址,直接定位)

缺点:
第一:由于为了保证数组中每个元素的内存地址连续,所以在数组上随机删除或者增加元素的时候,效率较低,因为随机增删元素会涉及到后面元素统一向前或者统一向后位移的操作。
第二:数组不能储存大数据量。(因为很难在内存空间上找到一块特别大的连续的内存空间。)
注意:对于数组中最后一个元素的增删没有影响。

三、初始化一维数组

14.声明/定义一个一维数组
语法格式:

int[] array1;
double[] array2;
boolean[] array3;
String[] array4;
Object[] array5;

15.初始化一个一维数组
包括两种方式:静态初始化一维数组和动态初始化一维数组 。
静态初始化语法格式:

int[] array = {100, 2100, 300, 55};

动态初始化语法格式:

int[] array = new int[5];
(这里的5表示数组的元素个数,并且数组中每个元素的默认值都为零0*初始化一个5个长度的int型数组,每个元素默认值0

----------------------

String[] names = new String[6];
*初始化一个6个长度的String型数组,每个元素默认值null

四、对一维数组中元素的访问

package com.bjpowernode.javase.array;

public class ArrayTest01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] a = {1, 100, 10, 20, 55, 689};
		//所有数组对象都有length属性
		System.out.println("数组中元素的个数"+a.length);
		
		//取(读)
		System.out.println("第一个元素"+a[0]);
		System.out.println("最后一个元素"+a[a.length-1]);
		
		System.out.println("---------------------------------");
		
		//存(改)
		a[0] = 111;
		a[a.length-1] = 0;
		
		System.out.println("第一个元素"+a[0]);
		System.out.println("最后一个元素"+a[a.length-1]);
		
		
		

	}

}
数组中元素的个数6
第一个元素1
最后一个元素689
---------------------------------
第一个元素111
最后一个元素0

五、一维数组的遍历

for(int i = 0; i<a.length; i++) {
			System.out.println(a[i]);
		}

六、动态初始化一维数组

1.每个类型的默认值

在这里插入图片描述

package array;

public class ArrayTest02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		
		
		
		//采用动态初始化创建一个数组
		int[] a = new int[4];//创建长度为4的int数组,数组中每个元素的默认值是0
		//遍历数组
		for(int i = 0; i<a.length; i++) {
			System.out.println("数组中下标为"+i+"的元素是"+a[i]);
		}
		
		//采用动态初始化一个Object类型的数组
		Object[] objs = new Object[3];
		for(int i = 0; i<objs.length; i++) {
			System.out.println("数组中下标为"+i+"的元素是"+objs[i]);
		}
		
		
		
		
		

	}

}


数组中下标为0的元素是0
数组中下标为1的元素是0
数组中下标为2的元素是0
数组中下标为3的元素是0
数组中下标为0的元素是null
数组中下标为1的元素是null
数组中下标为2的元素是null

内存图
在这里插入图片描述

package array;

public class ArrayTest02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		
		
		
		//采用动态初始化创建一个数组
		int[] a = new int[4];//创建长度为4的int数组,数组中每个元素的默认值是0
		//遍历数组
		for(int i = 0; i<a.length; i++) {
			System.out.println("数组中下标为"+i+"的元素是"+a[i]);
		}
		
		//采用动态初始化一个Object类型的数组
		Object[] objs = new Object[3];
		for(int i = 0; i<objs.length; i++) {
			System.out.println("数组中下标为"+i+"的元素是"+objs[i]);
		}
		
		
		System.out.println("==================================");
		String[] strs = new String[3];
		for(int i = 0; i<strs.length; i++) {
			System.out.println("数组中下标为"+i+"的元素是"+strs[i]);
		}
		
		

	}

}


String[] strs = new String[3];
		for(int i = 0; i<strs.length; i++) {
			System.out.println("数组中下标为"+i+"的元素是"+strs[i]);
		}
		
		//采用静待初始化的方式
		String[] strs2 = {"abc", "def", "xyz"};
		for(int i = 0; i<strs2.length; i++) {
			System.out.println("数组中下标为"+i+"的元素是"+strs2[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("数组中下标为"+i+"的元素是"+objects[i]);//自动调用toString()方法
		}

Object[] objects = {new Object(), new Object(), new Object()};
		
		for(int i = 0; i<objects.length; i++) {
			System.out.println("数组中下标为"+i+"的元素是"+objects[i]);//自动调用toString()方法
		}

什么时候采用静态初始化方式,什么时候采用动态初始化方式

当你创建数组时,确定数组中储存哪些元素时,采用静态初始化方式。不确定将来数组中储存哪些数据,可以采用动态初始化的方式,预先分配内存空间,可以后期赋值。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐