【JAVA】数组的概念;数组的使用;引用;内存分区;数组练习题

🍉内容专栏:【JAVA从0到入门】

🍉本文脉络:数组的概念;数组的使用;引用;内存分区;数组练习题

🍉本文作者:Melon_西西

🍉发布时间 :2023.7.20

目录

1. 数组的基本概念

2数组的创建及初始化

2.1 数组的创建: T [ ] 数组名 = new T[N];

2.2 数组的初始化 : 动态初始化和静态初始化。

2.2.1. 动态初始化:在创建数组时,直接指定数组中元素的个数

2.2.2. 静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定

注意事项:

3. 数组的使用

3.1 数组中元素访问

3.2 遍历数组 

通过 数组对象.length 来获取数组的长度来遍历数组

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

4. 数组是引用类型

4.1内存用来存储对象,不同的内存放不同数据:

4.2初始JVM的内存分布

4.2基本类型变量与引用类型变量的区别

 5.数组练习

5.1.拷贝,打印数组

Arrays.copyOf()拷贝克隆

5.2.拷贝输出局部数组

copyOfRange(数组,从下标1开始,到下标3);[1,3),java一般左闭右开

5.3.拷贝

 System.arraycopy(array, 0, copy4,  0, array.length);

5.4.求数组中元素的平均值

avg(arr)

5.5.查找数组中指定元素(顺序查找)

5.6 数组二分查找:先排序数组,再二分查找

使array数组有序  Arrays.sort(array);

5.7 数组逆序


1. 数组的基本概念

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

1. 数组中存放的元素其类型相同

2. 数组的空间是连在一起的

3. 每个空间有自己的编号,其实位置的编号为0,即数组的下标。

2数组的创建及初始化

2.1 数组的创建: 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个字符串元素的数组

2.2 数组的初始化 : 动态初始化和静态初始化。

2.2.1. 动态初始化:在创建数组时,直接指定数组中元素的个数

int[] array = new int[10];

2.2.2. 静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定

 T [ ] 数组名称 = {data1, data2, data3, ..., datan};

in t[ ] 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", "!!!"};:

注意事项:

静态初始化没有指定数组的长度,编译器在编译时会根据 { }中元素个数来确定数组的长度。

静态初始化时, {}中数据类型必须与[]前数据类型一致。

静态初始化可以简写,省去后面的 new  T [ ]

静态和动态初始化也可以分为两步,但是省略格式不可以:

int[] array1;                        int[ ] array2;

array1 = new int[10];         array2 = new int[]{10, 20, 30}

如果没有对数组进行初始化,数组中元素有其默认值 如果数组中存储元素类型为基类类型。

默认值为基类类型对应的默认值,比如:

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

3. 数组的使用

3.1 数组中元素访问

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

数组是一段连续的内存空间,因此支持随机访问,即通过下标访问快速访问数组中任意位置的元素

下标从0开始,介于[0, N)之间不包含N,N为元素个数,不能越界,否则会报出下标越界异常。

3.2 遍历数组 

"遍历" 是指将数组中的所有元素都访问一遍, 访问是指对数组中的元素进行某种操作

通过 数组对象.length 来获取数组的长度来遍历数组

public class Text01 {
    public static void main(String[] args) {
        int[]array = new int[]{10, 20, 30, 40, 50};
        for(
                int i = 0; i < array.length; i++){
            System.out.println(array[i]);
        }
    }
}

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

    int[] array1 = {1, 2, 3};
        for (int x : array1) {
            System.out.println(x);
        }

4. 数组是引用类型

4.1内存用来存储对象,不同的内存放不同数据:

1.程序运行时代码需要加载到内存

2. 程序运行产生的中间数据要存放在内存

3. 程序中的常量也要保存

4. 有些数据可能需要长时间存储,而有些数据当方法运行结束后就要被销毁

4.2初始JVM的内存分布

     程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址

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

     本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局 部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的

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

     方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数 据. 方法编译出的的字节码就是保存在这个区域

4.2基本类型变量与引用类型变量的区别

基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;

而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。

局部变量是在方法内部的变量,引用变量看里面存储的是不是地址

