Java后端
·04-26 19:33Day 4
✅ 今天做了:继续复习
1.数组赋值机制(基本数据类型vs引用数据类型)
举例:int a = 10;int b = a; VS int[] arr1 = {1, 2, 3};int[] arr2 = arr1;
基本数据类型:值传递,拷贝的是数值,两个变量相互独立,修改一个不影响另一个
引用数据类型(数组):引用传递,拷贝的是地址,两个变量指向同一个数组,修改一个影响另一个
————————————————————————————————————
2.数组进阶操作:拷贝、反转、扩容、排序、查找
①拷贝
数组拷贝的核心就是创建新数组,再拷贝原数组元素
方式:for循环拷贝、Arrays.copyOf( )、System.arraycopy( )、数组克隆(clone ( ))
注意:如果数组元素都是基本数据类型那么就是深拷贝,如果有引用数据,这些拷贝就只能获取到元素引用地址(浅拷贝)。
System.arraycopy是native方法(底层 C/C++ 实现),批量拷贝时效率最高;Arrays.copyOf`底层也是调用`System.arraycopy,只是封装后更易用。
**深拷贝与浅拷贝**
区别在于:深拷贝只获取被拷贝对象数值,额外创建内存空间储存,浅拷贝是获取引用地址,共享储存资源。
解决:重写对象的Object或者使用对象序列化
②反转(核心思路是首尾元素交换,循环到数组中间(避免重复交换))
1.利用索引int start = 0;和int end = 数组名.length-1
2.创建临时变量来交换变量值
3.如果是数组全部翻转,则需要写进while(start<end)循环,利用start++和end--来逐个反转
③扩容(原则上,数组一旦完成初始化,他的长度是固定不变的)
但是可以新建一个全新的数组重新初始化,过程:先扩大长度再把原数组的元素值全部复制,然后让原数组的变量名重新指向新的数组,之前内存中的旧数组因为没有了变量指向所以会被jvm垃圾回收。
④排序(无规律元素按规律排序)
冒泡排序:
核心思想:设置循环的次数限制条件
1.访问两个连续的元素,比较大小,依照大的在后原则交换元素值
2.假设一个数组长度为n第一次访问是0,1索引,第二次访问1,2……一直到第n-1次访问到n-2,n-1索引的元素,此时数组最大的元
素已经在最后一个位置
3.外层循环的次数限制实际为n长度的数组理论最高的遍历数组次数-因为每一次遍历都把当前数组的最大值放在最后一位
4.内层循环的次数限制实际为每轮遍历中可比较元素的位置限制,即已经排好序的最大元素位置不访问,这个比较次数应该是
逐轮减少的
Arrays排序:Arrays工具类的方法,这个方法更底层,效率更高
1.默认升序,Arrays.sort(arr1);
2.指定范围排序,Arrays.sort(arr2, 1, 4);// 范围是左闭右开,排序索引1、2、3的元素
3.字符串数组排序,按字典顺序排 String[] arr3 = {"banana", "apple", "orange"}; Arrays.sort(arr3);
⑤元素查找(算法内容再究)
查找方法大致有:线性、二分、跳跃、哈希查表(不同业务场景不同选择导致不同的查找效率)
————————————————————————————
3.二维数组
二维数组是数组的数组,本质是 “行 + 列” 的表格结构,支持规则 / 不规则(锯齿)数组;
声明和初始化:int[][] arr = new int[][]{{数组1},{数组2},{数组3}}
内存分配:变量名存储第一层数组的地址,第一层数组内部存储第二层数组的地址
经典案例:打印九九乘法表(二维数组版本)、找二维数组的最大值
📚 今日总结:数组赋值机制、数组进阶操作、二维数组
3
1
分享
操作
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
