Java基础之数组超详细知识总结

一、一维数组

1、Java语言中的数组是一种 引用数据类型。不属于基本数据类型。数组的父类Object

2、数组实际上是一个容器,可以同时容纳多个元素。(数组是一个数据的集合

3、数组当中可以存储“基本数据类型”的数据,也可以存储“引用数据类型”的数据。

4、数组因为是引用类型,所以数组对象存储在 堆内存 当中。(数组是存储在当中的)

5、数组当中如果存储的是“java对象”的话,实际上存储的是对象的“引用(内存地址)”,数组中不能直接存储java对象。

6、数组一旦创建,在java中规定,长度不可变。(数组长度不可变

7、数组的分类:一维数组二维数组、三维数组、多维数组…(一维数组较多,二维数组偶尔使用!)

8、所有的数组对象都有 length 属性(java自带的),用来获取数组中元素的个数

9、java中的数组要求数组中元素的 类型统一

比如:int类型数组只能存储int类型,Person类型数组只能存储Person类型。

10、数组在内存方面存储的时候,数组中的元素内存地址(存储的每一个元素都是有规则的挨着排列的)是连续的。内存地址连续。(数组特点)

11、所有的数组都是拿“第一个小方框的内存地址”作为整个数组对象的内存地址。
(数组中首元素的内存地址作为整个数组对象的内存地址。)

12、数组中每一个元素都是有下标的,下标从0开始,以1递增。最后一个元素的下标是:length - 1

13、数组这种数据结构的优点和缺点是什么?

  • 优点查询/查找/检索某个下标上的元素时效率极高。

原因:

第一:每一个元素的内存地址在空间存储上是连续的。

第二:每一个元素类型相同,所以占用空间大小一样

第三:知道第一个元素内存地址,知道每一个元素占用空间的大小,又知道下标,所以通过一个数学表达式就可以计算出某个下标上元素的内存地址。直接通过内存地址定位元素,所以数组的检索效率是最高的。

注意:

数组中存储100个元素,或者存储100万个元素,在元素查询/检索方面,效率是相同的,
因为数组中元素查找的时候不会一个一个找,是通过数学表达式计算出来的。(算出一个
内存地址,直接定位的。)

  • 缺点

第一:由于为了保证数组中每个元素的内存地址连续,所以在数组上随机删除或者增加元素的时候,效率较低,因为随机增删元素会涉及到后面元素统一向前或者向后位移的操作。

第二:数组不能存储大数据量。因为很难在内存空间上找到一块特别大的连续的内存空间。

注意:

对于数组中最后一个元素的增删,是没有效率影响的。

14、怎么声明/定义一个一维数组?

语法格式:

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

15、怎么初始化一个一维数组呢?

包括两种方式:静态初始 化一维数组,动态初始化 一维数组。

静态初始化语法格式:

java风格:

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

C++风格:

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

动态初始化语法格式:

Java风格:

int[] array = new int[5]; // 这里的5表示数组的元素个数。
// 初始化一个5个长度的int类型数组,每个元素默认值0
String[] names = new String[6]; // 初始化6个长度的String类型数组,每个元素默认值null。

C++风格:

int array[] = new int[5]; // 这里的5表示数组的元素个数。
// 初始化一个5个长度的int类型数组,每个元素默认值0
String names[] = new String[6]; // 初始化6个长度的String类型数组,每个元素默认值null。

注意:

采用动态初始化,数组会赋默认值!

注意:
和c++的区别

c++定义数组

//静态初始化
int a[10];
int a[] = {1, 2, 3, 4};
int a[100] = {1, 2, 3, 4};

//动态初始化
int *a = new int[10];

16、怎么修改一维数组某一个元素的值?

语法格式:

数组名[下标] = 值;

eg.
a[1] = 100;

17、 什么时候采用静态初始化方式,什么时候使用动态初始化方式呢?

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

18、方法形参为一维数组如何传参?

public void print(int[] num){
	for (int i = 0; i < num.length; i++){
		System.out.println(num[i]);
	}
}

传参:
int[] a = {1, 2, 3, 4};
print(a);

还可以这样传参:

传静态数组
print(new int[]{1, 2, 3, 4});

new int[]{1, 2, 3, 4}还可以.length是一个数组对象!

19、数组扩容(效率低)

方法:(System类的方法)

/**
*@src	拷贝源
*@srcPos	拷贝源起始位置
*@dest	目标数组
*@destPos	目标数组起始位置
*@length	拷贝长度
*/
static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

eg.

int[] a = {1, 2, 3, 4};
int[] b = new int [10];
System.arraycopy(a, 0, b, 0, aa.length);
//从a数组下标为0开始拷贝,拷贝到从b数组下标为0开始存入,长度为整个a数组

二、二维数组

1、二维数组其实是一个 特殊的一维数组,特殊在这个一维数组当中的每一个元素是一个一维数组

2、三维数组是什么?

三维数组是一个特殊的二维数组,特殊在这个二维数组 中每一个元素是一个一维数组

实际的开发中使用最多的就是一维数组。二维数组也很少使用。三维数组几乎不用。

3、二维数组静态初始化

int[][] array = {
        {1,1,1},
        {2,3,4,5},
        {0,0,0,0},
        {2,3,4,5},
        {2,3,4,5},
        {2,3,4,5},
        {2,3,4,5}
};

4、二维数组动态初始化

eg.

int[][] array = new int[3][4];

5、关于二维数组中元素的:读和改。

a[二维数组中的一维数组的下标][一维数组的下标]

a[0][0]:表示第1个一维数组中的第1个元素。

a[3][100]:表示第4个一维数组中的第101个元素。

注意:

对于a[3][100]来说,其中 a[3] 是一个整体。[100]是前面a[3]执行结束的结果然后再下标100

6、方法形参为二维数组如何传参?

public void print(int[][] num){
	for (int i = 0; i < num.length; i++){
		for (int j = 0; j < num[i].length; j++){
			System.out.println(num[i][j]);
		}
	}
}

传参:
 int[][] a = {{1,2,3,4},{4,5,6,76},{1,23,4}};
print(a);

还可以这样传参:

传静态数组
print(new int[][]{{1,2,3,4},{4,5,6,76},{1,23,4}});

new int[][]{{1,2,3,4},{4,5,6,76},{1,23,4}}还可以.length是一个数组对象!

三、总结

1. 数组的优点和缺点,并且要理解为什么。

第一:空间存储上,内存地址是连续的。

第二:每个元素占用的空间大小相同。

第三:知道首元素的内存地址。

第四:通过下标可以计算出偏移量。
通过一个数学表达式,就可以快速计算出某个下标位置上元素的内存地址,
直接通过内存地址定位,效率非常高。

优点:检索效率高。
缺点:随机增删效率较低,数组无法存储大数据量。
注意:数组最后一个元素的增删效率不受影响。

2. 一维数组的静态初始化和动态初始化

静态初始化:

int[] arr = {1,2,3,4};

Object[] objs = {new Object(), new Object(), new Object()};

动态初始化:

int[] arr = new int[4]; // 4个长度,每个元素默认值0

Object[] objs = new Object[4]; // 4个长度,每个元素默认值null

3. 一维数组的遍历

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

4. 二维数组的静态初始化和动态初始化

静态初始化:

int[][] arr = {
		{1,2,34},
		{54,4,34,3},
		{2,34,4,5}
};

Object[][] arr = {
		{new Object(),new Object()},
		{new Object(),new Object()},
		{new Object(),new Object(),new Object()}
};

动态初始化:

int[][] arr = new int[3][4];

Object[][] arr = new Object[4][4];

Animal[][] arr = new Animal[3][4];

// Person类型数组,里面可以存储Person类型对象,以及Person类型的子类型都可以。
Person[][] arr = new Person[2][2];
....

5. 二维数组的遍历

for(int i = 0; i < arr.length; i++){ // 外层for循环负责遍历外面的一维数组。
	// 里面这个for循环负责遍历二维数组里面的一维数组。
	for(int j = 0; j < arr[i].length; j++){
		System.out.print(arr[i][j]);
	}
	// 换行。
	System.out.println();
}

6. 数组的拷贝:System.arraycopy()方法的使用

数组有一个特点:长度一旦确定,不可变

所以数组长度不够的时候,需要扩容,扩容的机制是:新建一个大数组,将小数组中的数据拷贝到大数组,然后小数组对象被垃圾回收。

补充:

数组长度为0:

int[] f = {};//数组长度为0
System.out.println(f.length);//0

int[] g = new int[0];//数组长度为0
System.out.println(g.length);//0

int[] h = null;
//System.out.println(h.length);//空指针异常

到此这篇关于Java基础之数组详解的文章就介绍到这了,更多相关Java数组内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java基础之文件概述

    一.基本概念和常识 下面,我们先介绍一些基本概念和常识,包括二进制思维.文件类型.文本文件的编码.文件系统和文件读写等. 1.1 二进制思维 为了透彻理解文件,我们首先要有一个二进制思维. 所有文件, 不论是可执行文件.图片文件.视频文件.Word文件.压缩文件.txt 文件,都没什么可神秘的,它们都是以0和1的二进制形式保存的.我们 所看到的图片.视频.文本,都是应用程序对这些二进制的解析结果. 作为程序员,我们应该有一个编辑器,能查看文件的二进制形式, 比如UltraEdit,它支持以十六进

  • Java基础之Object类详解

    object类的介绍 object是所有类的直接父类或者是间接父类,为什么这么说呢? 可以查询java8的API帮助文档: 可见在这样的一个类树中,所有的类的根还是Object类 在IDEA中新建一个类,系统会默认继承Object类 public class Pet extends Object{ } 那么Dog继承了Pet类的属性和行为方法,还会继承Object类的属性和行为方法了吗?这一点是肯定的,Pet类作为Object类的子类,Dog类作为Pet类的子类,所以说Object是Dog类的间

  • Java多线程之线程同步

    volatile 先看个例子 class Test { // 定义一个全局变量 private boolean isRun = true; // 从主线程调用发起 public void process() { test(); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } stop(); } // 启动一个子线程循环读取isRun private void test() {

  • Java基础之CardLayout的使用

    一.案例介绍 在编码前需要将本案例中使用到的三张图片(1.png .2.png.3.png)保存到src所在的文件夹内.看下图: 1.png: 2.png: 3.png: 二.案例代码 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ShowCardLayout extends MouseAdapter{ private JFrame f; private JPanel p1,p2,p3

  • Java算法之时间复杂度和空间复杂度的概念和计算

    一.算法效率 算法效率分析分为两种:第一种是时间效率,第二种是空间效率.时间效率被称为时间复杂度,而空间效率被称作空间复杂度. 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间. 在计算机发展的早期,计算机的存储容量很小.所以对空间复杂度很是在乎.但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度.所以我们如今已经不需要再特别关注一个算法的空间复杂度.因为现在的内存不像以前那么贵,所以经常听到过牺牲空间来换取时间的说法 二.时间复杂度 2.1

  • Java Swing CardLayout卡片布局的实现示例

    1. 概述 官方JavaDocsApi: javax.swing.CardLayout CardLayout,卡片布局管理器.它将容器中的每个组件看作一张卡片,一次只能看到一张卡片,容器则充当卡片的堆栈,默认显示第一张卡片. CardLayout 构造方法: // 创建一个间距大小为 0 的卡片布局 CardLayout() // 创建一个指定水平/垂直间距大小的卡片布局. CardLayout(int hgap, int vgap) CardLayout 常用方法: // 显示第一张卡片 vo

  • java布局管理之CardLayout简单实例

    本文实例为大家分享了java布局管理之CardLayout的具体代码,供大家参考,具体内容如下 import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swi

  • Java基础之数组超详细知识总结

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

  • Java SpringMVC数据响应超详细讲解

    目录 1)页面跳转   2)回写数据 3)配置注解驱动 4)知识要点 1)页面跳转   直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转.  返回带有前缀的字符串: 转发: forward:/WEB-INF/views/index.jsp 重定向: redirect:/index.jsp 通过ModelAndView对象返回 @RequestMapping("/quick2") public ModelAndView quickMethod2(){ ModelAn

  • C语言数组超详细讲解下篇扫雷

    目录 前言 1.扫雷是什么? 2.程序框架 2.1 主函数 2.2 函数menu 2.3 函数game 2.3.1 函数init_board 2.3.2 函数show_board 2.3.3 函数set_mine 2.3.4 函数find_mine 2.3.5 函数get_mine_count 3.头文件.h 4.游戏试玩 总结 前言 本文接着复习前面所学知识,以扫雷游戏为例. 1.扫雷是什么? 百度百科:<扫雷>是一款大众类的益智小游戏,于1992年发行.游戏目标是在最短的时间内根据点击格子

  • java基础之数组常用操作总结(必看篇)

    常用的对数组进行的操作 1.求数组中最大值,最小值 思路:假设下标为0的元素是最大值,遍历数组,依次跟max进行比较,如果有元素比这个max还大,则把这个值赋给max.最小值同样 public class TestArray{ public static void main(String[] args){ int[] arr={23,45,234,576,34,87,34,12,67}; int max=arr[0]; int min=arr[0]; for(int i=0;i<arr.leng

  • Java 继承与多态超详细梳理

    目录 一.继承 1.继承的概念 2.继承的语法 3.父类成员访问 (1)子类中访问父类的成员变量 (2)子类中访问父类的成员方法 4.super关键字 5.子类构造方法 6.super和this 7.代码块执行顺序 8.继承方式 9.final关键字 10.继承和组合 二.多态 1.向上转型 2.重写 3.多态 一.继承 1.继承的概念 继承机制:是面向对象程序设计是代码可以复用的最重要手段,允许程序员在保持原有类特性的基础上进行扩展,增加新的功能,产生的新类,成为派生类/子类.继承主要解决的问

  • Java 栈与队列超详细分析讲解

    目录 一.栈(Stack) 1.什么是栈? 2.栈的常见方法 3.自己实现一个栈(底层用一个数组实现) 二.队列(Queue) 1.什么是队列? 2.队列的常见方法 3.队列的实现(单链表实现) 4.循环队列 一.栈(Stack) 1.什么是栈? 栈其实就是一种数据结构 - 先进后出(先入栈的数据后出来,最先入栈的数据会被压入栈底) 什么是java虚拟机栈? java虚拟机栈只是JVM当中的一块内存,该内存一般用来存放 例如:局部变量当调用函数时,我们会为函数开辟一块内存,叫做 栈帧,在 jav

  • C语言数组超详细讲解中篇三子棋

    目录 前言 1.三子棋是什么? 1.1 百度百科 1.2 游戏编程准备工作 2. 程序实现 2.1 搭建程序框架 2.2 模块化编程 2.2.1 源文件test.c 2.2.2 源文件play.c 2.2.3 头文件play.h 2.3 程序实现—拓展play函数 2.3.1 棋盘初始化与打印函数 2.3.2 玩家下棋函数 PlayMover 2.3.3 电脑下棋函数 ComputerMove 2.2.4 判断赢家函数 WhoIsWin 总结 前言 本文主要是对前面所学内容进行复习和练习,学习内

  • C语言数组超详细讲解上

    目录 前言 1.一维数组的创建和初始化 1.1 一维数组的创建 1.2 一维数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 2.二维数组的创建和初始化 2.1 二维数组的创建 2.2 二维数组的初始化 2.3 二维数组的使用 2.4 二维数组在内存中的存储 3.数组越界 4.数组作为函数参数 4.1 冒泡排序函数的错误设计 4.2 数组名是什么? 4.3 对数组名的用法进行总结 4.4 冒泡排序函数的正确设计 总结 前言 本文主要介绍数组相关的内容,主要内容包括: 一维数组

  • Java CopyOnWriteArrayList源码超详细分析

    目录 一.概述 二.类图 三.核心方法 1.add() 2.set() 3.remove() 4.get() 5.size() 四.总结 一.概述 CopyOnWriteArrayList是基于写时复制技术实现的,适用于读多写少场景下的线程安全的并发容器.读操作永远不会加锁,读读.读写都不会冲突,只有写写需要等待.写操作时,为了不影响其它线程的读取,它会进行一次自我复制,待数据写入完成后再替换array数组.array数组是被volatile修饰的,它被修改后可以被其他线程立刻发现. publi

  • Java基础之数组模拟循环队列

    一.队列简介 队列是一个有序列表,遵循"先入先出"的原则,即先存入队列的数据要先取出,后存入的数据后取出. 队列有两种存储表示,顺序表示和链式表示.顺序表示可以用数组来实现. 二.数组模拟队列 用数组模拟队列时,设两个值front=0,rear=0.front表示队列首部第一个数据所在位置,rear表示尾部最后一个数据的下一个位置. 将数据插入数组队列时(入队),从尾部进行插入,即array[rear] = value,同时rear后移,rear++.取出数据时(出队),从头部取出数据

随机推荐