JavaSE——数组

news2025/1/12 21:55:25

这篇文章的面向读者为Java初级程序员,也就是刚刚接触到Java这门语言,里面描述的内容主要是数组相关的内容,讲解了最基础的一些数组扩容思路,数组赋值机制,什么是引用地址,什么是基础数据赋值。


Java该章节数组内容

  1. Java数组赋值机制

  2. Java数组拷贝

  3. Java数组反转
    3.1 头尾交换法
    3.2 逆序赋值法

  4. Java数组扩容

  5. Java数组缩减

  6. Java数组排序
    6.1 冒泡排序


Java数组赋值机制

基本数据类型赋值方式为 值拷贝/值传递 , 但是数组在默认情况下是引用传递,默认赋值是地址。
在这里插入图片描述

数组拷贝(内容复制)

package array;

import java.util.Arrays;

/**
 * 一维数组
 */
public class OneDimensionalArray {

    /**
     * 数组拷贝(非地址拷贝, 内容拷贝)
     */
    public static void arrayCopy() {

        int[] array1 = {1, 2, 3, 4, 5};

        // 一旦出现new,则说明开辟新空间,则修改array2的数据不会影响array1
        int[] array2 = new int[array1.length];

        for (int i = 0; i < array1.length; i++) {

            array2[i] = array1[i];

        }

        System.out.println(Arrays.toString(array2));

    }

    public static void main(String[] args) {

        arrayCopy();

    }


}

数组反转

头尾交换法

public static void arrayReverse() {

    int[] array = {11, 22, 33, 44, 55, 66, 77, 88, 99};

    // 这一步for循环是为了确定出遍历多少次,遍历的次数 = 数组的总数量 / 2 (交换次数)
    for (int i = 0; i < array.length / 2; i++) {

        // 首先存储倒数的array数据。 -i的用处是要向前遍历。 i是从前向后遍历。
        int temp = array[array.length - 1 - i];

        // 进行数据交换。先换后,然后换前。
        array[array.length - 1 - i] = array[i];

        array[i] = temp;

    }

    System.out.println(Arrays.toString(array));

}

public static void main(String[] args) {

    arrayReverse();

}

逆序赋值法

/**
 *  数组反转(逆序赋值法)
 */
public static void arrayReverse2() {

    int[] array = {11, 22, 33, 44, 55, 66, 77, 88, 99};

    // 定义一个新的数组,逆序遍历第一个数组,到第二个数组内
    int[] array2 = new int[array.length];

    // 创建两个变量,一个是i负责降序,一个是j负责升序,条件i遍历为0后结束。
    for (int i = array.length - 1, j = 0; i >= 0 ; i--, j++) {

        array2[j] = array[i];

    }
    
    // 此时array的地址指向array2 ,原先的地址没有了引用,则会被垃圾回收机制(GC)回收。    
    array = array2;

    System.out.println(Arrays.toString(array2));

}

public static void main(String[] args) {

    arrayReverse2();

}

数组扩容

 定义一个初始数组,长度为4。当不够使用后,每次扩容为原有长度的一半(150%),并且伴随用户输入来决定内容。
/**
 * 数组扩容
 */
