Java基础之不简单的数组

目录
  • 引言
  • 数组也是一种类型
  • 数组特点
  • 数组的声明和初始化
    • 1.静态初始化
    • 2.动态初始化
  • 数组和内存
  • 总结

引言

相信有过编程基础的小伙伴都知道数组这个数据结构,它应该也是我们第一个接触的数据结构,学过C或者C++的应该知道数组和指针紧密相关,那么在java里没有了指针,java里的数组又有哪些不同的特点呢?下面就来介绍一下java里的数组;

数组也是一种类型

数组里面的数组元素都是唯一的,这个大家应该都知道,但是因为java是面向对象语言,类与类之间又有继承关系(C++中同样拥有),所以有时候会出现一个数组里面出现多种数据类型的情况,其实归根结底,数组元素的类型就是一个,就是那个父类;

在java中,其实数组也是一种数据类型,数组的父类是Object,数组本身是一种引用类型(基本类型如int,char ,double等)

就比如在java里定义数组的一种方式 :int[] ,这是定义了一个整型的数组,不能把它分开来看,就把int[] 当成一种数据类型,这样我们用该类型创建的对象就是数组,所以int[] 是一种引用类型;

在下面的数组学习中一定要把数组当成引用类型来看,更有助于理解,不要带着C或者C++的数组来思考;

数组特点

下面就简单规整一些数组的几个特点:

  1. 数组是一组数据的集合
  2. 数组作为一种引用类型
  3. 数组元素的类型可以是基本类型(基本类型数组),也可以是引用类型(引用类型数组),但同一个数组只能是同一种类型
  4. 数组作为对象,数组中的元素作为对象的属性,而且数组包括一个成员属性 length,length 表示数组的长度
  5. 数组的长度在数组对象创建后就确定了,就无法再修改
  6. 数组元素是有下标的,下标从 0 开始,也就是第一个元素的下标为 0,依次类推最后一个元素的下标为 n-1,我们可以通过数组的下标来访问数组的元素

数组的声明和初始化

java其实支持两种语法声明数组:

type[] myArray;
type myArray[];