引用不可以指向引用,只能指向另一个引用所指的对象

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

    public static void func1(int[] array) {
        array = new int[10];
    }

    public static void func2(int[] array) {//
        // array[0]=99;
        array = null;
    }
    public static void main2(String[] args) {
        int[] array1 = {1, 2, 3, 4};
        func1(array1);
        for (int i = 0; i < array1.length; i++) {
            System.out.print(array1[i] + " ");
        }
        System.out.println();
        int[] array2 = {1, 2, 3, 4};
        func2(array2);
        for (int i = 0; i < array2.length; i++) {
            System.out.print(array2[i] + " ");
        }
        System.out.println();
    }
}

 5.数组练习

5.1.拷贝,打印数组

Arrays.copyOf()拷贝克隆

    public static void main(String[] args) {
        //打印数组
        int [] array ={1,2,3,4,5,6};
        int[ ]copy = Arrays.copyOf(array,array.length);//鼠标放在copyOf点ctrl可以看详细
        System.out.println( Arrays.toString(copy));
    }

5.2.拷贝输出局部数组

copyOfRange(数组,从下标1开始,到下标3);[1,3),java一般左闭右开

    public static void main(String[] args) {
            int [] array ={1,2,3,4,5,6};
            int[] copy2=Arrays.copyOfRange(array,1,3);
            System.out.println(Arrays.toString(copy2))
            //输出[2, 3]
        int[] copy3=Arrays.copyOfRange(array,1,13);
        System.out.println(Arrays.toString(copy3));
        //输出[2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0]
    }

5.3.拷贝

 System.arraycopy(array, 0, copy4,  0, array.length);

       
    public static void main(String[] args) {
        int [] array ={1,2,3,4,5,6};
         // 拷贝
        int[] copy4 = new int[array.length];
        System.arraycopy(array, 0, copy4,  0, array.length);
        System.out.println(Arrays.toString(copy4));
        //[1, 2, 3, 4, 5, 6]
        //拷贝
        int[] copy5 = new int[array.length*2];
        System.arraycopy(array, 0, copy5,  0, array.length);
        System.out.println(Arrays.toString(copy5));
        //[1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0]
   }

5.4.求数组中元素的平均值

avg(arr)

    public static void main(String[] args) {
        //求数组中元素的平均值
        int[] arr = {1,2,3,4,5,6};
        System.out.println(avg(arr));
    }
    public static double avg(int[] arr) {
        int sum = 0;
        for (int x : arr) {
            sum += x;
        }
        //注意这里要强制转换
        return (double)sum / (double)arr.length;
    }

5.5.查找数组中指定元素(顺序查找)

    public static void main(String[] args) {
        int[] arr = {1,2,3,10,5,6};
        System.out.println(find(arr, 10));
    }
    public static int find(int[] arr, int data) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == data) {
                return i;
            }
        }
        return -1; // 表示没有找到
    }

5.6 数组二分查找:先排序数组,再二分查找

使array数组有序  Arrays.sort(array);

    public static void main(String[] args) {
        int[] array = {1,2,13,4,15};
        Arrays.sort(array);
        System.out.println(Arrays.toString(array));
        //输出[1, 2, 4, 13, 15]
    }

完整代码:

    public static void main(String[] args) {
        int[] array = {1, 2, 13, 4, 15, 12};
        Arrays.sort(array);
        System.out.println(Arrays.toString(array));
        //输出[1, 2, 4, 13, 15]
        System.out.println(binarySearch(array, 13));//输出4
    }

    public static int binarySearch(int[] arr, int toFind) {
        int left = 0;
        int right = arr.length - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (toFind < arr[mid]) {
// 去左侧区间找
                right = mid - 1;
            } else if (toFind > arr[mid]) {
// 去右侧区间找
                left = mid + 1;
            } else {
// 相等, 说明找到了
                return mid;
            }
        }
        // 循环结束, 说明没找到
        return -1;
    }

5.7 数组逆序

    public static void main(String[] args) {
            int[] arr = {1, 2, 3, 4};
            reverse(arr);
            System.out.println(Arrays.toString(arr));
            //输出[4, 3, 2, 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--;
            }
        }

5.8数组元素扩大两倍:两种方法