public static void arrayDilatation() {

    // 定义一个初始数组,长度为4。当不够使用后,每次扩容为原有长度的一半(150%)
    int[] array = new int[4];

    // 定一个伪指针,用来记录当前索引位置。
    int temp = 0;

    while (true) {

        // 这个scanner用来判断用户是否继续输入
        Scanner str = new Scanner(System.in);

        System.out.print("请输入yes/y来表明您想要继续添加: ");

        String next = str.next();

        // 继续执行
        if ("yes".equals(next) || "y".equals(next)) {

            // 为了防止有出现输入字符串的情况,使用try catch包裹
            try {

                // 创建输入流
                Scanner scanner = new Scanner(System.in);

                System.out.print("当前数组内已有元素为: " + temp + " 个,当前被添加的元素下标为: " + temp + " ,请输入新的记录的数字: ");

                array[temp] = scanner.nextInt();

                System.out.println("当前数组内已有数据为: " + Arrays.toString(array));

                temp ++;

                // 说明数组此时已经容量到达满量, 进行数组的扩容,每次扩容为当前数组的一半
                if (temp == array.length) {

                    System.out.println("\n 数组内元素已满,进行自适应扩容,扩容数量为上次的150%, 具体数据如下。");
                    System.out.println("\t原有元素个数: " + temp + "\t扩容后元素个数: " + (array.length + array.length / 2) +
                            "\t  扩容数量为: " + (array.length / 2));
                    System.out.println("自适应扩容已完成。\n");

                    int[] dilatationArray = new int[array.length + array.length / 2];

                    // 进行数据拷贝 src:源数组 srcPos:复制的起始位置 dest:目标数组 destPos:目标数组开始存放的起始位置 length:需要复制的元素个数
                    System.arraycopy(array, 0, dilatationArray, 0, array.length);

                    // 让array指向新扩容后的数组。array原有的引用地址回收。
                    array = dilatationArray;

                }

            } catch (Exception e) {

                System.out.println("输入的方式或字符形式不对,需要输入数字等一些规则。\n");

            }

        } else {

            // 视为退出。退出前打印一下数组内元素
            System.out.println("退出成功,目前已有元素集为: " + Arrays.toString(array));

            break;

        }

    }
    
}

public static void main(String[] args) {

    arrayDilatation();

}

数组缩减

有一个数组{1, 2, 3, 4, 5},可以将该数组进行缩减,提示用户是否继续缩减,每次缩减最后的哪个元素,
当最后只剩下一个元素的时候,提示不能在缩减。结束程序。
/**
 * 数组缩减
 * 有一个数组{1, 2, 3, 4, 5},可以将该数组进行缩减,提示用户是否继续缩减,每次缩减最后的哪个元素,
 * 当最后只剩下一个元素的时候,提示不能在缩减。结束程序。
 */
public static void arrayReduce() {

    int[] array = {1, 2, 3, 4, 5};

    // 创建一个指针,保留最原始的数组长度
    int temp = array.length;

    // 哪怕是删到剩余一个,最多也就是遍历 temp - 1 次。
    for (int i = 0; i < temp - 1; i++) {

        Scanner next = new Scanner(System.in);
        System.out.print("是否进行元素删减(y/*): ");

        if ("y".equals(next.next())) {

            // 删减元素后的数量
            int[] newArray = new int[array.length - 1];

            // 进行元素拷贝。
            System.arraycopy(array, 0, newArray, 0, newArray.length);

            // 改变引用
            array = newArray;

            System.out.println("删除完成,当前数组内存在元素为: " + Arrays.toString(array));

        } else {

            System.out.println("手动结束方法,剩余元素为: " + Arrays.toString(array) + ", 退出方法。");

            return;

        }

    }

    // 跳出循环后结束方法即可。
    System.out.println("最少需要剩余一个元素, 目前达成条件,剩余元素为: " + Arrays.toString(array) + ", 退出方法。");

}

public static void main(String[] args) {

    arrayReduce();

}

数组排序

排序分为 内部排序 和 外部排序 。

  1. 内部排序,指的是将所有需要排序的数据统统加载到 内部存储器中 进行排序(内存排序),包括(交换式排序法,选择式排序法和插入式排序法)
  2. 外部排序,数据量过大,无法全部加载到内存当中。需要借助外部存储进行排序,包括(合并排序法和直接合并排序法)

冒泡排序

有一个无序排序的数组 24, 69, 80, 57, 13 使用冒泡排序将其变成一个从小到大的有序数列
总结冒泡排序特点: 
    1.我们一共有5个元素
    2.一共进行了 4轮排 可以看成是外层循环
    3.每1轮排序可以确定一个数的位置,比如第1轮排序确定最大数,第2轮排序,确定第2大的数位置,依次类推
    4.进行比较的时候,前面的数大于后面的数,就进行交换。
    5.每轮比较的次数都在减少。
/**
 * 冒泡排序
 */
