重学Java 7 数组Arr.1

news2025/2/24 20:06:26

我欲与君相知,长命无绝衰

                        ——24.1.16

一、数组的定义

1.概述:数组是一个容器,数组本身属于引用数据类型

2.作用:一次存储多个数据

3.特点:

        ①既可以存储基本类型的数据,也可以存储引用类型的数据

        ②定长(定义数组时的长度为多长,最多能存在多少个数据)

4.定义:

        ①动态初始化:在定义数组的时候,我们没有给具体的数据,只指定了长度

           数据类型[ ] 数组名 = new 数据类型[长度]

           数据类型 数组名[ ] = new 数据类型[长度]

                各部分解释:

                        等号左边的是数据类型,规定了数组中只能存储什么类型的数据

                        [ ]:代表的是数组,一个[ ]一维数组,两个[ ]代表二维数组

                        数组名:自己取的名字(小驼峰)

                        new:代表的是创建数组

                        等号右边的数据类型,要和等号左边的数据类型保持一致

                        [长度]:指定数组长度,规定了数组最多能存多少个数据

        ②静态初始化:在定义数组的时候,我们直接给出了数据

                数据类型[ ] 数组名 = new 数据类型[ ]{元素1,元素2,……} -> 不推荐使用

                数据类型 数组名[ ] = new 数据类型[ ]{元素1,元素2,……} -> 不推荐使用

        ③简化的静态初始化:

                数据类型[ ] 数组名 = {元素1,元素2,……} -> 推荐使用

5.动态初始化和静态初始化的区别:

        ①动态初始化:定义的时候只指定了长度,没有存具体的数据

                                 当只知道长度,但不知道具体数据时,可以使用动态初始化

        ②静态初始化:定义的时候就直接知道存什么数据

public static void main(String[] args) {
    //动态初始化
    int[] arr1 = new int[3];

    char[] arr2 = new char[5];

    String[] arr3 = new String[7];

    //静态初始化 -> 简化
    int[] arr4 = {1,1,4};
    //只属于初始化,没有定长

    String[] arr5 = {"lcl","一切都会好的","万事胜意"};
}

二、数组操作

1.获取数组的长度

1.格式:

        数组名.length

2.注意:

        length后不要带小括号,length不是数组中的方法,而是数组中的一个属性

    public static void main(String[] args) {
        String[] arr1 = {"迪迦奥特曼","猫和老鼠","花园宝宝","海绵宝宝","圣斗士星矢","百变小樱魔术卡","喜羊羊与灰太狼"};

        int len = arr1.length;

        System.out.println("len = " + len);
    }

2.索引

1.概述“元素在数组中存储的位置(编号,下标)

2.特点:

        ①索引唯一

        ②索引都是从0开始的,最大索引是数组长度 - 1

3.索引的作用:

        我们将来操作元素,必须通过索引来操作

        存数据,要指出索引

        取数据,要指定索引

        查数据,要指定索引

3.存储数据

1.格式:

        数组名[索引值] = 值 -> 将等号右边的数据放在数组索引的位置上

    public static void main(String[] args) {
        //定义一个数组
        int[] arr = new int[3];
        arr[0] = 100;
        arr[1] = 200;
        arr[2] = 300;

        String[] arr2 = new String[3];
        arr2[0] = "张三";
        arr2[1] = "李四";
        arr2[2] = "王五";
    }

案例1

    public static void main(String[] args) {
        //定义数组,长度为3
        int[] arr = new int[3];
        //创建Scanner对象
        Scanner sc = new Scanner(System.in);
        //键盘录入,将数据存储在数组中
//        arr[0] = sc.nextInt();
//        arr[1] = sc.nextInt();
//        arr[2] = sc.nextInt();
        for (int i = 0; i < arr.length; i++) {
            arr[i] = sc.nextInt();
        }
    }

案例2

    public static void main(String[] args) {
        //定义数组,长度为3
        int[] arr = new int[3];
        //创建Random对象
        Random rd = new Random();
        //将0~9之间随机一个整数,存储到数组中
//        arr[0] = rd.nextInt();
//        arr[1] = rd.nextInt();
//        arr[2] = rd.nextInt();
        for (int i = 0; i < arr.length; i++) {
            //random范围:左闭右开
            arr[i] = rd.nextInt(10);
        }
    }

