Java数组(详解版)

news2024/12/23 13:39:28

数组的定义:

什么是数组:

        数组:可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。

1. 数组中存放的元素其类型相同
2. 数组的空间是连在一起的
3. 每个空间有自己的编号,其实位置的编号为 0 ,即数组的下标。

数组的创建及初始化:

数组的创建:

T[] 数组名 = new T[N];          

T :表示数组中存放元素的类型
T[] :表示数组的类型
N :表示数组的长度
例如:

int [] array1 = new int [ 10 ]; // 创建一个可以容纳 10 int 类型元素的数组
double [] array2 = new double [ 5 ]; // 创建一个可以容纳 5 double 类型元素的数组
String [] array3 = new double [ 3 ]; // 创建一个可以容纳 3 个字符串元素的数组

当然这样创建的数组,其实也顺便将其初始化了,内部将其每个位置的元素初始化为0.

 数组的初始化:

动态初始化:

在创建数组时,直接指定数组中元素的个数。
int [] array = new int [ 10 ];

 

此时默认将10个元素初始化为0。

具体不同类型的数组默认初始化的默认值是有区别的:

如果数组中存储元素类型为引用类型,默认值为null

静态初始化:

在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定。
T[] 数组名称 = {data1, data2, data3, ..., datan};

例如:

int [] array1 = new int []{ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 };
double [] array2 = new double []{ 1.0 , 2.0 , 3.0 , 4.0 , 5.0 };
String [] array3 = new String []{ "hell" , "Java" , "!!!" };
注意:
1、静态初始化虽然 没有指定数组的长度 ,编译器在 编译时会根据{}中元素个数来确定数组的长度。
2、静态初始化时 , {} 中数据类型必须与 [] 前数据类型一致。
3、 静态初始化可以简写,省去后面的new T[]。

简写形式:

int [] array1 = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 };
double [] array2 = { 1.0 , 2.0 , 3.0 , 4.0 , 5.0 };
String [] array3 = { "hell" , "Java" , "!!!" };

 *数组的使用:

 数组的访问:

        这里和C与语言一样都是通过下标访问:

int [] array = new int []{ 1 , 2 , 3 , 4 , 5 };
System . out . println ( array [ 0 ]);
System . out . println ( array [ 1 ]);
System . out . println ( array [ 2 ]);
System . out . println ( array [ 3 ]);
System . out . println ( array [ 4 ]);
// 也可以通过 [] 对数组中的元素进行修改
array [ 0 ] = 10 ;
System . out . println ( array [ 0 ]);

注意:

1. 数组是一段连续的内存空间,因此 支持随机访问,即通过下标访问快速访问数组中任意位置的元素
2. 下标从0开始,介于[0, N)之间不包含N,N为元素个数,不能越界,否则会报出下标越界异常。

 如果遇到二的情况:

在Idea中会报:

 数组越界的信息!

数组的遍历:

普通方式:

        我们可以和C语言中一样,利用for循环进行遍历:

for(int i = 0;i< arr2.length;i++){
    System.out.print(arr2[i]+" ");
}

注意:
这里求数组的长度用到了一个Java自带的一个方法,数组名.length。 

加强版for循环遍历数组:

可以使用 for-each 遍历数组:

for(int x:arr2){
    System.out.print(x+" ");
}

//int x 表示arr2中的每一个元素可以用int 类型的基本数据类型接收。

for-each 是 for 循环的另外一种使用方式. 能够更方便的完成对数组的遍历. 可以避免循环条件和更新语句写错。

数组是引用类型:

内存的划分:

Java虚拟机运行时,JVM中的内存被划分为5个部分:

程序计数器 (PC Register): 只是一个很小的空间 , 保存下一条执行的指令的地址。
虚拟机栈 (JVM Stack): 与方法调用相关的一些信息, 每个方法在执行时,都会先创建一个栈帧 ,栈帧中包含 有:局部变量表 操作数栈 动态链接 返回地址 以及其他的一些信息,保存的都是与方法执行时相关的一 些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了
本地方法栈 (Native Method Stack): 本地方法栈与虚拟机栈的作用类似 . 只不过 保存的内容是 Native 方法的局 部变量 . 在有些版本的 JVM 实现中 ( 例如 HotSpot), 本地方法栈和虚拟机栈是一起的
(Heap) : JVM 所管理的最大内存区域 . 使用 new 创建的对象都是在堆上保存 ( 例如前面的 new int[]{1, 2, 3} ) 堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销
方法区 (Method Area) : 用于 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数 . 方法编译出的的字节码就是保存在这个区域

 引用类型与基本数据类型的区别:

