JavaSE入门必读篇——详解数组

news2024/11/18 12:17:17

文章目录

  • 数组的概念
    • 1.什么是数组呢?
    • 2.如何创建数组
    • 3.遍历数组
    • 4.扩展:快速批量初始化
  • 数组原理内存图
    • 1. 内存概述
    • 2.Java虚拟机的内存划分
    • 3.其存储方式图
    • 4.认识null
  • 二维数组
    • 二维数组初始化
    • 遍历二维数组
  • 数组常见异常
    • 1. 数组越界异常
    • 2. 数组空指针异常
  • Java常用API
    • 1. 输出数组 `Arrays.toString()`
    • 2.数组复制`copyOf()`
    • 3.数组排序`sort()`
    • 4.二维数组转字符打印`deepToString()`
  • 数组与方法的使用

数组的概念

假设现在要存5个学生的javaSE考试成绩,并对其进行输出,我们也许会:

public class TestStudent{
  public static void main(String[] args){
    int score1 = 70;
    int score2 = 80;
    int score3 = 85;
    int score4 = 60;
    int score5 = 90;
    
    System.out.println(score1);
    System.out.println(score2);
    System.out.println(score3);
    System.out.println(score4);
    System.out.println(score5);
  }
}

我们成功实现了,可是50个呢?500个呢?5000个呢?我们总不能把这么多变量依次定义吧,况且他们都是数据类型相同的变量,那么java是通过什么来方便我们的使用的呢?这就是本文章所要讲到的数组。

1.什么是数组呢?

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

例如车库:1.每个车位都是用来停车的;2.车位是连在一起的;3.车位都有属于自己的编号

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

2.如何创建数组

数组的两种常见初始化方式:

  • 1.动态初始化(指定长度)
  • 2.静态初始化(指定内容)

具体语法如下:

1.动态初始化

数组存储的数据类型[ ] 数组名字 = new 数组存储的数据类型[数组长度];
数组存储的数据类型 数组名字[ ] = new 数组存储的数据类型[数组长度];//不建议使用

第一种列举方式实例如下:

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

注:1.new:关键字,创建数组使用的关键字; 2.数组有定长特性,长度一旦指定,不可更改。
当我们定义长度而没有具体数值时,我们java会提供默认值赋值:
在这里插入图片描述

2.静态初始化

数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3…};

示例如下:

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", "!!!"};
**3.静态初始化省略模式**

我们最为常用的是静态初始化的省略方式:

数据类型[] 数组名 = {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", "!!!"};

注:该方法不可拆分定义

3.遍历数组

数组在内存中是一段连续的空间,空间的编号都是从0开始的,依次递增,该编号称为数组的下标,数组可以通过下标访问其任意位置的元素。例如:

int[]array = new int[]{10, 20, 30, 40, 50};
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] = 100;// 也可以通过[]对数组中的元素进行修改
System.out.println(array[0]);

【注意事项】

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

比如:

int[] array = {1, 2, 3};
System.out.println(array[3]); // 数组中只有3个元素,下标一次为:0 1 2,array[3]下标越界
// 执行结果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
       at Test.main(Test.java:4)

遍历数组的三大方式

循环打印:

int[]array = new int[]{10, 20, 30, 40, 50};
for(int i = 0; i < 5; i++){
   System.out.println(array[i]);
}

int[]array = new int[]{10, 20, 30, 40, 50};
for(int i = 0; i < array.length; i++){       //数组名.length求数组长度
   System.out.println(array[i]);
}