public class Text02 {
    //数组元素扩大两倍
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        System.out.println(Arrays.toString(array));
        //[1, 2, 3, 4, 5]
        transform(array);//它修改的是原数组的数据
        System.out. println(Arrays.toString(array)) ;
        //[2, 4, 6, 8, 10]
        int[] array1 = {1,2,3,4,5};
        System.out. println(Arrays.toString(array1)) ;
        //[1, 2, 3, 4, 5]
        int[] ret = transform2(array1);
        System.out.println(Arrays.toString(ret));
        //[2, 4, 6, 8, 10]
    }
    public static void transform(int[] array){
        for (int i = 0; i< array. length; i++) {
            array[i] = array[i]*2;
        }
    }
    public static int[] transform2(int[ ] array) {
        int[] ret = new int[array.length];
        for (int i = 0;i< array.length; i++){
            ret[i] = array[i]*2;
        }
        return ret;
    }
}

 


写在最后:

博主大一学识尚浅,内容仅供参考,欢迎大家在评论区交流分享。

目前从0开始学习JAVA,记录学习心得,期待认识志同道合的伙伴们,欢迎关注^_^

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python案例分析|使用Python图像处理库Pillow处理图像文件

本案例通过使用Python图像处理库Pillow&#xff0c;帮助大家进一步了解Python的基本概念&#xff1a;模块、对象、方法和函数的使用 使用Python语言解决实际问题时&#xff0c;往往需要使用由第三方开发的开源Python软件库。 本案例使用图像处理库Pillow中的模块、对象来处理…

JVM学习之内存与垃圾回收篇1

文章目录 1 JVM与Java体系结构1.0 Java发展重大事件1.1 虚拟机和Java虚拟机1.3 JVM整体结构1.4 Java代码执行流程1.5 JVM架构模型1.6 JVM的生命周期1.7 JVM发展历程 2 类加载子系统2.1 ClassLoader2.2 用户自定义类加载器2.2.1 为什么需要自定义类加载器2.2.2 自定义类加载器的…

kafka第三课-可视化工具、生产环境问题总结以及性能优化

一、可视化工具 https://pan.baidu.com/s/1qYifoa4 密码&#xff1a;el4o 下载解压之后&#xff0c;编辑该文件&#xff0c;修改zookeeper地址&#xff0c;也就是kafka注册的zookeeper的地址&#xff0c;如果是zookeeper集群&#xff0c;以逗号分开 vi conf/application.conf 启…

前端vue uni-app仿美团下拉框下拉筛选组件

在前端Web开发中&#xff0c;下拉筛选功能是一种非常常见的交互方式&#xff0c;它可以帮助用户快速选择所需的选项。本文将介绍如何利用Vue.js和uni-app框架来实现一个高效的下拉筛选功能。通过使用这两个强大的前端框架&#xff0c;我们可以轻松地创建具有响应式用户操作的下…

Spring Cloud+Uniapp+企业工程管理系统源码之提高工程项目管理软件的效率

高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中&#xff0c;管理不畅以及不良的项目执行&#xff0c;往往会导致项目延期、成本上升、回款拖后&#xff0c;最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统&#xff0c;确保…

车道线检测|利用边缘检测的原理对车道线图片进行识别

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 这两个都是博主在学习Linux操作系统过程中的记录&#xff0c;希望对大家的学习有帮助&#xff01; 操作系统Operating Syshttps://blog.csdn.net/yu_cblog/category_12165502.html?spm1001.2014.3001.5482Linux S…

Python应用实例(二)数据可视化(三)

数据可视化&#xff08;三&#xff09; 1.使用Plotly模拟掷骰子1.1 安装Plotly1.2 创建Die类1.3 掷骰子1.4 分析结果1.5 绘制直方图1.6 同时掷两个骰子1.7 同时掷两个面数不同的骰子 1.使用Plotly模拟掷骰子 本节将使用Python包Plotly来生成交互式图表。需要创建在浏览器中显示…

【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(7 月 17 日论文合集)

文章目录 一、检测相关(5篇)1.1 TALL: Thumbnail Layout for Deepfake Video Detection1.2 Cloud Detection in Multispectral Satellite Images Using Support Vector Machines With Quantum Kernels1.3 Multimodal Motion Conditioned Diffusion Model for Skeleton-based Vi…

LiveGBS流媒体平台GB/T28181功能-海康NVR摄像机自带物联网卡摄像头注册GB/T28181国标平台看不到设备的时候如何抓包及排查

