JavaSE--全盘拿下数组的关键要领

news2025/1/19 14:18:34

嗨嗨大家~我来啦!今天我们来进入数组的学习吧。

目录

一 数组的定义

1 创建数组

2 初始化数组 

二 数组的使用 

1 数组的访问

2 数组的遍历 

2.1 for 循环打印

2.2 for-each 打印数组 

三 数组是引用类型

3.1 JVM内存分布

3.2  区分基本类型与引用类型变量

3.3 认识null

四 实际应用数组

4.1 数组作为函数参数

4.2 修改数组内容 

1 直接传变量

2 传的是数组 

3 传数组返回的也是数组 

五 数组方法的使用

 5.1 toString

5.2 copyOf

六 查找数组中的元素 

6.1 顺序查找

6.2 二分查找 binarySearch

 七 数组排序

 7.1 冒泡排序

7.2 sort 排序方法 

八 数组逆置 

九 二维数组的定义 

十 二维数组的打印 


一 数组的定义

1 创建数组

T[] 数组名 = new T[N];  
T :表示数组中存放元素的类型
T[ ] :表示数组的类型
N :表示数组的长度

 代码示例:

int[] arr1 = new int[]{1, 2, 3}; // int[ ]为数组的类型 
int[] arr2 = {1, 2, 3}; 
int[] arr3 = new int[10]; // 创建一个可以容纳10个int类型元素的数组 

2 初始化数组 

数组的初始化主要分为动态初始化静态初始化

  • 动态初始化:在创建数组时,只定义数组中元素的个数,未给里面的元素进行赋值

例如:

int[] arr = new int[10];
  • 静态初始化:在创建数组时,不定义数据元素个数,而直接将数组里的数据内容进行赋值,编译器会自己判定数组有几个元素,后面的数据必须与前面定义的数据类型一致

例如:

int[] arr = new int[]{1,2,3};

注意:静态初始化可以简写,省去后面的new int[ ],代码示例如下:

//当前代码虽然省去了new arr[],但是编译器编译代码时还是会还原
int[]arr={0,1,2,3,4,5,6,7,8,9};

静态和动态初始化也可以分为两步,但分步的第二步中new int[ ] 不能省略,代码示例如下:

//动态初始化
int[]arr1;
arr1=new int[10];

//静态初始化
int[]arr2;
arr2=new int[]{1,2,3};
如果数组中存储元素类型为 基类 引用 类型,默认值为基类类型对应的默认值,比如:
类型默认值
byte0
short0
int0
long0
float0.0f
double0.0
char/u0000
booleanfalse
引用null

二 数组的使用 

1 数组的访问

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

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

注意:数组的下标是从0开始的,所以数组用下标访问最大限度是 数组长度-1.

一旦超过访问的最大限度,实行结果便会报异常,如下示例:

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

2 数组的遍历 

   "遍历" 是指将数组中的所有元素都访问一遍, 访问是指对数组中的元素进行某种操作 ,下面我们来进行数组的打印。

2.1 for 循环打印

public class Test{
    public static void main(String[] args) {
        int[] arr={1,2,3};
        for (int i=0;i<arr.length;i++){
            System.out.println(arr[i]+"");
        }
    }
}

注意:在数组中可以通过数组对象.length来获取数组的长度 

2.2 for-each 打印数组 

语法形式:

for(元素类型t 元素变量x:遍历对象obj){
    引用了x的java语句;
}

代码示例: 

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

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

三 数组是引用类型

3.1 JVM内存分布

我们要知道数组在内存里面的情况,就要了解Java内存分布情况,这里做必要的介绍。Java经过编译后产生的.class文件被加载到JVM虚拟机里面的本地方法栈里面运行。为了高效管理内存,JVM对内存进行了划分(JVM是一个软件,由C/C++编写的软件。这是因为系统之类的由C/C++代码编写比较高效)。

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

注意:在这里我们只简单关心堆和虚拟机栈这两块空间

3.2  区分基本类型与引用类型变量

