当前位置: 首页 > news >正文

JAVA第六学:数组的使用

1.数组的基本概念

1.1 定义

数组可以看成是相同类型元素的一个集合,在内存中是一段连续的空间

1.2 创建及初始化


1.3 数组的使用

1.3.1 随机访问

1.3.2 遍历数组(.length)

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

【for-each  写法会让x依次来取数组的每个元素    且 

2.数组是引用类型


2.1 初始JVM的内存分布

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

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

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

2.3 再谈引用变量

2.4 认识 null


3.数组的应用场景

3.1 保存数据

3.2 作为函数的参数

参数传基本数据类型:在方法中修改形参的值, 不影响实参的值。

参数传数组类型(引用数据类型)

发现在func方法内部修改数组的内容, 方法外部数组内容也发生改变; 因为数组是引用类型,按照引用类型来进行传递,是可以修改其中存放的内容的。

总结: 所谓的 "引用" 本质上只是存了一个地址;Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实只是将数组的地址传入到函数形参中;这样可以避免对整个数组的拷贝(数组可能比较长, 那么拷贝开销就会很大).

3.3 作为函数的返回值


4.数组练习

4.1 数组转字符串

使用这个方法后续打印数组就更方便一些;Java 中提供了 java.util.Arrays 包,其中包含了一些操作数组的常用方法。

模拟实现 toString

public class F_ShuZu_2025_7_30 {public static void main(String[] args) {int[] arr = {1,2,3,4};System.out.println(toString(arr));}public static String toString(int[] a){String result = "[";for(int i = 0; i < a.length;  i++){result += a[i];//保证最后一个数字后面没有逗号if(i < a.length-1){ result += ", "; }}result += "]";return result;}
}

4.2 数组拷贝

模拟实现 copyOf

public class F_ShuZu_2025_7_30 {public static void main(String[] args) {int[] arr1 = {1, 2, 3, 4, 5};int[] arr2 = copy(arr1,7);System.out.println(Arrays.toString(arr2));}public static int[] copy(int[] arr, int newLength){// 按照参数中指定的长度, 创建新的数组.int[] result = new int[newLength];int len = (newLength < arr.length ? newLength : arr.length);// 遍历原来的数组, 把每个元素都赋值过来.for(int i = 0; i < len; i++){ result[i] = arr[i]; }return result;}
}

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

模拟实现

public class F_ShuZu_2025_7_30 {public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5};System.out.println(find(arr,2));}//target-目标public static int find(int[] arr,int target){for(int i = 0; i < arr.length; i++){if(arr[i] == target){ return i; }}return -1;}}

4.5 查找数组中指定元素(二分查找)


public class F_ShuZu_2025_7_30 {public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5, 6, 7, 8};System.out.println(binarySearch(arr,6));}//binarySeaarch---二分查找    找到了返回对应下标 没有返回-1public static int binarySearch(int[] brr, int x){// 待查找区间最左侧元素与最右侧元素int left = 0;int right = brr.length - 1;// [left, right] 闭区间. 因此 left == right 的时候, 区间还是不空的, 仍然要继续找.while(left <= right){// 此处的 mid 就是中间位置元素的下标. 需要进行取整, 不能得到小数.int mid = (left + right) / 2;// 比较中间位置的元素, 是否和目标元素相同.  并且根据大小关系, 决定下一步查找的区间.// 左侧区间继续找  右侧区间找  找到了, 直接返回if(x < brr[mid]){ right = mid -1; }else if(x > brr[mid]){ left = mid + 1; }else{ return mid; }}// 元素不存在. 经过了上述循环的过程, 也没有找到匹配的元素.return -1;}}

可以看到, 针对一个长度为 10000 个元素的数组查找, 二分查找只需要循环 14 次就能完成查找. 随着数组元素个数 越多, 二分的优势就越大.

4.6 数组排序(冒泡排序)

public class F_ShuZu_2025_7_30 {public static void main(String[] args) {int[] brr = {7, 2, 9, 4, 0, 6, 3, 8};bubbleSort(brr);System.out.println(Arrays.toString(brr));}//bubbleSort--冒泡排序    升序排序public static void bubbleSort(int[] arr){for (int i = 0; i < arr.length - 1; i++) {// 进行每一趟具体的冒泡过程了. 总的比较次数, 需要注意好.// 在当前待比较区间的元素个数基础上, - 1 个.for (int j = 0; j < arr.length - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 交换两个元素int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}}}

4.7 数组逆序

public class F_ShuZu_2025_7_30 {public static void main(String[] args) {int[] brr = {1, 2, 3, 4, 5, 6, 7, 8};reverse(brr);System.out.println(Arrays.toString(brr));}public static void reverse(int[] arr) {int left = 0;int right = arr.length - 1;// 此处不需要写作 <= . 当 left == right 的时候, 就剩下一个元素了.// 一个元素不需要进行任何交换.while (left < right) {// 交换操作int tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;// 更新循环变量left++;right--;}}
}

5.二维数组

http://www.dtcms.com/a/318862.html

相关文章:

  • 【C++】哈希表原理与实现详解
  • 基于langchain的两个实际应用:[MCP多服务器聊天系统]和[解析PDF文档的RAG问答]
  • 智能制造的中枢神经工控机在自动化产线中的关键角色
  • 行业应用案例:MCP在不同垂直领域的落地实践
  • 二叉树算法之【中序遍历】
  • OpenAI重磅发布:GPT最新开源大模型gpt-oss系列全面解析
  • SpringBoot请求重定向目标地址不正确问题分析排查
  • 六类注定烂尾的甲方软件外包必看!这类甲方不要理-优雅草卓伊凡
  • 上门家教 app 用户端系统模块设计
  • 区块链简介
  • C++位图(Bitmap)与布隆过滤器(Bloom Filter)详解及海量数据处理应用
  • java excel转图片常用的几种方法
  • 分布式接口限流与防重复提交实现方案
  • 快速搭建vue3+flask实现一个异物检测项目
  • RP2040下的I2S Slave Out,PIO状态机(四)
  • MT信号四通道相关性预测的Informer模型优化研究
  • 此芯p1开发板使用OpenHarmony时llama.cpp不同优化速度对比(GPU vs CPU)
  • 掌握工程化固件烧录,开启你的技术进阶之路-FPGA ISE(xilinx)
  • 微软推出“愤怒计划“:利用AI工具实现恶意软件自主分类
  • Daemon Tools for Mac —— 专业虚拟光驱与磁盘映像工具
  • 手机控制断路器:智能家居安全用电的新篇章
  • Casrel关系抽取
  • 如何快速开发符合Matter标准的智能家居设备?
  • 在 openEuler 24.03 (LTS) 上安装 FFmpeg 的完整指南
  • 接入小甲鱼数字人API教程【详解】
  • 物联网架构全解析:华为“1+2+1”与格行随身WiFi,技术如何定义未来生活?
  • 优选算法 力扣 LCR 179. 查找总价格为目标值的两个商品 双指针降低时间复杂度 C++题解 每日一题
  • 界面组件DevExpress WPF中文教程:网格视图数据布局 - 紧凑模式
  • 代企业开发钉钉数据对接
  • hadoop HDFS 重置详细步骤