public static void bubbleSort() {

    int[] array = {24, 69, 80, 57, 13};

    // 找一个存放数据的变量。
    int temp;

    for (int i = array.length - 1; i >= 0; i--) {

        for (int j = 0; j < array.length -1; j++) {

            if (array[j] > array[j + 1]) {

                temp = array[j];

                array[j] = array[j + 1];

                array[j + 1] = temp;

            }

        }

    }

    System.out.println(Arrays.toString(array));

}

public static void main(String[] args) {

    bubbleSort();

}

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

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

相关文章

JAVA入坑之线程

目录 一、&#xff1a;相关概念 1.1中央处理器(CPU&#xff0c;Central Processing Unit) 1.2程序、进程、线程 1.3线程与任务 二、线程的创建&#xff1a; 2.1继承Thread创建线程&#xff1a; 使用Thread子类创建线程的优缺点 2.2实现Runnable接口创建线程&#xff1a;…

【C++STL精讲】list的使用教程及其模拟实现

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f337;list是什么&#xff1f;&#x1f337;list如何使用&#xff1f;&#x1f337;list的模拟实现&#x1f33a;定义list类&#x1f33a;构造函数&#x1f33a;push_back&#x1f33a;pop_back &#x1f337;list迭…

利用STM32实现自平衡机器人功能与方法

将机器人整体开源&#xff0c;同时总结一下机器人搭建过程中遇到的坑和未来的改进方向。在分享的文件里包含了结构设计、程序控制、电路设计以及其他模块相关资料供大家参考。 第一&#xff1a;机器人原理分析 首先来看成品图&#xff1a; 如图所示&#xff0c;该机器人根据陀…

宝塔面板设置虚拟内存Swap降低的方法

宝塔面板可以通过设置Swap/虚拟内存的方式来降低内存使用率和负载&#xff0c;使用宝塔面板的Linux工具箱即可设置虚拟内存&#xff0c;新手站长来详细说下宝塔Linux面板设置Swap/虚拟内存的方法&#xff1a; 宝塔面板设置虚拟内存 设置虚拟内存是通过Linux工具箱&#xff0c…

4.0、Java继承与多态 - 抽象类与抽象方法

4.0、Java继承与多态 - 抽象类与抽象方法 先给大家举个例子 -> 创建一个父类 - 图形类&#xff1b;图形类中有一个计算面积的方法 calculateArea()&#xff1b; 创建三个子类 - 正方形、三角形、圆形 类&#xff1b; 由于我们图形类父类中未明确指明是什么图形&#xff0c…

内网域环境搭建学习

建立的关系就是这样&#xff0c;接下来就开始讲解遇到的困难 虚拟机中我们可以克隆来实现域的搭建 可能会出现这样的问题&#xff0c;原因是你的虚拟机没有关闭&#xff0c;所以才会导致这样的原因&#xff0c;解决方法 将虚拟机打开后&#xff0c;电源 -> 关闭客户机&…

MySQL学习笔记第二天

第03章 基本的SELECT语句 1.SQL概述 1.1 SQL背景知识 1946年&#xff0c;世界上第一台电脑诞生&#xff0c;如今&#xff0c;借由这台电脑发展起来的互联网已经自成江湖。在这几十年里&#xff0c;无数的技术、产业在这片江湖里沉浮&#xff0c;有的方兴未艾&#xff0c;有的…

reactxp搭建,start:windows运行不起来

1、官网 reactxp 2、VSCode和Visual Studio2019 安装VSCode Visual Studio 下载地址 先不用勾选工作负荷&#xff0c;直接安装 3、安装nvm 访问下载地址下载安装nvm&#xff1a; 百度云分享 官网直装链接 nvm的github发行界面下载nvm-setup.exe GitCode镜像下载nvm-setup…

ACL配置学习(附练习题)------ensp

从此文了解ACL配置&#xff0c;欢迎学习、指导。 目录 基本ACL配置举例 高级ACL配置举例 ACL配置练习题 定义 访问控制列表ACL&#xff08;Access Control List&#xff09;本质上是一种报文过滤器。 范围: OSI七层模型中的网络层、传输层的信息。 滤芯&#xff1a;五…

