尚硅谷Java第 4、5 章IDEA,数组

第 4 章:IDEA的使用

第 5 章:数组

5.1 数组的概述

数组(Array):就可以理解为多个数据的组合。

程序中的容器:数组、集合框架(List、Set、Map)。

数组中的概念:

  • 数组名

  • 下标(或索引)

  • 元素

  • 数组的长度

数组存储的数据的特点:

  • 依次紧密排列的、有序的、可以重复的。

  • 数组的其它特点:

    • 一旦初始化,其长度就是确定的、不可更改的。

    • 数组的下标是从0开始的

5.2 一维数组

5.2.1 数组的声明和初始化

代码示例:

 int[] arr1 = new int[10];String[] arr2 = new String[]{"Tom","Jerry"};

5.2.2 数组的使用

  • 调用数组的指定元素:使用角标、索引、index。

  • index 从 0 开始。

  • 数组的属性:length,表示数组的长度。

  • 数组的遍历。

  • 数组元素的默认初始化值。

5.2.3 一维数组内存分析

  • 虚拟机栈:main() 作为一个栈帧,压入栈空间中。在 main() 栈帧中,存储着 arr 变量。arr 记录着数组实体的首地址值。

  • 堆:数组实体存储在堆空间中。

  • Java 虚拟机的内存划分:

5.3 二维数组

二维数组本质上是元素类型是一维数组的一维数组。

5.4 数组的常用算法

  • 数值型数组的特征值的计算:最大值、最小值、总和、平均值等。

  • 数组元素的赋值。

  • 数组的复制、赋值。

  • 数组的反转。

  • 数组的扩容、缩容。

  • 数组的查找:

    • 线性查找。

    • 二分法查找(前提:数组有序)。

  • 数组的排序:

    • 冒泡排序(最简单)。

    • 快速排序(最常用)。

5.5 Arrays 工具类的使用

  • java.util.Arrays 类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法。

  • toString() 、 sort()、 binarySearch()。

5.6 数组中的常见异常

  • 下标越界异常:ArrayIndexOutOfBoundsException

  • 空指针异常:NullPointerException

