原来你是这样的JAVA[04]-数组Arrays
一、打印数组
Arrays类提供了打印数组元素的方法,Arrays.toString()和Arrays.deepToString()。
//打印数组
System.out.println(Arrays.toString(arr));//输出 [1, 3, 5, 7, 9]
//打印多维数组
int[][] arrM={{1,2,3},{11,12,13},{21,22,23}};
System.out.println(Arrays.deepToString(arrM));//[[1, 2, 3], [11, 12, 13], [21, 22, 23]]
Arrays.toString()源码实现:
public static String toString(int[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(a[i]);
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
二、数组拷贝Arrays.copyOf
想拷贝数组元素到另外一个数组,需要使用Arrays.OfcopyOf(int[] original, int newLength) 方法,该方法第二个参数newLength表示新数组的长度。
- 如果newLength小于原始数组长度,则只拷贝前面的元素;
- 如果newLength大于原始数组长度,则多出来的长度会自动填充默认值。
int[] arr={1,3,5,7,9};
//拷贝数组元素
int[] arr2=Arrays.copyOf(arr,arr.length);
System.out.println(Arrays.toString(arr2));//输出 [1, 3, 5, 7, 9]
int[] arr3=Arrays.copyOf(arr,arr.length/2);
System.out.println(Arrays.toString(arr3));//输出 [1, 3]
int[] arr4=Arrays.copyOf(arr,arr.length*2);
System.out.println(Arrays.toString(arr4));//输出 [1, 3, 5, 7, 9, 0, 0, 0, 0, 0]
Arrays.copyOf方法针对各种数据类型做了重载,其中int[]类型源码如下:
public static int[] copyOf(int[] original, int newLength) {
int[] copy = new int[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
@HotSpotIntrinsicCandidate
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
在JDK的Object类源码中,被@HotSpotIntrinsicCandidate标注的方法,在HotSpot中都有一套高效的实现,该高效实现基于CPU指令,运行时,HotSpot维护的高效实现会替代JDK的源码实现,从而获得更高的效率。
三、填充数组
Arrays.fill(int[] arr,int v)将数组arr的所有值都设置为数值v。
String[] arr7 = new String[5];
Arrays.fill(arr7, "*");
System.out.println(Arrays.toString(arr7));//[*, *, *, *, *]
源码实现:
public static void fill(Object[] a, Object val) {
for (int i = 0, len = a.length; i < len; i++)
a[i] = val;
}
四、比较数组元素
Arrays.equals(type[]a,type[]b)如果两个数组大小相同,并且下标相同的元素都对应相等,返回true。
//比较数组元素
String[] arr7 = {"*", "*", "*", "*", "*",};
String[] arr8 = {"*", "*", "*", "*", "*",};
System.out.println(arr7.equals(arr8));//false
System.out.println(Arrays.equals(arr7, arr8));//true
源码实现:
public static boolean equals(Object[] a, Object[] a2) {
if (a==a2)
return true;
if (a==null || a2==null)
return false;
int length = a.length;
if (a2.length != length)
return false;
for (int i=0; i<length; i++) {
if (!Objects.equals(a[i], a2[i]))
return false;
}
return true;
}
五、数组排序
1.数组排序原理

2.测试示例
//排序
int[] arr6 = {12, 4, 53, 78, 21, 943, 3};
Arrays.sort(arr6);
System.out.println(Arrays.toString(arr6));//输出 [3, 4, 12, 21, 53, 78, 943]
3.实现方式
说起排序先复习一下最常用的冒泡算法:冒泡排序的特点是,每一轮循环后,最大的一个数被交换到末尾,因此,下一轮循环就可以“刨除”最后的数,每一轮循环都比上一轮循环的结束位置靠前一位。
public void sort() {
int[] arr = {28, 12, 89, 73, 65, 18, 96, 50, 8, 36};
System.out.println(Arrays.toString(arr));
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
System.out.println(Arrays.toString(arr));
}
接下来去看一下java中Arrays.sort的实现:
3.java数组排序算法:Dual-Pivot Quicksort
public static void sort(int[] a) {
DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
}
dual-pivot quick sort是一种优化的双基快速排序。
首先回顾一下经典快速排序思路:
接受一个数组,挑一个数(pivot),然后把比它小的那一摊数放在它的左边,把比它大的那一摊数放在它的右边,然后再对这个数左右两摊数递归的执行快排过程,直到子数组只剩一个数为止。
双基快速排序思路:
在经典快排里面有一个pivot的概念,它是用来分隔大数和小数的,这个pivot把一个数组分成两份。那么所谓的Dual-Pivot其实就是用两个Pivot, 把整个数组分成三份。
双基快速排序快在哪里呢?首先看下衡量排序的标准:
元素比较次数:这是比较经典的衡量标准,可是由于CPU与内存的发展失衡,我们在分析算法复杂性的时候已经不能简单地用元素比较次数来比较了,因为这种比较的方法只考虑了CPU的因素,没有考虑内存的因素。
扫描元素个数:对于那种对输入数据进行顺序扫描的排序算法,扫描元素的个数这种新的算法把内存的流量的因素考虑进去,比较适应新时代。
从扫描元素个数准则来比较,双基快速排序要优于经典快速排序。
六、查找
static int binarySearch(type[]a,type v)。采用二分搜索算法查找值v。如果查找成功,则返回相应的下标值;否则,返回一个负数值r。-r-1是为保持a有序v应插入的位置。
//输出2
System.out.println(Arrays.binarySearch(arr6, 12));
//输出7,及-(low+1)=7,所以如果该元素插入数组的位置应该是6
System.out.println(Arrays.binarySearch(arr6, 100));
源码实现:
public static int binarySearch(int[] a, int key) {
return binarySearch0(a, 0, a.length, key);
}
private static int binarySearch0(int[] a, int fromIndex, int toIndex,
int key) {
int low = fromIndex;
int high = toIndex - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
int midVal = a[mid];
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}
七、数组引用
@Test
public void test() {
String[] names = {"ABC", "XYZ", "zoo"};
String s = names[1];
names[1] = "cat";
Assert.assertEquals("XYZ", s);
}

参考资料:
https://www.liaoxuefeng.com/wiki/1252599548343744/1255941599809248
https://www.jianshu.com/p/2c6f79e8ce6e
原来你是这样的JAVA[04]-数组Arrays的更多相关文章
- Java中数组Arrays.binarySearch,快速查找数组内元素位置
在数组中查找一个元素,Arrays提供了一个方便查询的方法.Arrays.binarySearch(): 测试列子: public class MainTestArray { public stati ...
- JAVA中数组Arrays类的常见用法
import java.util.Arrays; int[] array1={7,8,3,2,12,6,5,4}; 1. //克隆clone int[] array2=array1.clone() ...
- Java自学-数组 Arrays
java.util.Arrays类常用方法 Arrays是针对数组的工具类,可以进行 排序,查找,复制填充等功能. 大大提高了开发人员的工作效率. 步骤 1 : 数组复制 与使用System.arra ...
- Java基础--数组(Arrays)
数组(Array),是多个相同类型数据按一定顺序排列 的集合,并使用一个名字命名,并通过编号的方式 对这些数据进行统一管理.本篇博客是对Java基础中的数组进行详细说明. 目录: 数组的概述 一维数组 ...
- Java-Runoob-高级教程-实例-数组:04. Java 实例 – 数组反转
ylbtech-Java-Runoob-高级教程-实例-数组:04. Java 实例 – 数组反转 1.返回顶部 1. Java 实例 - 数组反转 Java 实例 以下实例中我们使用 Collec ...
- 057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和
057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和 本文知识点:求整型数组的数组元素的元素值累加和 案例:求整型数 ...
- JSon_零基础_007_将JSon格式的"数组"字符串转换为Java对象"数组"
将JSon格式的"数组"字符串转换为Java对象"数组". 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“n ...
- Java之数组了解
一.什么是数组 数组可以理解为是一个巨大的“盒子”,里面可以按顺序存放多个类型相同的数据, 比如可以定义 int 型的数组 scores 存储 4 名学生的成绩: int[] scores={76,8 ...
- Java的数组长度无需编译指定,因为它是对象
大家可以看从Thinking in Java中摘出来的代码理解一下,甚至.多维数组的子数组无须等长 //: MultiDimArray.java// Creating multidimensional ...
- Java(数组)动手动脑
1>数组作为方法参数 阅读并运行示例PassArray.java,观察并分析程序输出的结果,小结,然后与下页幻灯片所讲的内容进行对照. 源代码: // PassArray.java // Pas ...
随机推荐
- Python随机UserAgent库,让你不再手动敲UA!
前言 之前也懵懵懂懂写过python爬虫,但是经常被网站的反爬机制干趴下,然后手动写了个随机UA库,情况才好些.今天在互联网畅游时发现,有一个能够产生随机UA的第三方库! 安装第三方库 老生常谈啦,p ...
- 2021年蓝桥杯C/C++大学B组省赛真题(路径)
题目描述: 小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图中的最短路径. 小蓝的图由2021 个结点组成,依次编号1 至2021. 对于两个不同的结点a, b,如果a 和b 的差的绝 ...
- drf——5个视图扩展类、9个视图子类、视图集、drf之路由
5个视图扩展类 # 写5个类(不叫视图类 视图拓展类 需要配合GenericAPIView一起用) 每个类有一个方法 以后想写哪个接口 就继承哪个类即可 from rest_framework.res ...
- react 代码自动格式化
咦写了几行代码发现保存后没有被格式化? import React from "react"; import {Row,Col } from "antd"; ex ...
- 商业智能 (BI) 对企业中每个员工的 5 大好处
本文由葡萄城技术团队于博客园原创并首发.葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 众所周知,商业智能 (BI) 是探索企业数据价值的强大工具,能够帮助企业做出明智的决策.提高绩效 ...
- ENVI指定像元数量(行数与列数)裁剪栅格图像
本文介绍基于ENVI软件,实现栅格遥感影像按照像元行列号与个数进行指定矩形区域裁剪的方法. 一般的,如果我们需要裁剪某个具体的行政区域,按照对应区域的矢量图层裁剪即可:如果需要裁剪某个大致的区 ...
- 曲线艺术编程 coding curves 第三章 弧,圆,椭圆(ARCS, CIRCLES, ELLIPSES)
第三章 弧,圆,椭圆(TRIG CURVES) 原作:Keith Peters https://www.bit-101.com/blog/2022/11/coding-curves/ 译者:池中物王二 ...
- C++面试八股文:C++中,函数的参数应该传值还是传引用?
某日二师兄参加XXX科技公司的C++工程师开发岗位第8面: 面试官:C++中,函数的参数应该传值还是传引用? 二师兄:要看参数的用途.如果是出参,必须传引用.如果是入参,主要考虑参数类型的大小,来决定 ...
- 【HarmonyOS】详解低代码端云一体化开发之连接器
[关键字] 元服务.低代码平台.端云一体化开发.连接器.拖拽式UI [1.写在前面] 前面我们写了两篇文章分别介绍了低代码平台的基本使用和端云一体化开发中数据模型的使用,有需要的可以了解一下,文章地 ...
- Helm实战案例二:在Kubernetes(k8s)上使用helm安装部署日志管理系统EFK
目录 一.系统环境 二.前言 三.日志管理系统EFK简介 四.helm安装EFK 4.1 helm在线安装EFK 4.2 helm离线安装EFK(推荐) 五.访问kibana 5.1 数据分片 六.卸 ...