public class Test{
    public static void func() {
        int a=8;  //基本数据类型
        int b=88; //基本数据类型
        int[] arr=new int[]{1,2,3}; //引用数据类型
    }
}
  • 基本数据类型,就是直接创建的变量,在变量空间里存放所赋的值。在此代码实例中a、b是基本数据类型, 其对应的栈帧空间里赋值为8和88;
  • 引用数据类型创建的变量,一般称为对象的引用,它在空间中存储的对象是所在空间的地址。在此代码实例中arr数组是引用类型,其内部保存的是数组在堆空间中的首地址 

下面来看一个代码,分析它的输出情况

 
public static void func(String[] args) {
    int[] arr1 = new int[3];
    arr1[0] = 10;
    arr1[1] = 20;
    arr1[2] = 30;
    
    int[] arr2 = new int[]{1,2,3,4,5};
    arr2[0] = 100;
    arr2[1] = 200; 
    
    arr1 = arr2; //此时arr1指向了arr2所指向的空间,两者指向同一个空间
    arr1[2] = 300;
    arr1[3] = 400; 
    arr2[4] = 500; //无论修改arr1或是arr2的值,都是修改同一个空间
    for (int i = 0; i < arr2.length; i++) {
        System.out.println(arr2[i]);
    }
}

 为了更好的方便大家理解,我们来画图分析:

3.3 认识null

null Java 中表示 " 空引用 " , 也就是一个不指向对象的引用。它表示一个无效的内存位置,所以不能对这个内存进行任何读写的操作,不然会报错 。
public class Test{
    public static void main(String[] args) {
        int[] arr=null;
        System.out.println(arr[0]);
    }
}

null 的作用类似于 C 语言中的 NULL ( 空指针 ), 都是表示一个无效的内存位置。 因此不能对这个内存进行任何读写操作。 一旦尝试读写 , 就会抛出 NullPointerException.

注意: Java 中并没有约定 null 0 号地址的内存有任何关联. 

四 实际应用数组

4.1 数组作为函数参数

数组array作为函数的参数,传递给print。

public class Test {
    public static void print(int[] array){
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i]+" ");
        }
    }
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6};
        print(array);
    }
}

4.2 修改数组内容 

1 直接传变量

public class Test {
    public static void func(int x){
        x = 10;
        System.out.println("x:"+x);
    }
    public static void main(String[] args) {
        int num = 0;
        func(num);
        System.out.println("num:"+num);
    }
}

运行结果:

在此代码中,num的值没有被修改为10,因为方法传参的时候传的是形参形参相当于是实参的一份临时拷贝,形参的修改不会影响到实参(相当于调用方法时创建的栈帧里有一个变量的值为0,然后被修改为10,方法调用结束,创建的栈帧销毁,并无影响

2 传的是数组 

import java.util.Arrays;
 
public class Test {
    public static void func(int[] array){
         array[0] = 10;
    }
    public static void main(String[] args) {
        int[] array = {1,2,3};
        func(array);
        System.out.println(Arrays.toString(array));
    }
}

运行结果:

3 传数组返回的也是数组 

import java.util.Arrays;
 
public class Test {
    public static int[] func(int[] array){
        array[0] = 10;
        array[2] = 30;
        return array;
    }
    public static void main(String[] args) {
        int[] array = {1,2,3};
        func(array);
        System.out.println(Arrays.toString(array));
    }
}

运行结果: 

五 数组方法的使用

 5.1 toString

toString方法的作用是将数组的数据变成字符串类型数据。

import java.util.Arrays;
 
public class Test {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5}; //定义一个数组
        String arrays = Arrays.toString(array); //用字符串类型接受方法的返回值
        System.out.println(arrays);
    }
}

运行结果:

  • 模拟实现toString
public class Test {
 
    public static String toString(int[] array){ //返回类型为字符串类型
        String array1 = "["; //定义一个字符串类型数据
        for (int i = 0; i < array.length; i++) {
            array1+=array[i];
            if(i!= array.length-1){
                array1+=",";
            }
        }
        array1+="]";
        return array1;
    }
 
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5}; //定义一个数组
        String arrays = toString(array); //用字符串类型接收方法的返回值
        System.out.println(arrays);
    }
}

运行结果:

5.2 copyOf

基本用法:

