当前位置: 首页 > news >正文

JAVA系列之数组的秘密(数组的一般用法+力扣 斯坦福大学练习精解)

大佬们好呀~
更多精彩: 个人主页
JAVA专栏

在这里插入图片描述

文章目录

  • 一、数组的概述
    • 1.1什么是数组?
    • 1.2注意:
    • 1.3建议:
  • 二、数组的定义
    • 1.格式:
  • 三、数组的静态初始化
    • 1.数组的初始化:
    • 2.静态初始化:
      • 格式:
      • 数组的长度:
  • 四、数组的地址值
    • 1.1地址值:
    • 1.2拓展:
  • 五、数组的元素访问
    • 1.格式:
    • 2.索引:
    • 3.获取数组中的元素
    • 4.把数据存入到数组中
  • 六、数组的遍历
    • 1.数组的遍历:
    • 2.拓展:
    • 3.练习:
      • 3.1遍历数组求和
      • 3.2条件变化
  • 七、数组的动态初始化
    • 1.动态初始化:
      • 1.1信息存入:
        • 1.1.1添加:
        • 1.1.2获取:
      • 1.2数组默认初始化值的规律
    • 2.动态初始化与静态初始化的区别
  • 八、数组的常见问题
  • 九、数组的常用操作
    • 1.求最值
    • 2.遍历求和
    • 3.交换数据
    • 4.打乱数据
  • 十、数组的内存图
    • 1.java的内存分配
    • 2.数据的内存图

前言
在 Java 编程中,我们经常要处理一系列数据,数组作为最基础、常用的数据结构,就像有序容器,能有效存储和管理数据。接下来,让我们深入探索 Java 数组,从基础到高级,掌握这一关键知识,助力 Java 编程。

一、数组的概述

1.1什么是数组?

数组指的是一种容器,可以用来存储同种数据类型的多个值。

1.2注意:

这里在存储数据的时候要注意隐式转换。