5.7、企业真题

  1. 数组有没有 length()这个方法? String 有没有 length()这个方法? 答: 数组没有 length(),有 length 属性。 String 有 length()。

  2. 有数组 int[] arr,用 Java 代码将数组元素顺序颠倒? 答: 可以使用两个指针,一个指向数组的第一个元素,另一个指向数组的最后一个元素,交换它们的值,然后继续向中间靠拢,直到两个指针相遇。

     public static void reverseArray(int[] arr){int left = 0;int right = arr.length - 1;​while (left < right){int temp = arr[left];​arr[left] = arr[right];arr[right] = temp;left++;right--;}}​public static void main(String[] args){int[] arr = {1, 2, 3, 4, 5};    // 定义一个数组​System.out.println("原数组:" + Arrays.toString(arr));    // 输出原数组reverseArray(arr);    // 调用方法将数组元素顺序颠倒System.out.println("颠倒后的数组:" + Arrays.toString(arr));    // 输出颠倒后的数组}

    运行该主函数,输出结果如下:

     原数组:[1, 2, 3, 4, 5]颠倒后的数组:[5, 4, 3, 2, 1]
  3. 为什么数组要从 0 开始编号,而不是 1? 答: 数组的索引,表示了数组元素距离首地址的偏离量。因为第 1 个元素的地址与首地址相同,所以偏移量就是 0,所以数组要从 0 开始。

  4. 数组有什么排序的方式,手写一下? 答: 常见的数组排序方式有冒泡排序、选择排序、插入排序、快速排序、归并排序等。

    冒泡排序: 冒泡排序的思路是从第一个元素开始,依次比较相邻的两个元素,如果前一个元素比后一个元素大,则交换它们的位置。这样一轮下来,最大的元素就会被移动到最后一个位置。然后再从第一个元素开始,继续进行比较和交换,直到所有元素都被排序。

     public class BubbleSort{public static void main(String[] args){int[] arr = {3, 9, 1, 8, 2, 5, 7};​bubbleSort(arr);​for(int i = 0; i < arr.length; i++){System.out.print(arr[i] + " ");}}​public static void bubbleSort(int[] arr){int n = arr.length;​for(int i = 0; i < n - 1; i++){for(int j = 0; j < n - i - 1; j++){if(arr[j] > arr[j + 1]){int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}}

    冒泡排序的时间复杂度为 O(n^2),空间复杂度为 O(1)。

    快速排序: 快速排序的思路是选取一个基准元素,将数组分为左右两部分,左半部分的元素均小于等于基准元素,右半部分的元素均大于等于基准元素。然后对左右两部分分别进行快速排序,直到整个数组有序。在上面的代码中,partition 方法用于实现分区,将数组分为左右两部分。quickSort 方法用于实现快速排序,递归调用自身对左右两部分进行排序。

     public class QuickSort{public static void main(String[] args){int[] arr = {5, 2, 9, 3, 7, 6, 1, 8, 4};​quickSort(arr, 0, arr.length - 1);​for (int i : arr){System.out.print(i + " ");}}​public static void quickSort(int[] arr, int left, int right){if (left < right){int pivot = partition(arr, left, right);​quickSort(arr, left, pivot - 1);quickSort(arr, pivot + 1, right);}}​public static int partition(int[] arr, int left, int right){int pivot = arr[left];​while (left < right){while (left < right && arr[right] >= pivot){right--;}​arr[left] = arr[right];​while (left < right && arr[left] <= pivot){left++;}​arr[right] = arr[left];}​arr[left] = pivot;​return left;}}

    快速排序的时间复杂度为 O(nlogn),空间复杂度为 O(logn)。

  5. 二分算法实现数组的查找? 答: 二分查找思路: ① 首先确定要查找的数组的范围,即左右边界; ② 计算中间位置,即中间索引值; ③ 判断中间值是否等于要查找的值,如果是,则返回中间索引值; ④ 如果中间值大于要查找的值,则在左半部分继续查找,即将右边界设为中间索引值减一; ⑤ 如果中间值小于要查找的值,则在右半部分继续查找,即将左边界设为中间索引值加一; ⑥ 重复 ②-⑤ 步骤,直到找到要查找的值或左右边界重合,此时返回-1 表示未找到。

     public class BinarySearch{public static int binarySearch(int[] arr, int key){int low = 0;int high = arr.length - 1;​while (low <= high){int mid = (low + high) / 2;​if (key < arr[mid]){high = mid - 1;}else if (key > arr[mid]){low = mid + 1;}else{return mid;}}​return -1;}​public static void main(String[] args){int[] arr = {1, 3, 5, 7, 9};int key = 3;int index = binarySearch(arr, key);​if (index == -1){System.out.println("找不到指定的元素");}else{System.out.println("指定元素的索引为:" + index);}}}

    复杂度分析: 时间复杂度为 O(log n),因为每次查找都将查找范围缩小一半,最坏情况下需要查找 log n 次,其中 n 为数组长度。 空间复杂度为 O(1),因为只需要常数个额外变量存储查找范围的左右边界和中间索引值。

  6. 怎么求数组的最大子序列和? 答: 以下是一个使用 Java 实现的求解最大子序列和的示例代码:

    这个算法的思路是使用动态规划的思想。

    我们从左到右遍历整个数组,使用两个变量 maxSum 和 currentSum 来记录最大子序列和和当前子序列和。

    对于当前遍历到的元素 nums[i],我们可以有两种选择: 将 nums[i] 加入当前子序列中,即 currentSum = currentSum + nums[i]; 以 nums[i] 作为新的起点开始一个新的子序列,即 currentSum = nums[i]。

    我们需要比较这两种选择哪个更优,即选择 currentSum + nums[i] 或选择 nums[i] 中的较大值作为当前子序列的和 currentSum。同时,我们需要比较当前子序列的和 currentSum 和最大子序列和 maxSum 哪个更大,即选择 Math.max(maxSum, currentSum)作为新的最大子序列和 maxSum。

    最后,遍历完成后 maxSum 就是最大子序列和。

     public class MaxSubArraySum{public static int maxSubArraySum(int[] nums){int maxSum = nums[0];int currentSum = nums[0];​for (int i = 1; i < nums.length; i++){currentSum = Math.max(currentSum + nums[i], nums[i]);maxSum = Math.max(maxSum, currentSum);}​return maxSum;}​public static void main(String[] args){int[] nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};int maxSum = maxSubArraySum(nums);​System.out.println("最大子序列和为:" + maxSum);}}

    输出:

     最大子序列和为:6

    解释:最大子序列为[4, -1, 2, 1],和为 6。

  7. Arrays 类的排序方法是什么?如何实现排序的? 答: Arrays 类提供了多种排序方法,包括: ① sort(Object[] a):对数组 a 进行升序排序,元素类型必须实现 Comparable 接口。 ② sort(Object[] a, Comparator c):对数组 a 进行排序,使用自定义的 Comparator 比较器进行比较。 ③ parallelSort(Object[] a):对数组 a 进行并行排序,效率更高。

    排序的实现原理主要是基于快速排序和归并排序,具体实现方式根据元素类型和排序方法不同而不同。

    在 sort(Object[] a) 方法中,对于实现了 Comparable 接口的元素类型,通过 compareTo() 方法进行比较,并且使用快速排序实现;对于未实现 Comparable 接口的元素类型,则会抛出 ClassCastException 异常。

    在 sort(Object[] a, Comparator c) 方法中,通过传入自定义的 Comparator 比较器进行比较,也使用快速排序实现。 在 parallelSort(Object[] a) 方法中,使用 Fork/Join 框架实现并行排序,将数组拆分成多个小数组进行排序,最后再合并起来。

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

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

相关文章

SQL注入基本原理靶场实现

↵ 一、前言 SQL注入漏洞(SQL injection)是WEB层面高危的漏洞之一&#xff0c;也是常见的攻击方式。 二、本质 1、什么是SQL注入 SQL 注入是一种利用应用程序对用户输入数据过滤不严格&#xff0c;将恶意 SQL 代码插入到正常 SQL 语句中&#xff0c;从而操控数据库查询逻辑的…

图像预处理(OpenCV)

1 图像翻转(图像镜像旋转) 在OpenCV中&#xff0c;图片的镜像旋转是以图像的中心为原点进行镜像翻转的。 cv2.flip(img,flipcode) 参数 img: 要翻转的图像 flipcode: 指定翻转类型的标志 flipcode0: 垂直翻转&#xff0c;图片像素点沿x轴翻转 flipcode>0: 水平翻转&…

PCDN收益高低的关键因素

PCDN&#xff08;P2P内容分发网络&#xff09;收益好的三个主要关键因素是&#xff1a;硬件配置与性能、网络环境与质量、业务调度与策略。 1. 硬件配置与性能 设备稳定性与兼容性 PCDN节点需长时间稳定运行&#xff0c;硬件性能直接影响收益。例如&#xff0c;使用高性能CPU、…

『生成内容溯源系统』详解

生成内容溯源系统详解 1. 定义与核心目标 生成内容溯源系统&#xff08;Generative Content Provenance System&#xff09;是指能够追踪AI生成内容的来源、生成过程、版权归属及修改历史的技术体系。其核心目标是&#xff1a; 验证真实性&#xff1a;证明内容由特定AI模型生…

conda如何安装和运行jupyter

在Conda环境中安装和运行Jupyter Notebook是一项常见且实用的任务&#xff0c;特别是在数据科学和机器学习项目中。以下是使用Conda安装和运行Jupyter Notebook的步骤&#xff1a; 安装Jupyter Notebook 首先&#xff0c;确保你的Conda是最新的。打开终端或Anaconda Prompt&a…

QML之Flickable(滚动区域)

Flickable 是 QML 中用于创建可滚动区域的基础组件&#xff0c;它比 ScrollView 提供更底层的控制&#xff0c;适合需要自定义滚动行为的场景。 基本用法 qml import QtQuick 2.15Flickable {width: 200height: 200contentWidth: 400 // 内容总宽度contentHeight: 800 // 内…

【NumPy科学计算引擎:从基础操作到高性能实践】

目录 前言&#xff1a;技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析关键技术模块说明技术选型对比 二、实战演示环境配置核心代码实现运行结果验证 三、性能对比测试方法论量化数据对比结果分析 四、最佳实践推荐方案 ✅常见错误 ❌调试技巧 五、应用…

PandaGPT实战(1): 环境配置及效果演示

文章目录 1. 环境安装2. 数据准备2.1 模型权重获取2.2 训练数据准备3. 效果演示3.1 训练3.2 部署效果PandaGPT是首个无需显式监督即能跨六种模态执行指令微调任务的基础模型。它展现出多样化的多模态能力,包括复杂理解/推理、基于知识的描述以及多轮对话交互。 作为通用型指令…

spring security oauth2.0 使用GitHub

在 Spring Security 中集成 GitHub 的 OAuth 2.0 登录&#xff0c;可以实现用户通过 GitHub 账号快速认证。以下是完整的分步实现指南和代码示例&#xff1a; 一、前置准备 1. 在 GitHub 注册 OAuth 应用 访问 GitHub Settings → Developer settings → OAuth Apps点击 New …

QT聊天项目DAY01

1.新建初始项目 2.修改UI格式 运行效果 3.创建登录界面 设计登录界面UI 设计布局 调整布局间距 往水平布局中拖入标签和文本输入框 更换控件名称并固定高度 添加窗口部件 往现有的资源文件中导入图片 添加水平布局 4.设置登陆界面为主窗口的核心组件 #pragma once#include &l…

检测到目标URL存在http host头攻击漏洞

漏洞描述 修复措施 方法一&#xff1a; nginx 的 default_server 指令可以定义默认的 server 去处理一些没有匹配到 server_name 的请求&#xff0c;如果没有显式定义&#xff0c;则会选取第一个定义的 server 作为 default_server。 server { …

小甲鱼第004讲:变量和字符串(下)| 课后测试题及答案

问答题: 0. 请问下面代码有没有毛病&#xff0c;为什么? 请问下面代码为什么会出错&#xff0c;应该如何解决&#xff1f; 答:这是由于在字符串中&#xff0c;反斜杠()会与其随后的字符共同构成转义字符。 为了避免这种不测情况的发生&#xff0c;我们可以在字符串的引号前面…

Hyprnote开源程序是一款记录和转录您会议的 AI 记事本。 本地优先且可扩展 。

一、软件介绍 文末提供源码下载学习 Hyprnote开源程序是一款记录和转录您会议的 AI 记事本。 从您的原始会议记录中生成强大的摘要&#xff0c;本地优先且可扩展 。使用开源模型 &#xff08;Whisper & Llama&#xff09; 离线工作&#xff0c;高度可扩展 &#xff0c;由插…

FreeRTOS使任务处于阻塞态的API

在FreeRTOS中&#xff0c;任务进入阻塞状态通常是因为等待某个事件或资源。以下是常用的使任务进入阻塞态的API及其分类&#xff1a; 1. 任务延时 vTaskDelay(pdMS_TO_TICKS(ms)) 将任务阻塞固定时间&#xff08;相对延时&#xff0c;从调用时开始计算&#xff09;。 示例&…

各种“排序”的方法

文章目录 插入排序1. 直接插入排序(O(n^2))举例1&#xff1a;举例2&#xff1a;直插排序的"代码"直插排序的“时间复杂度” 2. 希尔排序(O(n^1.3))方法一方法二(时间复杂度更优) 选择排序堆排序直接选择排序 我们学过冒泡排序&#xff0c;堆排序等等。&#xff08;回…

【Linux网络与网络编程】08.传输层协议 UDP

传输层协议负责将数据从发送端传输到接收端。 一、再谈端口号 端口号标识了一个主机上进行通信的不同的应用程序。在 TCP/IP 协议中&#xff0c;用 "源IP"&#xff0c;"源端口号"&#xff0c;"目的 IP"&#xff0c;"目的端口号"&…

python求π近似值

【问题描述】用公式π/4≈1-1/31/5-1/7..1/(2*N-1).求圆周率PI的近似值。 从键盘输入一个整数N值&#xff0c;利用上述公式计算出π的近似值&#xff0c;然后输出π值&#xff0c;保留小数后8位。 【样例输入】1000 【样例输出】3.14059265 def countpi(N):p0040nowid0for i i…

第十六届蓝桥杯省赛JavaB组题解

A 逃离高塔 第一道填空题很简单&#xff0c;根据题意跑一边循环即可&#xff0c;一共是202个符合条件的数 public static void main(String[] args) {Scanner scanner new Scanner(System.in);int ans0;for(long i0;i<2025;i){if((i*i*i)%103)ans;}System.out.println(ans)…

汽车车窗升降系统全生命周期耐久性验证方案研究

随着汽车行业的快速发展&#xff0c;消费者对于汽车品质和安全性的要求日益提高。汽车车窗升降系统作为汽车电子系统中的重要组成部分&#xff0c;其可靠性和耐久性直接影响到用户的使用体验和行车安全。车窗升降系统在日常使用中频繁操作&#xff0c;承受着各种复杂的工况&…

嵌入式Linux——8 串口

目录 1.终端&#xff08;tty&#xff09; /dev/tty*&#xff1a;物理/虚拟终端 /dev/pts/*&#xff1a;伪终端 /dev/tty&#xff1a;当前进程的控制终端 /dev/tty0&#xff1a;当前活动的虚拟控制台 2.行规程模式&#xff08;line discipline&#xff09; 比较行规程和原…