public static int[] copyOf(int [] original,int newLength)
//第一个参数original:要复制的数组
//第二个参数newLength:要返回的副本长度
import java.util.Arrays;
 
public class Test {
 
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        int[] newArray = new int[array.length]; //新数组
        newArray = Arrays.copyOf(array,array.length);
        System.out.println(Arrays.toString(newArray));
    }
}

运行结果:

  • 模拟实现copyOf
import java.util.Arrays;
 
public class Test {
 
    public static int[] copyOf(int[] array,int length){
       int[] newArray = new int[array.length];
        for (int i = 0; i < array.length; i++) { //循环赋值
            newArray[i] = array[i];
        }
        return newArray;
    }
 
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        int[] newArray = copyOf(array, array.length);
        newArray[2] = 30; //将拷贝好的数组的第3个元素赋值为30,观察该改变是否对原数组是否有影响
        System.out.println("array:"+Arrays.toString(array));
        System.out.println("newArray:"+Arrays.toString(newArray));
    }
}

运行结果:

六 查找数组中的元素 

6.1 顺序查找

public class Test {
 
    public static int find(int[] array,int k){
        for (int i = 0; i < array.length; i++) {
            if(k == array[i]){
                return i;//找到了就返回下标
            }
        }
        return -1;//找不到返回-1
    }
 
    public static void main(String[] args) {
        int[] array = {1,2,3,0,7,8,9,4,5,6};
        int ret = find(array,4);
        System.out.println(ret);
    }
}

运行结果: 

6.2 二分查找 binarySearch

注意:二分查找必须是有序数组。

import java.util.Arrays;
 
public class Test {
 
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6,7,8,9,10};
        int ret = Arrays.binarySearch(array,4);
        System.out.println(ret);
    }
}

运行结果:

  • 模拟实现 binarySearch

 基本用法:

public static int binarySearch(int[] a,int key)
//a:要搜索的数组
//key:要搜索的值
public class Test {
 
    public static int binarySearch(int[] array,int k){
        int left = 0;
        int right = array.length-1;
        while(left<=right){
            int mid = (left+right)/2;
            if(array[mid]>k){ //查找范围左移
                right = mid-1;
            }else if(array[mid]<k){ //查找范围右移
                left = mid+1;
            }else{
                return mid;
            }
        }
        return -1;
    }
 
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6,7,8,9,10};
        int ret = binarySearch(array,4);
        System.out.println(ret);
    }
}

运行结果:

 七 数组排序

 7.1 冒泡排序

 import java.util.Arrays;
 
public class Test {
 
    public static void bubbleSort(int[] array){
        for (int i = 0; i < array.length-1; i++) {
            boolean flag = true;
            for (int j = 0; j < array.length-1-i; j++) {
                if(array[j]>array[j+1]){
                    int tmp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = tmp;
                    flag = false;
                }
            }
            if(flag == true){//已经有序
                break;
            }
        }
    }
 
    public static void main(String[] args) {
        int[] array = {1,2,3,6,5,0,4,8,7,9};
        bubbleSort(array);
        System.out.println(Arrays.toString(array));
    }
}

运行结果:

7.2 sort 排序方法 

import java.util.Arrays;
 
public class Test {
    public static void main(String[] args) {
        int[] array = {1,2,3,6,5,0,4,8,7,9};
        Arrays.sort(array);
        System.out.println(Arrays.toString(array));
    }
}

运行结果:

八 数组逆置 

import java.util.Arrays;
 
public class Test {
 
    public static void reverse(int[] array){
        int head = 0;
        int tail = array.length-1;
        while(head<tail){
            int tmp = array[head];
            array[head] = array[tail];
            array[tail] = tmp;
            head++;//后移
            tail--;//前移
        }
    }
 
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6};
        reverse(array);
        System.out.println(Arrays.toString(array));
    }
}

运行结果:

九 二维数组的定义 

二维数组的三种定义方式:

public class Test {
    public static void main(String[] args) {
        int[][] array1 = {{1,2,3},{4,5,6}};
        int[][] array2 = new int[2][3];
        int[][] array3 = new int[][]{{1,2,3},{4,5,6}};
    }
}