基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;
而引用数据类型创建的变量,一般称为对象的引用,其空间中 存储的是对象所在空间的地址
例如:
public static void func () {
int a = 10 ;
int b = 20 ;
int [] arr = new int []{ 1 , 2 , 3 };
}

Java的数组的开辟与C语言不同,C语言数组的开辟都是在栈中开辟,但是Java数组的开辟是

在堆区开辟,虚拟机栈存储堆区开辟数组对象的地址。

C语言中数组的开辟:

引用变量:

 通过上述的分析:

        Java中的数组是一种引用,我们可以理解为存储数组的地址的变量就称为引用变量:

例如:

public static void func () {
int [] array1 = new int [ 3 ];
array1 [ 0 ] = 10 ;
array1 [ 1 ] = 20 ;
array1 [ 2 ] = 30 ;
int [] array2 = new int []{ 1 , 2 , 3 , 4 , 5 };
array2 [ 0 ] = 100 ;
array2 [ 1 ] = 200 ;
array1 = array2;
array1 [ 2 ] = 300 ;
array1 [ 3 ] = 400 ;
array2 [ 4 ] = 500 ;
for ( int i = 0 ; i < array2 . length ; i ++ ) {
System . out . println ( array2 [ i ]);
}
}

看到加红的地方,array2直接能传给array1,这里的含义就是将array2保存的数组的数组的地址传给array1,同时能让array1也可以访问arrat2指向的数组。

画图分析:

        

对null的理解:

Java中没有大写的NULL,只有小写的null。

null Java 中表示 "空引用" , 也就是一个不指向对象的引用.  

int [] arr = null ;
System . out . println ( arr [ 0 ]);
// 执行结果
Exception in thread "main" java . lang . NullPointerException
at Test . main ( Test . java : 6 )

 数组的应用:

作为函数的参数:

        这次如果想要交换两个值,可以把两个值存在数组里面进行交换:

    public static void swap(int[] arr){
    int tmp = arr[1];
    arr[1] = arr[0];
    arr[0] = tmp;
    }
    public static void main(String[] args) {
        int[] arr = {3,4};
        swap(arr);
        for(int i = 0;i< arr.length;i++){
            System.out.print(arr[i]+" ");
        }
发现在swap 方法内部修改数组的内容 , 方法外部的数组内容也发生改变 .
因为数组是引用类型,按照引用类型来进行传递, 是可以修改其中存放的内容的

作为函数的返回值:

计算斐波那契数。

public class TestArray {
public static int[] fib(int n){
if(n <= 0){
return null;
}
int[] array = new int[n];
array[0] = array[1] = 1;
for(int i = 2; i < n; ++i){
array[i] = array[i-1] + array[i-2];
}
return array;
}
public static void main(String[] args) {
int[] array = fib(10);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
}
}

 

有关数组的方法使用:

        Java 中提供了 java.util.Arrays 包, 其中包含了一些操作数组的常用方法:

数组转字符串:

import java . util . Arrays
int [] arr = { 1 , 2 , 3 , 4 , 5 , 6 };
String newArr = Arrays . toString ( arr );
System . out . println ( newArr );
// 执行结果
[ 1 , 2 , 3 , 4 , 5 , 6 ]

模拟实现Arrary.toString().

  public static void mytoString(int[] arr) {
        System.out.print("[");
        for (int i = 0; i <arr.length ; i++) {
            System.out.print(arr[i]+"");
            if(i != arr.length-1){
                System.out.print(",");
            }
        }
        System.out.print("]");
    }

数组的拷贝:

for循环拷贝:

    public static void main(String[] args) {
        int[] arr1 = {1,2,3,4,5,6};
        int[] arr2 = new int[6];
        for(int i = 0;i<arr1.length;i++) {
            arr2[i] = arr1[i];
        }
    }

使用ArrayscopyOf方法完成数组的拷贝:

        

public static void main(String[] args) {
    int[] arr1 = {1,2,3,4,5,6};
    int[] arr2 = null;
    arr2 = Arrays.copyOf(arr1,arr1.length);
    arr1[2] = 20;//为了验证是否真正拷贝了。
    System.out.println(Arrays.toString(arr2));//为了打印方便,将其转换为字符串打印
}

拷贝某个范围:

拷贝某个范围的话,可以直接使用Arrays.copyOfrange();

public static void main(String[] args) {
    int[] arr1 = {1,2,3,4,5,6};
    int[] arr2 = null;
    //arr2 = Arrays.copyOf(arr1,2*arr1.length);
    arr2 = Arrays.copyOfRange(arr1,2,5);//注意拷贝的下标为[2,5)左闭右开
    arr1[2] = 20;
    System.out.println(Arrays.toString(arr2));
}

求数组中所有元素的平均值:

    double sum = 0;
    for(int x:arr1){
        sum+=x;
    }
    double average = (double)sum/arr1.length;
    System.out.println(average);
}

  数组的二分查找:

