【Java进阶篇】第二章 Java数组(上篇) 一维数组

有时候,不是因为你没有能力,也不是因为你缺少勇气,只是因为你付出的努力还太少,所以,成功便不会走向你。而你所需要做的,就是坚定你的梦想,你的目标,你的未来,然后以不达目的誓不罢休的那股劲,去付出你的努力,成功就会慢慢向你靠近。

导读:本篇文章讲解 【Java进阶篇】第二章 Java数组(上篇) 一维数组,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1、Array通识

  • Java中,数组是一种引用数据类型,不属于基本数据类型,数组的父类是Object

  • 数组实际是个容器,可以同时容纳多个元素

  • 数组,即一组数据,是个数据集合

  • 数组当中可以存储基本数据类型,也可以存储引用数据类型的数据

  • 数组存储在堆当中
    在这里插入图片描述

  • 数组中如果存储的是Java对象的话,实际上存储的是引用(对象的内存地址)

  • 数组一旦创建,Java中规定长度不可变

2、数组的分类

Java中,数组分为一维数组、二维数组、三维数组、多维数组……

Java中的数组对象都有length属性,用于获取数组中元素的个数

Java中的数组,要求数组中元素类型要统一,如int数组则只能存int类型的数据

3、一维数组的内存结构

在这里插入图片描述

  • Java中,一维数组在内存中存储的时候,数组中元素的内存地址是连续的
  • 所有数组都是以首元素的内存地址做为整个数组对象的内存地址
  • 数组中每一个元素都是有下标的,从0开始,最后一个下标为length-1

数组这种数据结构的优缺点:

优点:

  • 查询检索某个下标上的元素效率极高(首先每个元素的内存地址连续,其次元素类型相同即占用的空间大小一样,直白说就是偏移量一样,这样一个数学表达式就能算出某个下标上元素的内存地址),是效率最高的一个数据结构

缺点:

  • 为了保证元素内存地址的连续,在数组上随机增删元素时效率较低,因为会导致后面的元素统一向前向后位移(最后一个元素无影响,然而时间复杂度按照最坏的情况算)
  • 不能存储大量数据(不容易找到一块很大的连续的内存空间)

4、一维数组的定义与初始化

定义:

//定义
int[] array1;
boolean[] array2;
Object[] array3;

初始化:

静态初始化一维数组:
int[] array = {100,200,300};

动态初始化一维数组:
int[] array = new int[5]; //5表示元素个数是5,元素值默认是0
String[] names = new String[6]; //6个元素,默认值null

5、一维数组中元素的访问

//测试数组
int[] a = {1,2,3,4,5};

(1)查

通过数组名[下标]

System.out.println("元素个数:"+ a.length); //数组对象的length属性
System.out.println(a[0]); //首位元素
System.out.println(a[a.length-1]); //末尾元素

(2)改

数组名[下标] = values;

a[0] = 111;
a[a.length-1] = 9527;

(3)遍历

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

//倒叙遍历
for(int i=a.length-1;i>=0;i--){
	System.out.println(a[i]);
}

//下标越界
System.out.println(a[100]);

下标越界异常:ArrayIndexOutBoundException

在这里插入图片描述

6、动态初始化一维数组

关于静态和动态初始化数组,静态即创建数组时,已确定个元素的值,如

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

动态初始化即后期再a[0]=xx;a[1]=xx;如:

int[] a = new int[4];

举例:

public static void printArray(String[] args){
        for(int i=0;i<args.length;i++){
            System.out.println(args[i]);
        }
    }

    public static void main(String[] args) {
    	//等价于String[] a = new String[3];
    	//再printArray(a);
        printArray(new String[3]);

        //直接传递静态数组是错误写法
        printArray({"1", "2", "3"});

        //这样是允许的
        printArray(new String[]{"1", "2", "3"});

        //或者改成这样也行
        String[] a = {"1", "2", "3"};
        printArray(a);
    }

部分截图:

在这里插入图片描述

7、main方法的传参是String数组

到此,main方法中的传参也就明晰了,即一个String数组String[] args,数组名args


public static void mian (String[] args){
	System.out.println("JVM传的String数组的长度是:" + args.length);
}

结果:
在这里插入图片描述
分析:

args做为一个引用,我们引用.length属性没有空指针异常,说明args不是null。即String[] args = {};
或者说String[] args = new String[0]; ,就是说数组对象创建了,但里面没有数据。


🍁那么String[] args数组何时会有值?

String[] args数组是留给用户的,用户可以再控制台上输入参数,这些参数会被转化为String[] args

关于这一点,举例如下: 细品!!
在这里插入图片描述
在这里插入图片描述

8、数组中存储引用数据类型

对于存引用数据类型的数组来说,实际上存的是Java对象的内存地址,数组中每个元素都是引用。
在这里插入图片描述
在这里插入图片描述

9、数组的扩容

Java中,数组长度一旦确定则不可变,当数组满了的时候,就需要扩容:

  • 先新建一个大容量的数组,然后将小容量数组中的数据一个个拷贝到大数组中(扩容效率很低)
  • 拷贝使用System类中的静态方法arrayCopy()
//源代码
public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

四个传参为:
拷贝源数组、源数组的起点下标、目标数组(大数组)、目标的起点下标、拷贝长度

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/146105.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!