十 二维数组的打印 

 注意:Arrays包里面的toString方法是将数组中的元素转换为字符串,用2个toString方法来打印二维数组时,第一个toString已经将数组转换为字符串,第二个toString是不能接收字符串的,所以不能用toString来打印二维数组,用deepToString来打印。

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

 运行结果:

 注意

  • 在Java中可以省略列不能省略行;
  • 在C语言中可以省略行不能省略列。

 以上就是今天要分享的全部内容啦,内容比较多,大家学完记得及时复习哈~那我们下期再见啦!

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

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

相关文章

线程相关知识点

一、线程 1.1 线程的概念 线程是轻量级的进程。 进程是分配资源的最小单位&#xff0c;线程是调度的最小单位。 线程不会单独分配内存空间&#xff0c;线程共用进程的资源。 线程之间通信比较方便&#xff0c;但是不安全。 多线程没有多进程安全。 多线程效率比较高。线程创建…

嵌入式学习-I/O-Day01

嵌入式学习-I/O-Day01 IO介绍 IO分类 文件IO 标准IO 标准IO的调用逻辑 标准IO缓存机制 标准IO的特点 * 流 定义 流的分类 流指针FILE * 缓存区的分类 * 全缓存—》基于文件 行缓存-》基于终端stdin/stdout 不缓存&#xff1a;stderr 标准IO的函数接口 ​​​​…

小白都来用这款AI绘画神器,IDEOGRAM2.0,轻松画出高质量图片

大家好&#xff01;我是宇航&#xff0c;一位喜欢AI绘画的10年技术专家&#xff0c;专注于输出AI绘画与视频内容 今天给大家介绍一款绝对的生图神器——Ideogram2.0! 不论你是AI小白&#xff0c;手残党还是资深玩家&#xff0c;无论你是做网页设计&#xff0c;电商&#xff0c…

React路由 基本使用 嵌套路由 动态路由 获取路由参数 异步路由 根据配置文件来生成路由

文章目录 React-router的三个版本react-router使用嵌套路由动态路由 获取路由参数Params参数Query参数Location信息 控制跳转地址异步路由根据配置文件生成路由 React-router的三个版本 React-router 服务端渲染使用React-router-dom 浏览器端渲染使用React-router-native Rea…

【STM32CubeMX开发】-2.2-TIM_输出一个PWM信号

目录 1 Tim定时器的时钟源 2 Tim定时器的配置 2.1 PWM配置 2.2 中断配置 3 生成代码 4 测试结果 结尾 1 Tim定时器的时钟源 TIM3的时钟来源自APB1 Timer clocks&#xff0c;时钟树上所有总线频率均设置为了STM32F0能达到的最高频率&#xff0c;此时APB1 Timer clocks …

【CTF Web】Pikachu ../../ Writeup(路径遍历)

目录遍历漏洞概述 在web功能设计中,很多时候我们会要将需要访问的文件定义成变量&#xff0c;从而让前端的功能便的更加灵活。 当用户发起一个前端的请求时&#xff0c;便会将请求的这个文件的值(比如文件名称)传递到后台&#xff0c;后台再执行其对应的文件。 在这个过程中&a…

Diffusion model原理:李宏毅篇(1)

本文是对李宏毅老师相关视频的记录。视频连接:Diffusion Model数学原理(一) 1. 基本概念 slide注释有一个加噪的扩散过程和一个去噪生成图像的过程VAE与Diffusion model有类似的地方。Diffusion model加噪的过程可以看成是VAE的encoder,去噪的过程看成是VAE的decoder2. DD…

【Linux】信号(初版)

信号概念 信号是进程之间发送异步信息的一种方式 在Linux命令行中&#xff0c;我们可以通过ctrl c来终止一个前台运行的进程&#xff0c;其实这就是一个发送信号的行为。我们按下ctrl c是在shell进程中&#xff0c;而被终止的进程&#xff0c;是在前台运行的另外一个进程。…

[2024领航杯] Pwn方向题解 babyheap

[2024领航杯] Pwn方向题解 babyheap 前言&#xff1a; 当然这个比赛我没有参加&#xff0c;是江苏省的一个比赛&#xff0c;附件是XiDP师傅在比赛结束之后发给我的&#xff0c;最近事情有点多&#xff0c;当时搁置了一天&#xff0c;昨天下午想起来这个事情&#xff0c;才开始…