2023年4月实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先&#xff0c;来看下效果图 在线体验地址&#xff1a;https://geojson.hxkj.vip&#xff0c;并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

大型医院体检管理系统源码,PEIS体检系统源码 丰富的诊断模板,自动产生小结、综述和建议

PEIS体检管理系统源码 体检条码化管理&#xff0c;体检数据比对&#xff0c;丰富的诊断模板&#xff0c;自动产生小结、综述和建议。 文末获取联系 PEIS体检管理系统对医院体检中心进行系统化和规范化的管理&#xff0c;大大提高体检中心的综合管理水平、工作效率。系统从业务…

设计模式-结构型模式之享元模式

5. 享元模式 5.1. 模式动机 面向对象技术可以很好地解决一些灵活性或可扩展性问题&#xff0c;但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时&#xff0c;将导致运行代价过高&#xff0c;带来性能下降等问题。 享元模式正是为解决这一类问题而诞生的。享元模…

GoF代理模式

在java中代理模式的作用: 1.一个对象需要受到保护的时候&#xff0c;可以考虑使用代理对象取完成某个行为. 2.需要给某个对象的功能进行功能增强的时候&#xff0c;可以考虑找一个代理进行增强 3.A对象无法和B对象无法直接沟通&#xff0c;也可以使用代理模式解决 代理模式有三…

WPF mvvm框架Stylet使用教程-窗体交互用法

窗体操作 打开窗体 在stylet框架中&#xff0c;要打开一个窗口或者对话框&#xff0c;只需要直接使用窗口管理器 在要使用的ViewModel中注入IWindowManager&#xff0c;然后使用他的方法操作窗口。 ShowDialog(object viewModel)模态显示ShowWindow(object viewModel) 非模…

修改OPNET帮助文档的默认打开浏览器 给Edge浏览器配置IE Tab插件

我在使用 OPENT Modeler 软件时经常会用到帮助文档&#xff0c;但是其默认打开的是 IE 浏览器&#xff0c;想要其在 Edge 浏览器中打开&#xff0c;但是会出现网页无法打开的情况&#xff0c;这时需要给 Edge 浏览器安装一个 IE Tab 插件。 IE Tab 插件是专门针对浏览器而开发的…

vue3的介绍和两种创建方式(cli和vite)

目录 一、vue3的介绍 &#xff08;一&#xff09;vue3的简介 &#xff08;二&#xff09;vue3对比vue2带来的性能提升 二、vue3的两种创建方式 方式一&#xff1a;使用vue-cli创建&#xff08;推荐--全面&#xff09; 操作步骤 方式二&#xff1a;使用vite创建 操作步…

Spring是什么?关于Spring家族

初识Spring 什么是Spring&#xff1f; Spring是一个开源的Java企业级应用程序开发框架&#xff0c;由Rod Johnson于2003年创建&#xff0c;并在接下来的几年里得到了广泛的发展和应用。它提供了一系列面向对象的编程和配置模型&#xff0c;支持开发各种类型的应用程序&#x…

黑客网站攻击的主要手段

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 黑客与白帽子 有的童鞋觉得黑客和白帽子是同一回事儿&#xff0c;其实不然&#xff1b;而且&#xff0c;他们的工作方式与目标也有很大的差异。 黑客是指一群专门使用计算机…

9.2 变量的指针和指向变量的指针变量

9.2 变量的指针和指向变量的指针变量 一.指针变量的定义二.指针变量的引用三.整理至https://appd872nnyh9503.pc.xiaoe-tech.com/index的笔记 一.指针变量的定义 变量的指针 就是变量的地址。 我们可以定义一个指向 变量 的指针变量。 这种指针变量&#xff0c;我们在定义的时…

信创办公–基于WPS的EXCEL最佳实践系列 (筛选重要数据)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;筛选重要数据&#xff09; 目录 应用背景操作步骤1、筛选2、高级筛选 应用背景 在WPS里&#xff0c;筛选有两种&#xff0c;一种是筛选&#xff0c;另外一种则是高级筛选。 操作步骤 1、筛选 可以根据学号、准考证号、考…