** for-each 遍历数组:**
int[] array = {1, 2, 3};
for (int x : array) {
    System.out.println(x);
}
**转字符打印:** ![在这里插入图片描述](https://img-blog.csdnimg.cn/31653a61b0d646d48af45d152ad1dd26.png)
import java.util.Arrays;

public class text1 {
    public static void main(String[] args) {
        int[] array={1,2,3,4,5,6};
        System.out.println(Arrays.toString(array));
    }
}

效果展示如下:
在这里插入图片描述

4.扩展:快速批量初始化

Arrays.fill 快速初始化,填充一个数组。
我们看jdk1.8帮助手册里的说明:
在这里插入图片描述
实例:

import java.util.Arrays;

public class HelloWorld {
    public static void main(String[] args) {
        int[] arr = new int[5];
        Arrays.fill(arr, 1);
        System.out.println(Arrays.toString(arr));  // [1, 1, 1, 1, 1]
    }
}

数组原理内存图

1. 内存概述

内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。 Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
简单来概括就是以下四点:

  1. 程序运行时代码需要加载到内存
  2. 程序运行产生的中间数据要存放在内存
  3. 程序中的常量也要保存
  4. 有些数据可能需要长时间存储,而有些数据当方法运行结束后就要被销毁

2.Java虚拟机的内存划分

为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

  • JVM内存划分
    在这里插入图片描述

  • 虚拟机栈(JVM Stack): 与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含
    有:局部变量表、操作数栈、动态链接、返回地址以及其他的一些信息,保存的都是与方法执行时相关的一
    些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了。

  • 堆(Heap): JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 (例如前面的 new int[]{1, 2,
    3} ),堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销
    毁。

3.其存储方式图

引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。

通过该地址,引用变量便可以去操作对象。有点类似C语言中的指针,但是Java中引用要比指针的操作更简单。

在这里插入图片描述
注:变量array保存的是数组内存中的地址,而不是一个具体数值,因此称为引用数据类型。

import java.util.Arrays;

public class text1 {
    public static void main(String[] args) {
        int[] array1={1,2,3,4,5,6};
        int[] array2=new int[6];
        array2=array1;
        System.out.println(Arrays.toString(array2));
        array2[1]=300;
        System.out.println(Arrays.toString(array1));
    }
}

在这里插入图片描述
请大家思考为什么会有这样的效果,可以私信博主呦!

4.认识null

null 在 Java 中表示 “空引用” , 也就是一个不指向对象的引用,null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操作。

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

二维数组

二维数组初始化

同一维数组一样,共有4总不同形式的定义方法:

int[][] array1 = new int[10][10];
int array2[][] = new int[10][10];
int array3[][] = { { 1, 1, 1 }, { 2, 2, 2 } };
int array4[][] = new int[][] { { 1, 1, 1 }, { 2, 2, 2 } };

注:二维数组定义不可省略行

不规则二维数组:

int[][] array = new int[3][];
array[0] = new int[1];
array[1] = new int[2];
array[2] = new int[3];

遍历二维数组

import java.util.Arrays;

public class text1 {
    public static void main(String[] args) {
        int[][] array={{1,2,3},{2,4,5},{1,2}};
        System.out.println(Arrays.deepToString(array));

    }
}

在这里插入图片描述

数组常见异常

1. 数组越界异常

public static void main(String[] args) {
int[] arr = {1,2,3};
System.out.println(arr[3])
}

报错信息如下:

在这里插入图片描述

数组的索引是0.1.2,没有3索引,因此我们不能访问数组中不存在的索引出现该异常必须修改!

2. 数组空指针异常

我们在认识null中已经简要说明,我们来看内存:
在这里插入图片描述

Java常用API

1. 输出数组 Arrays.toString()

 int[] array = { 1, 2, 3 };
 System.out.println(Arrays.toString(array));

2.数组复制copyOf()

import java.util.Arrays;

public class text1 {
    public static void main(String[] args) {
        int[] array={1,2,3,4,5,6};
        int[] ret=Arrays.copyOf(array,array.length*2);//复制同时扩容
        System.out.println(Arrays.toString(array));
        System.out.println(Arrays.toString(ret));

    }
}

效果如下:
在这里插入图片描述

3.数组排序sort()

import java.util.Arrays;

public class text1 {
    public static void main(String[] args) {
        int[] array={1,6,5,4,9};
        System.out.println(Arrays.toString(array));
        Arrays.sort(array);
        System.out.println(Arrays.toString(array));

    }
}

在这里插入图片描述

4.二维数组转字符打印deepToString()

import java.util.Arrays;

public class text1 {
    public static void main(String[] args) {
        int[][] array={{1,2,3},{2,4,5},{1,2}};
        System.out.println(Arrays.deepToString(array));

    }
}

数组与方法的使用

在java当中,数组可以作为返回值来使用

举例:斐波那契数列->

public class text1 {
    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.println(array[i]);
        }
    }
}