public static int binary(int[] arr,int k){
    int mid = arr.length/2;
    int left = 0;
    int right = arr.length-1;
   while(left<right) {
       if(k>arr[mid]) {
           left = mid+1;
       }
       else if(k == arr[mid]) {
           return mid;
       }
       else {
           right = mid-1;
       }
   }
   return -1;
}

数组的逆序:

public static void reverse(int[] arr){
        int left = 0;
        int right = arr.length-1;
        while(left<right){
            int tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
            left++;
            right--;
        }
    }

上面的数组的练习需要做自己多来练,如果在C语言阶段练习过,还是建议在Java中在次练习! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2114501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nuxt3入门:过渡效果(第5节)

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 Nuxt 利用 Vue 的 <Transition> 组件在页面和布局之间应用过渡效果。 一、页面过渡效果 你可以启用页面过渡效果&#xff0c;以便对所有页面应用自动过渡效果。 nuxt.config.js export defaul…

冒泡排序——基于Java的实现

简介 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;适用于小规模数据集。其基本思想是通过重复遍历待排序的数组&#xff0c;比较相邻的元素并交换它们的位置&#xff0c;以此将较大的元素逐步“冒泡”到数组的末尾。算法的名称源于其运行过程…

动手学习RAG: 向量模型

在世界百年未有之变局与个人自暴自弃的间隙中&#xff0c;我们学一点RAG。 RAG是一种独特的应用&#xff0c;“一周写demo&#xff0c;优化搞半年”&#xff0c;我甚至听说它能破解幻术。 为了理解其优化中的关键一环&#xff0c;我们先看下文本向量。文本向量除了是RAG检索的…

# 键盘字母上有下标数字,输入时怎么一键去掉,关闭键盘上的下标数字。‌

键盘字母上有下标数字&#xff0c;输入时怎么一键去掉&#xff0c;关闭键盘上的下标数字。‌ 一、问题描述&#xff1a; 如下图&#xff0c;有的笔记本电脑键盘上&#xff0c;没有数字小键盘&#xff0c;数字小键盘会和字母混和在一起&#xff0c;这样打字时&#xff0c;不容…

AI在医学领域:MASL多模态辅助诊断声带麻痹

声带麻痹&#xff08;Vocal Cord Paralysis, VP&#xff09;&#xff0c;也称为喉瘫痪&#xff0c;是指由于支配声带的神经受损导致声带运动障碍的疾病。这种状况可以是单侧或双侧的&#xff0c;通常由脑部、颈部、胸部的肿瘤、外伤、炎症&#xff0c;以及各种全身疾病引起。这…

复数随机变量(信号)的方差和协方差矩阵的计算

怎么计算复数随机变量的方差和协方差矩阵&#xff1f; 使得其与MATLAB中var函数和cov函数的结果一致。 前言 复信号在信号处理中随处可见&#xff0c;关于复信号&#xff08;复随机变量&#xff09;的方差和协方差矩阵该如何计算呢&#xff1f;本文给出了复信号的方差和协方差矩…

什么是大数据、有什么用以及学习内容

目录 1.什么是大数据&#xff1f; 2.大数据有什么用&#xff1f; 2.1商业与营销&#xff1a; 2.2医疗与健康&#xff1a; 2.3金融服务&#xff1a; 2.4政府与公共服务&#xff1a; 2.5交通与物流&#xff1a; 2.6教育与个性化学习&#xff1a; 3.学习大数据需要学习哪…

C++笔试强训12、13、14

文章目录 笔试强训12一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训13一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训14一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训12 一、选择题 1-5题 引用&#xff1a;是一个别名&#xff0c;与其被引用的实…

认知杂谈54