对于这两种方法,这里就不多介绍了,只是让大家了解一下,但是,我们需要记住并且使用的只用一种方法,就是第一种,不管是可读性还是对数组的理解,第一种都是完胜第二种的,可能刚学过C或者C++的都会看第二种更亲切些,从现在开始,就不要再想第二种了;(C#已经不支持第二种语法,并且越来越多语言不再支持该语法);

数组是一种引用类型的变量,所以当它声名一个变量时,就只是定义了一个引用变量(也就是指针),学过C或者C++的小伙伴一定知道,当一个指针定义出来时并没有指向任何有效的内存空间,这里也是一样,这个引用变量也是没有指向任何有效空间,所以这时候的数组不能使用,需要进行初始化操作;
ps:学过C或者C++的话可以将引用变量和指针相互联系思考,学起来会更加轻松;

下面看看数组初始化操作,初始化其实就是给数组的元素分配内存空间(类似C、C++中的动态内存分配),并且为每个数组元素赋值;
数组初始化有两种方式:

1.静态初始化

初始化时由你自己来显式的指定每个数组元素的初始值,由系统来决定数组长度;

格式如下:

type[] myArray;
myArray = new type[] {element1, element2, element3, element4};

或者

type[] myArray = {element1, element2, element3, element4};

测试代码:

public class MyArrayTest02 {
    public static void main (String[] args) {
        //静态初始化数组01
        int[] arr;
        arr = new int[] {0, 1, 2, 3, 4};
        //foreach循环
        for (int i : arr) {
            System.out.println(i);
        }

        //静态初始化数组02
        Object[] objarr;
        objarr = new String[] {"I", " love", " coding!"};
        //foreach循环
        for (Object str : objarr) {
            System.out.print(str);
        }
        System.out.print("\n");
    }
}
public class MyArrayTest03 {
    public static void main (String[] args) {
        //静态初始化数组简化版01
        int[] arr = {0, 1, 2, 3, 4};
        //foreach循环
        for (int i : arr) {
            System.out.println(i);
        }

        //静态初始化数组02
        Object[] objarr = {"I", " love", " coding!"};
        //foreach循环
        for (Object str : objarr) {
            System.out.print(str);
        }
        System.out.print("\n");
    }
}

这两种哪一种都是可以的,第二种相对第一种简化一些,但是我感觉第一种更好有利于对数组内存空间的理解;

2.动态初始化

初始化时你只需要指定数组长度,系统会自动分配初始值;

格式如下:

type myArray = new type[length];

这里提一下系统自动分配的初始值:

  1. byte,shoet,int,long 初始值是0
  2. float, double初始值是0.0
  3. char 初始值是'\0000'
  4. boolean初始值是false
  5. 所有引用类型初始值是null

测试代码:

public class MyArrayTest02 {
    public static void main (String[] args) {
        //动态初始化数组
        int[] arr = new int[5];
        for (int i = 0; i < arr.length; ++i) {
            arr[i] = i;
        }
        //foreach循环
        for (var i : arr) {
            System.out.println(i);
        }
     }
}

数组和内存

java里面虽然没有了指针,但是java引入了引用的概念,同样是对内存的操作,所以理解好底层的机制对代码的编写和理解尤为重要;
下面的内容就是有一些小小的难度了,但是如果提前接触过指针的概念,对于下面的内容,你会发现许多相似之处;

数组引用变量是一个引用,只由引用变量指向了有效内存,才能通过数组变量访问数组元素;
同样,只有通过了数组的引用变量,才能访问到数组中的元素,即数组对象本身;

重点!!!
数组对象存储在堆中,引用变量存储在栈中(引用变量是局部变量的情况)
{ 这一点可以类比C语言指针动态分配内存,当一个指针动态分配了一块内存后,这一块内存存放在堆中,而这个指针变量存放在栈中,只有通过这个指针变量才能访问到分配的动态内存 }

画个图更好理解:

给大家来个案例看看,通过代码会更好理解:

public class PointTest {
    public static void main (String[] args) {
        int a[] = {1, 2, 3, 4, 5};
        //注意:此时的b的长度为6
        int[] b = new int[6];

        for (int i : a) System.out.print(i + " ");
        System.out.println();
        for (int i : b) System.out.print(i + " ");
        System.out.println();

        //b指向a所指向的内存
        b = a;

        //当b指向a所指向的内存空间时,b的长度就是a的长度
        System.out.println("b的长度为:" + b.length);
        //此时b指向的内存数据为
        for (int i : b) System.out.print(i + " ");
        System.out.println();
        //当a的第一个数据改变时,输出b的第一个数据看看是否改变
        a[0] = 100;
        System.out.println(b[0]);
    }
}

这里解释一下:
开始定义了两个引用变量:a和b,然后系统内存就产生了四个内存区,a和b就在栈区,而a和b所指向的数组本身在堆区;
a引用的数组对象里面有{1, 2, 3, 4, 5}五个元素,而b引用的数据对象则是系统初始化的,为{0, 0, 0, 0, 0, 0}六个元素,而当b指向a时,此时的b的数据对象就处于没有任何引用变量引用的情况,而a的数据对象此时被a和b两个引用变量所引用,此时b的长度就是a的长度5,所以当a的第一个数据改变时,相当于b的第一个数据改变;

总结一下:
我们看待一个数组时,要把数组看成两部分,一部分是数组的引用,即代码中定义的数组引用变量(存储在栈中),另一部分是实际的数组对象(存储在堆中);所以需要用过引用变量来访问数组对象;

总结

在这里我只是简单的介绍了一下java中的数组,不要以为掌握了这些就算真正学会了数组了,这些只能算作java数组的一个入门,你也许能够学会使用数组,但是数组在内存中的运行机制还有很多难以理解的地方,强烈建议提前学习一下C语言指针的相关内容,还有指针数组也最好掌握理解,这些将会帮助你更好的理解数组在内存中的存储和初始化,理解了这些,你将会对你的程序运行机制有着更准确的把握!

ps:内容如果有问题欢迎交流!!

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

(0)

相关推荐

  • Java 数组迭代你会用吗

    目录 1.概述 2.通过循环进行数组迭代 3.JDK 8 之前使用老方式进行数组迭代 4.使用 Java 8 Stream 进行数组迭代 5.字符串的应用 6.总结 Java 数组是我们学习或工作中常用到的数据结构,我们会经常写数组迭代的代码,但你的代码是最优雅的么? 本文介绍三种数组迭代的方式以及最佳实践. 1.概述 首先我们通过遍历数组值的基本方法,来迭代数组.其次我们用 Java 比较古老的方法实现,最后我们再使用 Java 8 的 Stream API 将数组转成迭代器. 除此之外,我们

  • Java关于数组的介绍与使用

    目录 一.前言 二.数组的定义 数组定义的形式: 格式1: 格式2: 三.数组的初始化方式: 1.动态初始化 动态开辟的示意图: 2.静态初始化 四.索引访问数组 五.数组长度表示 六.遍历数组 方法一: 实例演示: 代码: 方法二: 实例演示: 代码: 七.数组的初始值 实例演示: 代码: 一.前言 前面我们学习了随机数的介绍和使用,那么这篇我们来学习java中数组的定义和使用, java的数组和c语言的十分类似. 二.数组的定义 数组定义的形式: 格式1: 数据类型 [ ] 数组名 :如in

  • java循环结构、数组的使用小结

    数组 数组是是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理. 数组本身是引用数据类型,既可以存储基本数据类型,也可以存储引用数据类型.它的元素相当于类的成员变量. 创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址. 数组的长度一旦确定,就不能修改. 通过下标(或索引)的方式调用指定位置的元素. 数组的分类: 按照维度:一维数组.二维数组.三维数组.-按照元素的数据类型分:基本数据类型元素的数组.引用数据类型元素

  • Java中高效判断数组中是否包含某个元素的几种方法

    目录 检查数组是否包含某个值的方法 使用List 使用Set 使用循环判断 使用Arrays.binarySearch() 时间复杂度 使用一个长度为1k的数组 使用一个长度为10k的数组 总结 补充 使用ArrayUtils 完整测试代码 长字符串数据 如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作.同时,这个问题在Stack Overflow中也是一个非常热门的问题.在投票比较高的几个答案中给出了几种不同的方法,但是他们的时间复杂度也是各不相同

  • java学习之一维数组中重复元素的去除

    目录 一.基本思路 二.步骤 1.设置判断数组Arr[ ] 2.继承数组newArr[ ]获取不重复元素 总结 一.基本思路 首先,假设一个一维数组arr[ ]={ 4, 3, 35, 3, 2, 4, 6, 3},其中有三个重复元素 3,4,3.要如何剔除呢,由于还没有涉猎到一些经典的调用,所以我选择了用新的数组newArr[ ]去继承原来数组中的不重复的元素,另外还需要一个判断数组Arr[ ],来判断arr[ ]中哪几个元素是重复的,才好去除掉. 二.步骤 1.设置判断数组Arr[ ] 代码

  • Java基础之不简单的数组

    目录 引言 数组也是一种类型 数组特点 数组的声明和初始化 1.静态初始化 2.动态初始化 数组和内存 总结 引言 相信有过编程基础的小伙伴都知道数组这个数据结构,它应该也是我们第一个接触的数据结构,学过C或者C++的应该知道数组和指针紧密相关,那么在java里没有了指针,java里的数组又有哪些不同的特点呢?下面就来介绍一下java里的数组: 数组也是一种类型 数组里面的数组元素都是唯一的,这个大家应该都知道,但是因为java是面向对象语言,类与类之间又有继承关系(C++中同样拥有),所以有时

  • Java基础学习笔记之数组详解

    本文实例讲述了Java基础学习笔记之数组.分享给大家供大家参考,具体如下: 数组的定义于使用 1:数组的基本概念 一组相关变量的集合:在Java里面将数组定义为引用数据类型,所以数组的使用一定要牵扯到内存分配:想到了用new 关键字来处理. 2:数组的定义格式 区别: 动态初始化后数组中的每一个元素的内容都是其对应数据类型的默认值,随后可以通过下标进行数组内容的修改: 如果希望数组定义的时候就可以提供内容,则采用静态初始化的方式: a:数组的动态初始化(声明并初始化数组): 数据类型 数组名称

  • 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基础之数组模拟循环队列

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

  • Java基础之数组详解

    前言 我们了解数组这个概念之前,我们先思考下面几个问题. 如果我们需要两个数据,那么直接创建两个变量即可 int a; int b; 如果需要五个数据,那么可以创建五个变量 int a; int b; int c; int d; int f; 但如果我们需要100个甚至是1万个数据,那么我们创一万个变量?显然这是不现实的.这个时候就需要我们的数组来起作用!帮我们"批量"创建变量. 由上可以得出:数组的本质就是让我们能"批量"创建相同类型的变量! 一.数组的概念 数组

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

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

  • Java基础语法之二维数组详解

    一.二维数组 进入正题之前.首先为了便于大家理解,我画了一个图: xx枪战游戏中, 我是一个刚刚注册账号的小白,系统送了我两把枪,此时,我的武器库只有这么一层(可以理解为一位数组,枪就是对应的数组中对应的元素) 经过艰苦卓绝的战斗,终于有了一笔钱,现在我打算配置好的游戏装备,我现在有了一个枪柜,它可以存放三层的枪械,每一层都可以放多把武器(这个就是二维数组,有多层,每层都是一个一维数组) 随着游戏时长和我的高超技术,获取游戏装备的效率越来越高了,一个枪柜已经存不下了,于是,我就有了多个枪柜(这个

  • Java基础教程之数组的定义与使用

    目录 一.数组的基本概念 二.数组的声明 三.数组的创建及初始化 1.数组的创建 2.数组的初始化 四.访问数组元素 五.for each 循环 六.数组的拷贝 七.数组排序 八.二维数组 总结 一.数组的基本概念 数组是一种数据类型,用来存储同一类型值的集合,它在内存中是一段连续的空间.通过一个整形下标(index,或者称之为索引)可以访问数组中的每一个值.例如,如果a是一个整型数组,a[i]就是一个下标为i的一个整数,数组是一种引用类型. 二.数组的声明 声明数组变量时,需要指出数组类型(数

  • Java基础知识精通二维数组的应用

    目录 1.什么是二维数组 2.定义格式 3.二维数组的使用 4.二维数组的遍历 本文章主要讲二维数组定义,用法. 1.什么是二维数组 在二维数组多个元素为一维数组的数组就称为二维数组 2.定义格式 格式一: 元素的数据类型[][] 数组的名字 = new 元素的数据类型[二维数组的长度][一维数组的长度]: int[][] a = new int[3][2]; 解释: 这个二维数组中还有3个一维数组,每个一维数组中有两个元素. 格式二: 元素的数据类型[][] 数组的名字 = new 元素的数据

  • Java基础知识精通数组的使用

    目录 1.数组 2.数组定义格式 3.访问数组 4.遍历数组 前言:本文章正式踏入数组部分,今天来讲一下数组. 1.数组 数组是一组数据结构,用来储存一组相同类型值的集合. 数组就是一个容器. 数组就是个引用数据类型. 作用: 用来装数据,方便对数据进行管理操作. 特点: 一旦创建数组,就不能改变长度. 数组里面所有的元素的类型必须是相同数据类型的. 数组中既可以储存基本数据类型,也可以存储引用数据类型. 2.数组定义格式 格式一:元素的数据类型[] 数组的名字 = new 元素的数据类型[元素

随机推荐