4.获取数据

1.格式:

        数组名[索引值]

2.细节说明

        ①直接输出数组名,会输出数组在内存中的地址值

        ②地址值:数组在内存中的一个身份证号,唯一标识,我们可以通过这个唯一标识到内存中能找到这个数组,从而操作这个数组中的数据

        ③如果数组中没有存数据,那么直接获取也能获取出来一些数据(元素的默认值)

                整数:0       

                小数:0.0       

                字符:'\u0000' -> 对应的int值是0       

                布尔:false                      

                引用:null

    public static void main(String[] args) {
        int[] arr = new int[3];
        //直接输出数组名,会输出数组在内存中的地址值
        System.out.println(arr);
        //数组名[索引值],如果数组中没有存数据,那么直接获取也能获取出来一些数据(元素的默认值)
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }

5.遍历数组 

将数组中元素全部打印:

    public static void main(String[] args) {
        int[] arr = new int[3];
        //存数据
        arr[0] = 100;
        arr[1] = 200;
        arr[2] = 300;
        //输出数组arr地址
        System.out.println(arr);
        //输出数组元素
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        System.out.println();
        //创建字符串数组
        String[] arr1 = new String[3];
        //输出数组arr1地址
        System.out.println(arr1);
        //存数据
        arr1[0] = "张无忌";
        arr1[1] = "张三丰";
        arr1[2] = "张翠山";
        System.out.println(arr1[0]);
        System.out.println(arr1[1]);
        System.out.println(arr1[2]);
    }

此种方式当数组元素过多时,十分复杂 

1.遍历:将元素从数组中一个一个的获取出来(循环)

 //遍历,数组多长,就循环多少次
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }

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

三、操作数组时两个常见的问题

1.数组索引越界异常_ArrayIndexOutOfBoundsException

①原因:

        操作的索引超出了数组索引范围

    public static void main(String[] args) {
        int[] arr = new int[3];
        arr[0] = 100;
        arr[1] = 200;
        arr[2] = 300;
        arr[3] = 400;
    }

    public static void main(String[] args) {
        int[] arr = new int[3];
        arr[0] = 100;
        arr[1] = 200;
        arr[2] = 300;
        //arr[3] = 400;//超出了arr的索引范围
        for (int i = 0; i < 4; i++) {
            System.out.println(arr[i]);
        }
    }

2.空指针异常_NullPinterException

①原因:

        当一个对象为null时,在调用此对象中的其他成员

    public static void main(String[] args) {
        int[] arr = new int[3];
        System.out.println(arr.length);

        arr = null;
        System.out.println(arr.length);
    }

以上两个问题我们只需知道原因即可

四、数组练习

练习1

求出数组中的元素最大值(元素和元素之间作比较,每次都取较大值,比到最后,最大值就出来了)

步骤:

        ①定义一个max,接收两个元素比较之后的较大值

        ②遍历数组,将每一个元素获取出来进行比较

        ③判断,如果max小于遍历出来的元素,证明遍历出来的元素大,就将大的重新赋值给max

        ④直接输出max

    public static void main(String[] args) {
        int[] arr = {5,4,6,9,8,7,3,1,2,5};
        //①定义一个max,接收两个元素比较之后的较大值
        int max = arr[0];
        int i;
        //②遍历数组,将每一个元素获取出来进行比较
        for (i = 0; i < arr.length; i++) {
            //③判断,如果max小于遍历出来的元素,证明遍历出来的元素大,就将大的重新赋值给max
            if(arr[i]>max){
                max = arr[i];
            }
        }
        //④直接输出max
        System.out.println(max);
    }

练习2

随机产生10个[0,100]之间的整数,统计既是3又是5的倍数的个数