I I 内容摘要&#xff1a; 这篇内容主要有以下几个要点&#xff1a;首先&#xff0c;沟通不在一个调时可学习人际交往心理学知识、线上课程及关注名师来改善。其次&#xff0c;挑房子、工作、搭档和人生伴侣要谨慎&#xff0c;找心灵相通能共同进步的人。再者&#xff0c;远离…

AI周报(9.1-9.7)

AI应用-Tidal 引领海洋养殖革命 Tidal团队&#xff0c;一个源自Alphabet X的创新项目&#xff0c;今年七月顺利从X实验室毕业&#xff0c;成为一家独立的公司。Tidal正在通过人工智能技术改变海洋养殖&#xff0c;特别是鲑鱼养殖。Tidal的总部位于挪威特隆赫姆&#xff0c;他们…

Java-数据结构-栈和队列-Stack和Queue (o゚▽゚)o

文本目录&#xff1a; ❄️一、栈(Stack)&#xff1a; ▶ 1、栈的概念&#xff1a; ▶ 2、栈的使用和自实现&#xff1a; ☑ 1&#xff09;、Stack(): ☑ 2&#xff09;、push(E e): ☑ 3&#xff09;、empty(): ☑ 4&#xff09;、peek(E e): ☑ 5&#xff09;、pop(E e): …

将添加功能的抽屉剥离,在父组件调用思路

一、新建组件 新建AddRoleEditerDrawer.vue<template><div><el-drawer v-model"dialog" title"添加角色" :before-close"handleClose" direction"rtl" colse"cancelForm"class"demo-drawer" moda…

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达深度摄像机的仿真小车&#xff0c;并使用通过跨平台的方式进行ROS2和UE5仿真的通讯&#xff0c;达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础&#xff0c;Nav2相关的学习教程可以参考本人的其他博…

MQ-2烟雾传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 mq2.h文件 mq2.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 MQ-2气体传感器是一种常用的气体传感器&#xff0c;用于检测空气中的烟雾浓度。工作原理是基于半导…

App Store最低版本要求汇总

1&#xff0c;自此日期起&#xff1a; 2024 年 4 月 29 日 自 2024 年 4 月 29 日起&#xff0c;上传到 App Store Connect 的 App 必须是使用 Xcode 15 为 iOS 17、iPadOS 17、Apple tvOS 17 或 watchOS 10 构建的 App。将 iOS App 提交至 App Store - Apple Developer 2&…

天然药物化学史话:“四大光谱”在天然产物结构鉴定中的应用-文献精读46

天然药物化学史话&#xff1a;“四大光谱”在天然产物结构鉴定中的应用&#xff0c;天然产物化学及其生物合成必备基础知识~ 摘要 天然产物化学研究在药物研发中起着非常重要的作用&#xff0c;结构研究又是天然产物化学研究中最重要的工作之一。在天然药物化学史话系列文章的…

Elasticsearch:无状态世界中的数据安全

作者&#xff1a;来自 Elastic Henning Andersen 在最近的博客文章中&#xff0c;我们宣布了支持 Elastic Cloud Serverless 产品的无状态架构。通过将持久性保证和复制卸载到对象存储&#xff08;例如 Amazon S3&#xff09;&#xff0c;我们获得了许多优势和简化。 从历史上…

科研绘图系列:R语言富集散点图(enrichment scatter plot)

介绍 富集通路散点图(Enrichment Pathway Scatter Plot)是一种数据可视化工具,用于展示基因集富集分析(Gene Set Enrichment Analysis, GSEA)的结果。 横坐标是对应基因名称,纵坐标是通路名称,图中的点表示该基因在某个通路下的qvalue,可以简单理解为不同环境下的贡献…

以后写代码都是AI自动写了,Cursor+Claude-3.5-Sonnet,Karpathy 点赞的 AI 代码神器。如何使用详细教程

Cursor 情况简介 AI 大神 Andrej Karpathy 都被震惊了&#xff01;他最近在试用 VS Code Cursor Claude Sonnet 3.5&#xff0c;结果发现这玩意儿比 GitHub Copilot 还好用&#xff01; Cursor 在短短时间内迅速成为程序员群体的顶流神器&#xff0c;其背后的原因在于其默认使…

AIGC批量处理文件系列:word、pdf文件改名

1.背景 大家应该也有遇到&#xff0c;自己电脑有很多文件命名不合理的文件&#xff0c;比如&#xff1a;文件1、想法3 &#xff0c;当你长时间再看到这个文件的时候&#xff0c;已经很难知道文件内容。 今天我们将借助AIGC的编码能力&#xff0c;帮我们生成一个批量改文件名的…