部分截图如下:
在这里插入图片描述

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

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

相关文章

Windows下编译安装gRPC

gRPC是Google基于HTTP/2协议开发的一套开源、跨平台的高性能RPC框架&#xff0c;可用于连接微服务架构内的各种服务&#xff0c;亦可以连接客户端与后端服务。 Ref. from gRPC gRPC is a modern open source high performance Remote Procedure Call (RPC) framework that can…

代码随想录算法训练营第二十四天|理论基础 77. 组合

文章目录 理论基础77.组合思路代码总结 理论基础 回溯算法&#xff1a;一种暴力搜索方式 回溯是递归的副产品&#xff0c;只要有递归就会有回溯。 回溯法&#xff0c;一般可以解决如下几种问题&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合切割问题…

数据安全技术工作部成员动态 | 鸿翼联合天空卫士打造“基于内容的敏感信息处理”解决方案

据2022年统计数据表明&#xff0c;因IT故障、人为错误、供应链攻击、破坏性攻击和勒索软件攻击等原因导致的数据泄露事件频繁发生&#xff0c;信息安全问题比以往任何一个时代都更为突出。信息泄漏造成的危害体现在多方面&#xff0c;不法分子通过各种途径收集的公司的某些重要…

大数据法律监督模型优势特色及应用场景

大数据法律监督平台是基于监督数据整合管理平台、监督模型构建平台、内置模型库以及法律监督线索管理平台打造的一套服务于检察机关法律监督工作的专业化系统。通过数据采集、融合、挖掘、建模、展现等一系列能力&#xff0c;辅助检察官从纷繁复杂的数据中&#xff0c;开展多维…

基于可靠姿态图初始化和历史重加权的鲁棒多视图点云配准

论文作者 | Haiping Wang, Haiping Wang,Haiping Wang,etal 论文来源 | CVPR2023 文章解读 | William 1 摘要 之前的多视图配准方法依赖于穷举成对配准构造密集连接的位姿图&#xff0c;并在位姿图上应用迭代重加权最小二乘(IRLS)计算扫描位姿。但是&#xff0c;构造一个密集…

产品经理必读丨如何找准产品定位?

我们都知道&#xff0c;当一款新产品开始立项之前&#xff0c;势必需要经过谨慎的市场调研才能整合资源启动新的项目&#xff0c;但除此之外&#xff0c;作为产品经理还需要做好一件关键的事情——找准产品在市场中的定位。 什么是产品定位 百度百科对产品定位的解释是非常准确…

重磅新闻!!! ChatGPT手机 app上线苹果app store

就在刚才&#xff0c;打开Tor访问openAI官网准备看看有什么新闻&#xff0c;结果吓我一跳啊&#xff01; &#x1f447;&#x1f447;&#x1f447; ChatGPT app上线APP store了&#xff01; 我马上拿出手机&#xff0c;一搜索&#xff0c;哎~出现了&#xff1a; chatgpt ios …

想端起“铁饭碗”,你最好先学会这个!

正文共 886 字&#xff0c;阅读大约需要 3 分钟 公务员必备技巧&#xff0c;您将在3分钟后获得以下超能力&#xff1a; 快速生成推荐材料 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 ●图片由Lexica 生成&#xff0c;输入&a…

Linux---cd命令、pwd命令、mkdir命令

1. cd命令 当Linux终端&#xff08;命令行&#xff09;打开的时候&#xff0c;会默认以用户的HOME目录作为当前的工作目录 我们可以通过cd命令&#xff0c;更改当前所在的工作目录。 cd命令来自英文&#xff1a;Change Directory 语法&#xff1a;cd [ linux路径] cd命令…

OpenAI被曝将发布全新开源大模型,网友:GPT平替?

来源 | 量子位 | 公众号 QbitAI OpenAI终于要“Open”了&#xff01; 最新爆料&#xff0c;他们正准备发布全新的开源语言模型。 GPT-2之后&#xff0c;这尚属四年来首次。 不少网友戳戳手表示期待&#xff1a;这是要发自己的开源平替了吗&#xff1f; 毕竟目前最好的开源…