海康大华宇视华为等硬件NVR摄像机注册到LiveGBS国标平台看不到设备的时候如何抓包及排查 1、设备注册后查看不到1.1、是否是自带物联网卡的摄像头1.2、关闭萤石云1.3、防火墙排查1.4、端口排查1.5、IP地址排查1.6、设备TCP/IP配置排查1.7、设备多网卡排查1.8、设备接入配置参数…

docker-compose自建RustDesk远程控制服务器

github&#xff1a; rustdesk/rustdesk-server: RustDesk Server Program (github.com) 一、创建 docker-compose.yml 文件&#xff0c;复制以下 docker-compose 配置文件内容到文件 version: 3networks:rustdesk-net:external: falseservices:hbbs:container_name: hbbspor…

卷积神经网络识别人脸项目—使用百度飞桨ai计算

卷积神经网络识别人脸项目的详细过程 整个项目需要的准备文件&#xff1a; 下载链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1WEndfi14EhVh-8Vvt62I_w 提取码&#xff1a;7777 链接&#xff1a;https://pan.baidu.com/s/10weqx3r_zbS5gNEq-xGrzg 提取码&#x…

【论文笔记】KDD2019 | KGAT: Knowledge Graph Attention Network for Recommendation

Abstract 为了更好的推荐&#xff0c;不仅要对user-item交互进行建模&#xff0c;还要将关系信息考虑进来 传统方法因子分解机将每个交互都当作一个独立的实例&#xff0c;但是忽略了item之间的关系&#xff08;eg&#xff1a;一部电影的导演也是另一部电影的演员&#xff09…

idea-实现热部署

idea-实现热部署 今天在进行idea 开发时突然发现热部署失败了&#xff0c;每次修改内容都要去restart server一次 这样比较麻烦&#xff0c;故而总结一下idea实现热部署的方法&#xff1a; 步骤一&#xff1a; 选择edit configuration 然后跳出server 的配置&#xff0c;方框…

第一性原理COHP计算在材料科学领域的应用

第一性原理COHP计算在材料科学领域的应用 第一性原理COHP计算是一种基于密度泛函理论&#xff08;DFT&#xff09;的计算方法&#xff0c;用于研究固体材料中的化学键和电子结构相互作用。通过COHP计算&#xff0c;我们可以获得许多有用的数据&#xff0c;并且这些数据在材料科…

NFS 存储(二十八)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 二、应用场景 三、安装 四、启动 五、目录结构 六、命令解析 七、配置 八、客户端访问 总结 前言 今天学习的是NFS 存储&#xff0c;主要是讲 nfs 的概述…

1.Lee Code HTML面试题

如何理解HTML语义化 HTML语义化是指在编写HTML代码时,使用合适的标签和元素来表达文档结构和含义,使得页面内容对搜索引擎和开发者更加友好,并增加代码的可读性。语义化的HTML使得网页在没有样式或样式加载失败时仍然能够保持良好的结构和意义。 问题 2

Kubernetes 使用 helm 部署 NFS Provisioner

文章目录 1. 介绍2. 预备条件3. 部署 nfs4. 部署 NFS subdir external provisioner4.1 集群配置 containerd 代理4.2 配置代理堡垒机通过 kubeconfig 部署 部署 MinIO添加仓库修改可配置项 访问nodepotingress 1. 介绍 NFS subdir external provisioner 使用现有且已配置的NFS…

高级ACL列表应用实验

实验拓扑图&#xff1a; 实验要求&#xff1a; PC1可以telnet R1&#xff0c;但不能ping R1&#xff1b;PC1可以ping R2但不能telnet R2&#xff1b;PC2和PC1相反 1、配置IP让整个网络互通 [PC1]ip route-static 0.0.0.0 0.0.0.0 192.168.1.254 [PC2]ip route-static 0.0.0.…

【VB6|第20期】遍历Excel单元格的四种方法

日期&#xff1a;2023年7月19日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

Linux系统编程(信号处理机制)

文章目录 前言一、中断&#xff0c;异常&#xff0c;信号的区别二、信号在Linux中的标识三、信号处理相关函数四、代码实验总结 前言 本篇文章我们来讲解信号的处理机制&#xff0c;信号处理在Linux操作系统中必不可少&#xff0c;这一点值得大家注意&#xff0c;信号又会与中…
最新文章