步骤:

        ①创建Random对象,用于生成随机数

        ②定义一个数组,长度为10

        ③定义一个遍历count,用于统计符合条件的数据个数

        ④遍历数组,判断元素是否符合指定的条件,如果符合,count++

        ⑤输出count

    public static void main(String[] args) {
         //①创建Random对象,用于生成随机数
        Random rd = new Random();
         //②定义一个数组,长度为10
        int arr[]=new int[10];
        //③定义一个遍历count,用于统计符合条件的数据个数
        int count = 0;
        //④遍历数组,判断元素是否符合指定的条件,如果符合,count++
        for (int i = 0; i < arr.length; i++) {
            arr[i]= rd.nextInt(101);
            if(arr[i]%3==0&&arr[i]%5==0){
                count++;
            }
        }
        //⑤输出count
        System.out.println("count = " + count);
    }

练习3

1.定义一个数组 int[ ] arr = {1,2,3,4}

2.遍历数组,输出元素按照[1,2,3,4]

    public static void main(String[] args) {
        int[] arr = {1,2,3,4};
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            if(i==arr.length-1){
                System.out.print(arr[i]);
            }else {
                System.out.print(arr[i] + ",");
            }
        }
        System.out.print("]");
    }

练习4

随机统计50个1~100之间的整数,统计偶数个数

步骤:

        ①创建Random对象

        ②定义长度为50的数组

        ③随机50个存储到数组中

        ④定义count,用于统计

        ⑤遍历数组,判断,如果是偶数,count++

        ⑥输出count

    public static void main(String[] args) {
        //①创建Random对象
        Random rd = new Random();
        //②定义长度为50的数组
        int arr[] = new int[50];
        //③定义count,用于统计
        int count =0;
        for (int i = 0; i < arr.length; i++) {
            //④随机50个存储到数组中
            arr[i] = rd.nextInt(100)+1;
            //⑤遍历数组,判断,如果是偶数,count++
            if(arr[i]%2==0){
                count++;
            }
        }
        //⑥输出count
        System.out.println("count = " + count);
    }

练习5

键盘录入一个整数,找出整数在数组中存储的索引位置

步骤:

        ①创建scanner对象

        ②定义数组,随便存几个数据

        ③定义一个变量,此变量用来表示数组中是否有要查找的数据

        ④遍历数组,在遍历的过程中判断是否和录入的数相等,如果相等,则输出索引

    public static void main(String[] args) {
        //①创建scanner对象
        Scanner sc = new Scanner(System.in);
        System.out.println("请您输入一个数");
        int num = sc.nextInt();
        //②定义数组,随便存几个数据
        int[] arr = {54,36,27,18,45,63,72,81,9};
        //③定义一个变量,此变量用来表示数组中是否有要查找的数据
        int flag = 0;
        //④遍历数组,在遍历的过程中判断是否和录入的数相等,如果相等,则输出索引
        for (int i = 0; i < arr.length; i++) {
            if(arr[i]==num){
                System.out.println(i);
                flag = 1;
                break;
            }
        }
        if(flag == 0){
            System.out.println("数组中没有这个值");
        }
    }

五、数组高级使用

练习1 数组复制

1.如果arr索引值在等号右边,证明是获取值,如果在等号左边,证明是存值

        arr[0] = 100;