单片机--SPI协议

目录 【1】SPI协议 1.SPI协议 2.SPI时序 【2】LCD液晶显示屏 【3】点亮LCD显示屏 图片显示 汉字显示 【1】SPI协议 1.SPI协议 SPI(Serial Peripheral Interface)是 摩托罗拉公司(Motorola)首先提出的全双工同步串行外设接口&#xff0c;采用主从模式&#xff08;Master、…

webpack核心原理

背景 Webpack 特别难学&#xff01;&#xff01;&#xff01; 时至 5.0 版本之后&#xff0c;Webpack 功能集变得非常庞大&#xff0c;包括&#xff1a;模块打包、代码分割、按需加载、HMR、Tree-shaking、文件监听、sourcemap、Module Federation、devServer、DLL、多进程等…

传感云智慧公厕综合解决方案,实现公厕精细化管理

随着国家“公厕革命”建设工作的持续推动与科技创新技术的不断进步&#xff0c;人们对“方便”与“卫生”的要求越来越高&#xff0c;智慧公厕已然成为智慧城市建设规范下的公共厕所新形态&#xff0c;不仅可以解决传统公厕的脏乱差、异味和管理难题&#xff0c;同时可以为用户…

前端 之 FormData对象进阶

一、进阶知识 在前一篇博客中&#xff0c;我讲解了FormData对象的基础概念、相关方法和基本用法&#xff0c;本篇博客我将讲解一些FormDate对象相关的进阶知识&#xff0c;主要包含FormData与其他对象结合使用的各类场景&#xff0c;以及一些使用技巧。 1、FormData对象、JSO…

在一个不小但很美的公司里工作

在这个公司里学到了什么 电商交易前业务&#xff1a;商品&#xff0c;库存&#xff0c;物流&#xff0c;会员 &#xff1b; 电商广告部分业务&#xff1a; 网红&#xff0c;联盟&#xff1b; 并且对这些业务里的核心流程&#xff0c;核心技术 有过总结。核心技术问题采用对应…

HTTP.sys远程代码执行

本文转载与&#xff1a;https://blog.csdn.net/weixin_47723270/article/details/129472716 01 漏洞描述 HTTP.sys是Microsoft Windows处理HTTP请求的内核驱动程序&#xff0c;为了优化IIS服务器性能&#xff0c;从IIS6.0引入&#xff0c;IIS服务进程依赖HTTP.sys。HTTP.sys远程…

keycloak异常关闭报错username ‘admin‘ already added时卡死无法重启的问题处理

问题现象 使用docker部署keycloak服务&#xff0c;使用docker-compose进行配置管理&#xff0c;配置如下&#xff1a; keycloak:image: jboss/keycloak:16.1.0 container_name: keycloakcommand:[-b,0.0.0.0,-Dkeycloak.migration.actionimport,-Dkeycloak.migration.provider…

UE5中如何新建C++类?

UE5 插件开发指南 前言0.如何在UE编辑器内创建C++类?1.如何在UE编辑器外创建C++类?前言 这个问题应该细分成两个问题: (1)如何在编辑器内创建C++类? (2)如何在编辑器外创建C++类? 问题(1)主要针对那些可以在编辑器内继承并创建的类,然而有些内是无法在编辑内继承的,必须在…

overflow属性的常用值详解

什么是overflow 在CSS中&#xff0c;overflow是“溢出”的意思&#xff0c;该属性规定当内容溢出元素框时发生的事情&#xff0c;设置内容是否会被修剪&#xff0c;溢出部分是否会被隐藏&#xff1b;例如当属性值设置为“visible”则内容不会被修剪&#xff0c;为“hidden”则内…

软件测试用例包括_白盒测试用例

测试用例分层 每个测试用例都有1个或多个测试步骤&#xff08;List[step]&#xff09;&#xff0c;每个测试步骤对应一个API请求或其他用例的引用。 从上图分析&#xff0c;我们可以看到testsuite中包含了3个测试用例&#xff0c;testcase1中有4个请求和一个步骤teststep12&am…