C++容器适配器1-基本使用(stack、queue)

###适配器意思是可以将一种不能用于某种场景的东西经过特殊转换&#xff0c;包装成一个新东西&#xff0c;这个新定西可以用于这个场景&#xff0c;并且还具有之前旧东西的功能作用&#xff1b; stack、queue就是C里面的容器适配器&#xff0c;这两个适配器堆vector和list两个…

前端进阶之路:推荐几本不可错过的前端开发书籍

前端开发是一个不断更新换代的领域&#xff0c;作为一名前端工程师&#xff0c;持续学习和提升自己是至关重要的。阅读专业书籍是系统学习前端知识的一种有效方式。以下是一些前端开发者不可错过的书籍推荐&#xff0c;帮助你巩固基础&#xff0c;拓宽视野&#xff0c;成为更优…

【进阶OpenCV】 (13)--视频物体跟踪

文章目录 物体跟踪一、跟踪器二、代码实现1. 创建CSRT跟踪器实例2. 打开视频文件3. 主循环3.1 读取每一帧3.2 设置跟踪目标3.3 更新跟踪器&#xff0c;获取对象位置3.4 显示视频每一帧 4. 释放资源和关闭窗口5. 完整代码展示 总结 物体跟踪 本篇我们来介绍&#xff0c;如何对移…

Nvidia Jetson Orin平台部署CenterPoint模型

最近尝试将CenterPoint模型部署到Orin平台,网络上教程很多,也很杂乱,于是便整理一版自用。 主要根据NVIDIA Lidar AI Solution进行复现。并在此基础上进行补充 Orin平台: python:3.8 CUDA:11.4 torch:1.14.0 torchvision:0.15.1 TensorRT: 8.5.2.1 在Compile &&a…

第十九篇——复盘:数学给了我什么启示?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 数学带给这个世界什么&#xff1f;数学在我们的人生路上意味着什么&#…

Arthas 介绍,阿里开源线上JVM性能监控工具

1.官网 https://arthas.aliyun.com/ arthas (aliyun.com) Arthas 是一款由阿里巴巴开发并开源的 Java 应用诊断工具&#xff0c;主要用于帮助开发人员实时监控、诊断和调优 Java 应用程序。这款工具对于处理复杂的生产环境问题特别有效&#xff0c;尤其在定位那些难以复现的…

面网易后台开发居然遇到了一个困难难度算法题

在提供面经的同学中&#xff0c;竟然有同学在面试网易后台研发的时候遇到了一道困难难度的算法题。 一般来说&#xff0c;大多数面试的算法题都是以中等难度为主&#xff0c;遇到困难难度的算法题也许是公司现在不缺人、也许是在选拔人才、当然也很可能是面试官其实并不想要你…

基于LSTM-Transformer混合模型实现股票价格多变量时序预测(PyTorch版)

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

【WRF工具】服务器上安装convert_geotiff

【WRF工具】服务器上安装convert_geotiff convert_geotiff简介方法1&#xff1a;下载安装包后下载convert_geotiff依赖库安装库1&#xff1a;libtiff库2&#xff1a;sqlite库3&#xff1a;curl库4&#xff1a;projcmake更新&#xff08;可选&#xff09;库5&#xff1a;geotiff…

mysql--表的约束

目录 理解表的约束和操作 如何理解&#xff1f; 1、空属性null 2、默认值default 3、列描述comment 4、自动填充zorefill 5、主键primary key &#xff08;1&#xff09;创建表时指定可以 &#xff08;2&#xff09;创建表后指定key &#xff08;3&#xff09;删除主…

Cocos Creator导出obj文件用于后端寻路

Cocos Creator 3.8.0 用这个扩展插件 【杨宗宝】两年前写的网格工具&#xff0c;今天将它开源了。 - Creator 3.x - Cocos中文社区carlosyzy_extensions_mesh: Cocos Creator 3.x mesh插件&#xff0c;负责网格数据的导出。合并&#xff0c;拆封等一系列操作 (gitee.com) 下…