2.arr1[i] = arr2[i] -> 先看等号右边的,相当于将arr2数组的索引上的数据,保存到arr1数组的0索引上

    public static void main(String[] args) {
        int[] arr1 = {1,2,3,4};
        int[] arr2 = new int[4];

        for (int i = 0; i < arr1.length; i++) {
            arr2[i] = arr1[i];
        }

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

练习2 数组扩容

数组扩容

        定义一个数组:int[] arr1 = {1,2,3,4,5},将数组由原来的长度扩容到10

    public static void main(String[] args) {
        int[] oldArr = {1,2,3,4,5};
        //创建新数组
        int[] newArr = new int[10];

        //将老数组中的元素赋值给新数组中
        for (int i = 0; i < oldArr.length; i++) {
            newArr[i] = oldArr[i];
        }
        //将新数组的地址值给老数组
        oldArr = newArr;
        System.out.println(oldArr.length);
        for (int i = 0; i < oldArr.length;i++) {
            System.out.print(oldArr[i]+" ");
        }
    }

 

练习3 数组合并 

数组合并

        int[] arr1 = {1,2,3}

        int[] arr2 = {4,5,6}

    public static void main(String[] args) {
        int[] arr1 = {1,2,3};
        int[] arr2 = {4,5,6};

        //创建新数组
        int[] arr3 = new int[arr1.length+ arr2.length];

        //先将arr1的元素放到arr3中
        for (int i = 0; i < arr1.length; i++) {
            arr3[i] = arr1[i];
        }

        //由于我们已经保存了arr1中的三个元素
        //所以我们保存arr2元素时,就不能从arr3的索引0开始了,不然从arr1中保存的元素会被arr2的元素覆盖
        //arr2的元素需要从arr3的索引3开始保存
        int j = 0;
        for (int i = arr1.length; i < arr3.length; i++) {
            arr3[i] = arr2[j];
            j++;
        }

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

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

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

相关文章

Redis 消息队列和发布订阅

文章目录 基本模式生产者消费者原理&模型redis实现java实现 发布者订阅者原理&模型redis实现java实现 stream模式原理&模型工作原理redis实现Java实现 选型外传 基本模式 采用redis 三种方案&#xff1a; ● 生产者消费者&#xff1a;一个消息只能有一个消费者 ●…

计算机毕业设计 基于SSM的历史/博物馆藏系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

一天吃透计算机网络面试八股文

目录&#xff1a; 网络分层结构三次握手两次握手可以吗&#xff1f;四次挥手第四次挥手为什么要等待2MSL&#xff1f;为什么是四次挥手&#xff1f;TCP有哪些特点&#xff1f;说说TCP报文首部有哪些字段&#xff0c;其作用又分别是什么&#xff1f;TCP和UDP的区别&#xff1f;…

DWM1000 MAC层

DWM1000 MAC层 MAC层 概述 MAC层&#xff0c;即媒体访问控制层&#xff0c;是数据通信协议栈中的一个重要部分&#xff0c;位于链路层的下半部分&#xff0c;紧邻物理层。在OSI模型中&#xff0c;它属于第二层&#xff0c;即数据链路层的一部分。MAC层的主要职责是控制如何在…

去中心化社交:Web3如何重新定义社交媒体

随着区块链技术的快速发展&#xff0c;Web3正在崭露头角&#xff0c;成为社交媒体领域的一股新潮流。去中心化社交的理念与技术创新正在重新定义用户的社交体验&#xff0c;颠覆传统社交媒体的中心化模式。本文将深入探讨Web3对社交媒体的影响&#xff0c;以及去中心化社交是如…

Ubuntu使用QtCreator + CMake 开发C/C++程序

平台 OS: Ubuntu 20.04 cmake: 3.16.3 IDE: Qt Creator 4.11.1 Based on Qt 5.14.1 (GCC 5.3.1 20160406 (Red Hat 5.3.1-6), 64 bit) Built on Feb 5 2020 12:48:30 From revision b2ddeacfb5 Copyright 2008-2019 The Qt Company Ltd. All rights reserved. The program …

DC电源模块在新能源领域的应用前景

BOSHIDA DC电源模块在新能源领域的应用前景 DC电源模块在新能源领域有着广阔的应用前景。随着可再生能源技术的发展和普及&#xff0c;如太阳能和风能等的应用逐渐增多&#xff0c;DC电源模块在这些领域的应用越来越重要。 首先&#xff0c;DC电源模块可以用于太阳能发电系统…

transfomer中正余弦位置编码的源码实现

简介 Transformer模型抛弃了RNN、CNN作为序列学习的基本模型。循环神经网络本身就是一种顺序结构&#xff0c;天生就包含了词在序列中的位置信息。当抛弃循环神经网络结构&#xff0c;完全采用Attention取而代之&#xff0c;这些词序信息就会丢失&#xff0c;模型就没有办法知…

子域名的介绍及收集

1、子域名作用编辑 收集子域名可以扩大测试范围&#xff0c;同一域名下的二级域名都属于目标范围。 2、 常用方式编辑 子域名中的常见资产类型一般包括办公系统&#xff0c;邮箱系统&#xff0c;论坛&#xff0c;商城&#xff0c;其他管理系统&#xff0c;网站管理后台也有可…

获得店铺的所有商品 API、店铺列表api

taobao.item_search_shop 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheStrin…

transfomer的位置编码

什么是位置编码 在transformer的encoder和decoder的输入层中&#xff0c;使用了Positional Encoding&#xff0c;使得最终的输入满足&#xff1a; input_embeddingpositional_encoding 这里&#xff0c;input_embedding的shape为[n,b,embed_dim],positional_encoding和input_…

推荐一个页面引导库 driver.js

页面引导功能是 web 开发中常见的一个功能。通过页面引导功能&#xff0c;你可以让用户第一时间熟悉你的页面功能。今天给大家推荐一个页面引导库 driver.js。 简介 driver.js 是一款用原生 js 实现的页面引导库&#xff0c;上手非常简单&#xff0c;体积在 gzip 压缩下仅仅 5…

《手把手教你》系列技巧篇(十)-java+ selenium自动化测试-元素定位大法之By class name(详细教程)

1.简介 按宏哥计划&#xff0c;本文继续介绍WebDriver关于元素定位大法&#xff0c;这篇介绍By ClassName。看到ID&#xff0c;NAME这些方法的讲解&#xff0c;小伙伴们和童鞋们应该知道&#xff0c;要做好Web自动化测试&#xff0c;最好是需要了解一些前端的基本知识。有了前端…

DDOS攻击,一篇文章给你讲清!

1、互联网安全现状 随着网络世界的高速发展&#xff0c;各行业数字化转型也在如火如荼的进行。但由于TCP/IP网络底层的安全性缺陷&#xff0c;钓鱼网站、木马程序、DDoS攻击等层出不穷的恶意攻击和高危漏洞正随时入侵企业的网络&#xff0c;如何保障网络安全成为网络建设中的刚…

如何实现扫码填报信息,并且可以做统计和导出excel

日常工作中经常遇到需要收集信息的情况&#xff0c;如果能实现扫一下二维码&#xff0c;就可以直接填写信息&#xff0c;不用登录&#xff0c;不用开账号&#xff0c;填写完直接可以生成excel&#xff0c;那就非常好了。 我试用了很多平台&#xff0c;有的收费的&#xff0c;也…

VL53L5CX距离传感器

I2C接口的飞行时间多区测距传感器 意法半导体VL53L5CX是一款先进的飞行时间 (ToF) 多区域测距传感器 VL53L5CX 采用意法半导体最新一代的直接 ToF 技术&#xff0c;无论目标颜色和反射率如何&#xff0c;都可以进行绝对距离测量。它提供高达 400 cm的精确测距&#xff0c;并且…

transbigdata笔记:栅格参数优化

在transbigdata中&#xff0c;栅格参数有如下几个 params(lonStart,latStart,deltaLon,deltaLat,theta) 如何选择合适的栅格参数是很重要的事情&#xff0c;这会对最终的分析结果产生很大的影响。 怎么选择参数&#xff0c;和数据以及分析的目的息息相关&#xff0c;transbi…

C语言爬虫程序编写的爬取APP通用模板

互联网的飞快发展&#xff0c;尤其是手机终端业务的发展&#xff0c;让越来越多的事情都能通过手机来完成&#xff0c;电脑大部分的功能也都能通过手机实现&#xff0c;今天我就用C语言写一个手机APP类爬虫教程&#xff0c;方便后期拓展APP爬虫业务。而且这个模板是通用的适合各…

【PyTorch】在PyTorch中使用线性层和交叉熵损失函数进行数据分类

在PyTorch中使用线性层和交叉熵损失函数进行数据分类 前言&#xff1a; 在机器学习的众多任务中&#xff0c;分类问题无疑是最基础也是最重要的一环。本文将介绍如何在PyTorch框架下&#xff0c;使用线性层和交叉熵损失函数来解决分类问题。我们将以简单的Iris数据集作为起点…

Matlab交互式的局部放大图

在数据可视化中&#xff0c;很多时候需要对某一区间的数据进行局部放大&#xff0c;以获得对比度更高的可视化效果。下面利用 MATLAB 语言实现一个交互式的局部放大图绘制。 源码自行下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1yItVSinh6vU4ImlbZW6Deg?pwd9d…