int 类型的容器可存储(byte,short,intdouble 类型的数组容器可储存(byte,short,int,long,float,double)(大)double>float>long>int>short>byte(小)大可以储存小(隐式转换),小不可以储存大!(强制转换)

1.3建议:

容器的类型和存储的数据类型保持一致~!

二、数组的定义

1.格式:

格式:数据类型 [] 数组名 或 数据类型 数组名 []int [] arry 或 int arry []

[]此符号代表定义的是一个数组,不写代表定义的是一个变量

三、数组的静态初始化

1.数组的初始化:

初始化:就是在内存中,为数组容器开辟空间,并将数组存入容器中的过程。

包括:静态初始化和动态初始化

2.静态初始化:

数组的内容是固定的已知的。

格式:

完整格式:数据类型 [] 数组名 = new 数据类型[]{元素1,元素2,元素3......};
int [] nums = new int [] {1,2,3,4,5};简化格式:数据类型[] 数组名={元素1,元素2};
int arry []={123};

数组的长度:

arry : 长度为3

112233

四、数组的地址值

当我们定义一个数组,其中含有三个元素(1,2,3),打印出这个数组arry.

eg:
int arry []={1,2,3};
System.out.println(arry);

运行展示:

[I@10f87f48

运行出来会出现一段乱码,当然乱码并不是真的乱码,而是数组的地址值

1.1地址值:

就是表示数组在内存中的位置。

1.2拓展:

解释一下地址值的格式含义:

[:表示当前是一个数组

I:表示当前数组里面的元素是int类型的

@:表示一个间隔符号(固定格式)

10f87f48:这才是数组真正的地址值(十六进制)

平时我们习惯性的会把这个整体叫做数组的地址值

五、数组的元素访问

1.格式:

数组名[索引];
eg:
nums[0];

2.索引:

数值1234
索引(下标)0123

特点:从0开始,逐个+1增长,连续不断

3.获取数组中的元素

int [] arr={11,12,13};
int num=arr[0];
System.out.println(num);简单写法:
int [] arr={11,12,13};
System.out.println(arr[0]);
run:
11

4.把数据存入到数组中

格式:
数组名[索引]=具体数据/变量arr[0]=100
public class boke {public static void main(String[] args) {int [] arr={11,12,13};arr[0]=100;System.out.println(arr[0]);}
}
run:
100

细节:一旦覆盖之后,原来的数据就不存在了

六、数组的遍历

1.数组的遍历:

将数组中所有的内容取出来,取出来之后(打印,求和,判断)

注:遍历指的是取出数据的过程不要局限的理解为遍历就是打印

根据我们上文的学习,大家可能会想,我一个个使用arr[i]打印出来不行吗?

public class boke{public static void main(String[]args){int [] arr={1,2,3,4,5};System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);System.out.println(arr[3]);System.out.println(arr[4]);}
}
run:
1
2
3
4
5

虽然这样一个一个println也可以遍历出数组的数据,可是当数组的数据个数足够庞大时我们应该怎么办呢?

我们想到了循环:将索引换成变量i,然后再循环打印arr[i]

我们来做一下代码实现:

int [] arr={11,12,13};
for (i=0;i<=4;i++){System.out.println(arr[i]);
}

我们在写循环时可能会遇到数组长度的问题,我们有一个官方写法:

调用方式:
数组名.length
System.out.println(arr.length);
//打印数组的长度

2.拓展:

自动的快速生成数组的遍历方式

由IDEA提供的,数组名.fori回车,就会出现以下代码。

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

3.练习:

3.1遍历数组求和

//将数组中的11,22,33,44,55,66,77,88,99求和
public class bianli{public static void main (String[]args){int [] num ={11,22,33,44,55,66,77,88,99};int sum = 0;for (int i=0 ; i<num.length ; i++){sum+=num[i];}System.out.println(sum);}
}

3.2条件变化

//如果是奇数,将当前数字扩大两倍,偶数将当前数字变成1/2
int [] num={1,2,3,4,5,6,7,8,9,10};
for (i=0 ; i<num.length ; i++){if (num[i]%2==0){num[i]/=2;}else{num[i]*=2;}System.out.println(num[i]);
}

一般情况下,一个循环只做一件事,于是我们可以优化一下

int [] num={1,2,3,4,5,6,7,8,9,10};
for (i=0 ; i<num.length ; i++){if (num[i]%2==0){num[i]/=2;}else{num[i]*=2;}
}
for (i=0 ; i<num.length ; i++){System.out.println(num[i]);
}//重新遍历一下

七、数组的动态初始化

1.动态初始化:

初始化时只指定数组长度,由系统为数组分配初始值。

格式:
数据类型[]数组名=new 数组类型[数组长度];
int [] arr = new int [3];
//先建立一个空壳,[3]说明只能存3个int类型的整数

在创建的时候,有我们自己指定数组的长度,由虚拟机给出默认的初始值。

1.1信息存入:

1.1.1添加:
arr[0]=3;
1.1.2获取:
System.out.println(arr[1]);run:0(默认初始化值)

1.2数组默认初始化值的规律

整数类型:默认初始化值0
小数类型:默认初始化值0.0
字符类型:默认初始化值‘/u0000’空格
布尔类型:默认初始化值false
引用数据类型:默认初始化值null

2.动态初始化与静态初始化的区别

动态:

含义:手动指定数组的长度,由系统给出默认初始化值

只明确元素的个数,不明确具体数值,推荐使用动态初始化

eg:

使用数组容器来存储键盘录入的5个整数

int [] arr = {????};
int [] arr = new int[5]

静态

含义:手动指定数组元素,系统会根据元素个数,计算出数组的长度。

需求中已经明确了要操作的具体数据,直接静态初始化即可。

eg:

将全班 的学生成绩存入数组中11,22,33

int [] nums= {11,22,33};

八、数组的常见问题

索引越界异常:访问了不存在的索引

索引的范围:0~数组的长度-1

九、数组的常用操作

1.求最值

//已知数组元素为{33,5,22,44,55},请找出数组中最大的值并打印在控制台。
public class wenti {public static void main(String[] args) {int [] best ={33,5,22,44,55};int max = best[0];//记录数值的变化for (int i = 0; i < best.length; i++) {//遍历数组中的每一个元素,让他和max比较,如果找到更大的就记录if (best[i]>max) {max = best[i];}}System.out.println(max);}
}

2.遍历求和

//生成10个1-100之间的随机数存入数组
//求出所有数据的和
//求出所有数据的平均数
//统计有多少个数据比平均数小
import java.util.Random;
public class suym {public static void main(String[] args) {Random rand = new Random();int [] num  = new int[10];int sum = 0;int count = 0;for (int i = 0; i < 10; i++) {int x = rand.nextInt(100)+1;num[i] = x;sum += x;System.out.println(x);if (num[i] < sum/10){count++;}}System.out.println("生成随机数的和为:"+sum);System.out.println("生成随机数的平均数为:"+sum/10);System.out.println("小于平均数的个数为:"+count);}
}

3.交换数据

//将数组{1,2,3,4,5}顺序交换
public class jiaoone {public static void main(String[] args) {int [] arr={1,2,3,4,5};//从两头开始遍历,然后交换for(int i=0 , j=arr.length-1 ; i<j ; i++,j--){//找一个工具人,方便交换int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}for (int i = 0; i < arr.length; i++) {//print同行打印System.out.print(arr[i]+" ");}}
}

4.打乱数据

//需求:将数组打乱
import java.util.Random;
public class da {public static void main(String[] args) {//导入随机数Random ran=new Random();int random=ran.nextInt(nums.length);int [] nums={1,2,3,4,5};for (int i = 0; i < nums.length; i++) {//遍历数组拿着它和随机索引交换int temp=nums[i];nums[i]=nums[random];nums[random]=temp;}for (int i = 0; i < nums.length; i++) {System.out.print(nums[i]+" ");}}}

十、数组的内存图

1.java的内存分配

在这里插入图片描述

注:从JDK8开始,取消方法区,新增原空间,把原来方法区的多种功能拆分,有的功能放到了推中,有的功能放到了元空间中。

在这里插入图片描述

:方法运行时使用的内存,比如main方法运行进入方法栈中执行。

:存储对象或者数组,new来创建的,都存在堆内存

方法区:存储可以运行的class文件

本地方法栈:JVM在使用操作系统功能的时候,和我们开发无关。

寄存器:给CPU使用,和我们开发无关

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

2.数据的内存图

通过arr找到地址值,再通过索引找到数组内容。

注:

1.只要是new出来的一定是在推里面开辟了一个小空间

2.如果new了多次,那么在堆里面有多个小空间,每个小空间中都有各自的数据。
在这里插入图片描述

两个数组指向同一个空间的内存图:

注:当两个数组指向同一个小空间时,其中一个数组对小空间中的值发生了改变,那么其他数组再次访问的时候都是修改之后的结果了。

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

相关文章:

JAVA系列之数组的秘密(数组的一般用法+力扣 斯坦福大学练习精解)

大佬们好呀~ 更多精彩&#xff1a; 个人主页 JAVA专栏 文章目录 一、数组的概述1.1什么是数组&#xff1f;1.2注意:1.3建议&#xff1a; 二、数组的定义1.格式&#xff1a; 三、数组的静态初始化1.数组的初始化:2.静态初始化&#xff1a;格式&#xff1a;数组的长度&#xff1a…...

探索飞鹤奶粉奥秘,领会科技魅力

在科技迅猛发展的当下&#xff0c;AI 技术正深刻重塑各行业格局。乳制品行业亦不例外。近日&#xff0c;长江商学院「AI 未来空间站」的同学们深入走访了飞鹤集团&#xff0c;探寻其在数字化浪潮中的创新实践与卓越成就。 在飞鹤的智能化生产车间&#xff0c;同学们目睹了高度自…...

【数据仓库】StarRocks docker部署

StarRocks docker部署 一、环境准备安装 docker 及 docker-compose操作系统相关禁用及配置【CentOS Linux 7 (Core)】 二、StarRocks-v2.5【存算一体,3FE,3BE】BE节点配置FE节点配置服务启动BE节点添加FE 节点添加 三、监控(待完善)四、VIP Nginx Keepalived(待完善)五、Star…...

Java虚拟机面试题:内存管理(下)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

R语言用逻辑回归贝叶斯层次对本垒打数据与心脏移植数据后验预测检验模拟推断及先验影响分析|附数据代码...

全文链接&#xff1a;https://tecdat.cn/?p40152 在统计学领域中&#xff0c;层次建模是一种极为强大且实用的工具。它能够巧妙地处理复杂的数据结构&#xff0c;通过分层的方式对数据进行建模。在贝叶斯统计的框架内&#xff0c;层次建模优势尽显&#xff0c;其可以有效地融合…...

网页制作02-html,css,javascript初认识のhtml的文字与段落标记

用一首李白的将进酒,对文字与段落标记进行一个简单的介绍演示&#xff1a; 目录 一、标题字 1、标题字标记h 2、标题字对其属性align 二、文本基本标记 1、字体属性face 2、字号属性size 3、颜色属性 Color 三、文本格式化标记 1、粗体标记 b &#xff0c;strong 2、…...

【SpringBoot苍穹外卖】debugDay04

一、getById 与 new 我在修改数据时&#xff0c;产生疑问&#xff0c;注释掉是我一开始写得&#xff0c;new对象是答案提供的&#xff0c;我就好奇两者之间区别。 1. 使用 setmealMapper.getById 获取现有对象 Setmeal setmeal setmealMapper.getById(setmealDTO.getId()); …...

C++中的顺序容器(一)

文章目录 顺序容器概述所有容器类型都支持的操作迭代器容器定义与初始化将一个容器初始化为另一个容器的拷贝标准库array具有固定大小 赋值和swap关系运算符 顺序容器的特有操作向顺序容器添加元素访问元素删除元素特殊的forward_list操作改变容器的大小容器操作可能是迭代器失…...

【复现DeepSeek-R1之Open R1实战】系列4:跑通GRPO!

目录 1 配置环境2 训练2.1 命令和配置参数2.2 num_generations2.2.1 参数定义2.2.2 参数含义2.2.3 示例2.2.4 使用场景2.2.5 示例代码 2.3 显存占用和耗时 3 结果 1 配置环境 关于环境配置&#xff0c;可以参考这篇博文&#xff1a;【复现DeepSeek-R1之Open R1实战】系列1&…...

Redis原理简述及发布订阅消息队列

目录 1 什么是Redis 2 Redis 非阻塞IO内部原理 2.1 IO多路复用策略 2.2 Reactor设计模式 3 基于PubSub的消息队列&#xff08;发布-订阅&#xff09; 由于集群之后存在多台服务器&#xff0c;并且不同客户端连接的可能是不同的服务器&#xff0c;因此在聊天过程中涉及到服…...

ThreadLocal为什么会内存溢出

每个线程(Thread 对象)内部维护一个 ThreadLocalMap,用于存储该线程的所有 ThreadLocal 变量的键值对: ThreadLocalMap虽然是ThreadLocal的静态内部类,但是Thread 对象的属性,当线程存活时ThreadLocalMap不会被回收。 Key:ThreadLocal 实例的 弱引用(WeakReference)。…...

假面与演员:到底是接口在使用类,还是类在使用接口?编程接口与物理接口的区别又是什么?

前言&#xff1a;本篇文章解释了接口学习过程中的2个常见问题&#xff0c;一个是“为什么是类在使用接口”&#xff0c;另一个一个是“编程接口与物理接口的差异源于所处的抽象层次和交互模式的不同”&#xff0c;旨在揭示编程接口的本质。 Part1.是类在使用接口 当学习接口时…...

数据结构——Makefile、算法、排序(2025.2.13)

目录 一、Makefile 1.功能 2.基本语法和相关操作 &#xff08;1&#xff09;创建Makefile文件 &#xff08;2&#xff09;编译规则 &#xff08;3&#xff09;编译 &#xff08;4&#xff09;变量 ①系统变量 ②自定义变量 二、 算法 1.定义 2.算法的设计 &#xff…...

算法之 跳跃游戏

文章目录 55.跳跃游戏思路参考&#xff1a;56.合并区间 55.跳跃游戏 55.跳跃游戏 灵神思路 思路分析&#xff1a; 两种思路&#xff0c;思路1是我们可以直接维护当前到达i的时候所能到达的最右的边界mr&#xff0c;如果i>mr就说明无法到达i,否则就是可以到达&#xff1b;…...

C#中的图形渲染模式

在C#中&#xff0c;图形模式通常用于定义如何渲染或处理图形。可以枚举定义如下四种图形模式&#xff1a;AUTO、GDI、DIB 和 FBO。这些模式可能用于指定不同的图形渲染技术或后端。下面是对这些模式的详细解释&#xff1a; 1. AUTO (自动模式) 含义&#xff1a;自动选择最适合…...

二.数据治理流程架构

1、数据治理流程架构核心思想&#xff1a; 该图描绘了一个以数据标准规范体系为核心&#xff0c;大数据生命周期管理为主线&#xff0c;数据资源中心为依托&#xff0c;并辅以数据质量管理和大数据安全与隐私管理的数据治理流程架构。它旨在通过规范化的流程和技术手段&#x…...

瑞萨RA-T系列芯片ADCGPT功能模块的配合使用

在马达或电源工程中&#xff0c;往往需要采集多路AD信号&#xff0c;且这些信号的优先级和采样时机不相同。本篇介绍在使用RA-T系列芯片建立马达或电源工程时&#xff0c;如何根据需求来设置主要功能模块ADC&GPT&#xff0c;包括采样通道打包和分组&#xff0c;GPT触发启动…...

扩散模型中的马尔可夫链设计演进:从DDPM到Stable Diffusion全解析

一、技术原理与数学推导&#xff08;附核心公式&#xff09; 1.1 扩散过程数学建模 马尔可夫链前向过程定义&#xff1a; q(x_{1:T}|x_0) \prod_{t1}^T q(x_t|x_{t-1})噪声调度函数&#xff08;以余弦调度为例&#xff09;&#xff1a; \beta_t \frac{1 - \cos(\pi t/T)}…...

通俗诠释 DeepSeek-V3 模型的 “671B” ,“37B”与 “128K”,用生活比喻帮你理解模型的秘密!

欢迎来到涛涛聊AI。 在DeepSeek-V3模型的参数描述中&#xff0c;你可能会看到类似“671B 37B 128K”这样的标记。这些字母和数字的组合看起来像密码&#xff0c;但其实它们揭示了模型的“大脑容量”和“工作方式”。我们用日常生活的比喻来解释&#xff1a; 一、数字含义&…...

大模型常识:什么是大模型/大语言模型/LLM

本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 一、什么是语言模型? 那么什么是语言模…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...