Java数组操作是Java编程中的一个重要部分,它可以帮助我们更有效地处理大量数据。下面是一个完整的Java数组操作应用知识汇总表:
1. 创建数组:可以使用new关键字来创建一个新的数组,也可以使用Array.of()方法来创建一个新的数组。
int[] arr = new int[10]; // 创建一个长度为10的int型数组 int[] arr2 = Array.of(1, 2, 3); // 创建一个包含1、2、3的int型数组
2. 访问元素:可以使用for循环或者for-each循环来访问数组中的元素。
for (int i = 0; i < arr.length; i++) { // 通过for循环访问arr中的元素 System.out.println(arr[i]); } for (int num : arr2) { // 通过for-each循环访问arr2中的元素 System.out.println(num); }
3. 添加元素:可以使用Arrays.copyOf()方法将新元素添加到已有的数组中。
int[] newArr = Arrays.copyOf(arr, arr.length + 1); // 向arr中添加一个新元完整的java数组操作应用知识汇总
数组是一种非常有用和常用的数据类型,存在于每种程序语言之中,java中的数组是一种最简单的复合数据类型,刚学习java数组的小白们大多都会听到一句这样的话:java是纯面向对象的语言,它的数组也是一个对象。所以很多人就按照一个对象的方式来使用数组,后来你会发现,将数组作为一个类来使用在实现上是多么的“不自然”。下面就来全面了解一下关于java中数组的知识。
什么是数组
数组是同一种类型数据的集合,其实就是一个容器。运算的时候有很多数据参与运算,那么首先需要做的是什么。不是如何运算而是如何保存这些数据以便于后期的运算,那么数组就是一种用于存储数据的方式,能存数据的地方我们称之为容器,容器里装的东西就是数组的元素,数组可以装任意类型的数据,虽然可以装任意类型的数据,但是定义好的数组只能装一种元素, 也就是数组一旦定义,那么里边存储的数据类型也就确定了。
数组的特点
1.在Java中,无论使用数组或集合,都有边界检查。如果越界操作就会得到一个RuntimeException异常。
2.数组只能保存特定类型。数组可以保存原生数据类型,集合则不能。集合不以具体的类型来处理对象,它们将所有对象都按Object类型处理,集合中存放的是对象的引用而不是对象本身。
3.集合类只能保存对象的引用。而数组既可以创建为直接保存原生数据类型,也可以保存对象的引用。在集合中可以使用包装类(Wrapper Class),如Integer、Double等来实现保存原生数据类型值。
4.对象数组和原生数据类型数组在使用上几乎是相同的;唯一的区别是对象数组保存的是引用,原生数据类型数组保存原生数据类型的值。int a = 10; Integer integer = new Integer(a); int b = integer.intValue(); System.out.println(a = b);
数组的正确使用
如果需要存储大量的数据,例如如果需要读取100个数,那么就需要定义100个变量,显然重复写100次代码,是没有太大意义的。如何解决这个问题,Java语言提供了数组(array)的数据结构,是一个容器可以存储相同数据类型的元素,可以将100个数存储到数组中。这时候数组就有很大的帮助了~
数组的格式
格式一:
元素类型[]数组名 = new元素类型[元素个数或数组长度];
int[] arr = new int[5]; arr[0] = 1; arr[1] = 2;
格式二:
元素类型[]数组名 = new元素类型[]{元素,元素,……};
int[] arr = new int[]{3,5,1,7}; int[] arr = {3,5,1,7};
注意:给数组分配空间时,必须指定数组能够存储的元素个数来确定数组大小。创建数组之后不能修改数组的大小。可以使用length属性获取数组的大小。
声明数组变量
为了使用数组必须在程序中声明数组,并指定数组的元素类型=左半部分:
先写左边明确了元素类型 是int ,容器使用数组,那么如何来标识数组?.那么用一个特殊的符号[]中括号来表示。想要使用数组是需要给数组起一个名字的,那么我们在这里给这个数组起名字为arr .接着跟上等号。
代码体现:
示例:int [] arr
注意:int arr[] 也是一种创建数组的格式。推荐使用int [] arr 的形式声明数组。String[] aArray = new String[5]; String[] bArray = {"a","b","c", "d", "e"}; String[] cArray = new String[]{"a","b","c","d","e"};
创建数组的三种方式及区别
他们的区别,方式一:在声明的时候直接就已经分配空间,并赋值,方式一是不能写成如下这种形式的。public static void main(String[] args) { // 1.方式一 声明 分配空间并赋值 int[] arr1 = {1,2,3}; // 2.方式二 显示初始化 int[] arr2; arr2 = new int[]{1,2,3}; // 3.方式三 显示初始化() int[] arr3; arr3 = new int[3]; }
方式二和方式三,声明和内存分配是分开的,如上面的例子,int[] arr1; arr1 = {1,2,3};//错误写法 编译不通过
这一步是在栈空间分配一个引用,存放的是一个引用,nullint[] arr2; 和 int[] arr3;
到这一步的时候jvm才开始在内存堆区域分配空间,并赋值,方式二直接赋值 1,2,3 方式三 默认初始化,基本类型是 0 布尔类型是 false 引用类型为null,arr2 = new int[]{1,2,3};<span style="font-family: Arial, Helvetica, sans-serif;">arr3 = new int[3];</span>
注:内存一旦分配不能改变,所有说数组长度固定
数组初始化
方式一:不使用运算符new方式二:使用运算符newint[]arr = { 1, 2, 3, 4, 5 };
如果数组初始化中不使用运算符new。需要注意:下列写法是错误的。int[] arr2 = new int[] { 1, 2, 3, 4, 5 }; int[] arr3=new int[3]; arr3[0]=1; arr3[1]=5; arr3[2]=6;
int[] arr; arr={1,2,3,4,5};
此时初始化数组,必须将声明,创建,初始化都放在一条语句中个,分开会产生语法错误。
所以只能如下写:
int[] arr={1,2,3,4,5};
java.util.Arrays
Arrays类是一个非常有用数组工具类,里面有很多工具方法,检索、填充、排序、比较、toString()等。
下面给个例子:import java.util.Arrays; public class TestArrays { public static void main(String[] args) { int[] i = new int[10]; //填充数组 Arrays.fill(i, 2); //遍历数组 for (int x : i) { System.out.print(x + " "); } //toString()数组 System.out.println("n" + Arrays.toString(i)); //复制数组 int[] b = new int[12]; System.arraycopy(i, 0, b, 2, 5); System.out.println(Arrays.toString(b)); //一维数组的比较 int[] c = new int[3]; int[] d = new int[3]; Arrays.fill(c, 3); Arrays.fill(d, 3); System.out.println(c.equals(d)); System.out.println(Arrays.equals(c, d)); System.out.println("-------------"); int[][] a1 = {{1, 2, 3}, {4, 5, 6}}; int[][] a2 = {{1, 2, 3}, {4, 5, 6}}; System.out.println(a1.equals(a2)); System.out.println(Arrays.equals(a1, a2)); System.out.println(Arrays.deepEquals(a1, a2)); //深度toString() System.out.println(Arrays.toString(a1)); System.out.println(Arrays.deepToString(a1)); //数组的排序 int[] a3 = {3, 2, 5, 4, 1}; System.out.println(Arrays.toString(a3)); Arrays.sort(a3); System.out.println(Arrays.toString(a3)); //一维数组数值检索 int index1 = Arrays.binarySearch(a3, 4); int index2 = Arrays.binarySearch(a3, -12); int index3 = Arrays.binarySearch(a3, 8); System.out.println(index1 + " " + index2 + " " + index3); } }
执行结果:2 2 2 2 2 2 2 2 2 2 [2, 2, 2, 2, 2, 2, 2, 2, 2, 2] [0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0] false true ------------- false false true [[I@3e25a5, [I@19821f] [[1, 2, 3], [4, 5, 6]] [3, 2, 5, 4, 1] [1, 2, 3, 4, 5] 3 -1 -6 Process finished with exit code 0
数组的遍历
public static void main(String[] args) { int[] x = { 1, 2, 3 }; for (int y = 0; y < 3; y++) { System.out.println(x[y]); // System.out.println("x["+y+"]="+x[y]); 打印效果 x[0]=1; } // 那么这就是数组的第一个常见操作.遍历 }
数组中有一个属性可以获取到数组中元素的个数,也就是数组的长度.数组名.lengthpublic static void main(String[] args) { int[] x = { 1, 2, 3 }; for (int y = 0; y < x.length; y++) { System.out.println(x[y]); // System.out.println("x["+y+"]="+x[y]); 打印效果 x[0]=1; } // 那么这就是数组的第一个常见操作.遍历 }
数组的复制
java.lang.System public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
参数:
src - 源数组。
srcPos - 源数组中的起始位置。
dest - 目标数组。
destPos - 目标数据中的起始位置。
length - 要复制的数组元素的数量。
数组的常见异常
1、数组角标越界异常:,注意:数组的角标从0开始。2、空指针异常:public static void main(String[] args) { int[] x = { 1, 2, 3 }; System.out.println(x[3]); //java.lang.ArrayIndexOutOfBoundsException }
数组:public static void main(String[] args) { int[] x = { 1, 2, 3 }; x = null; System.out.println(x[1]); // java.lang.NullPointerException }
什么时候使用数组:当元素较多时为了方便操作这些数组,会先进行来临时存储,所使用的容器就是数组。
特点:
数组长度是固定的。
数组的常见操作
1、一个数组取出最大值
public static int getMax(int[] arr) { //定义变量记录较大的值,初始化为数组中的任意一个元素。 int max = arr[0]; for(int x=1; x<arr.length; x++) { if(arr[x]>max) max = arr[x]; } return max; }
2、直接排序
使用直接排序对数组进行排序:
public static void selectSort(int[] arr) { for(int x=0; x<arr.length-1; x++) { for(int y=x+1; y<arr.length; y++)//为什么y的初始化值是 x+1?因为每一次比较, //都用x角标上的元素和下一个元素进行比较。 { if(arr[x]>arr[y]) { int temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } } } }
3、冒泡排序
public static void bubbleSort(int[] arr) { for(int x=0; x<arr.length-1; x++) { for(int y=0; y<arr.length-x-1; y++)//-x:让每次参与比较的元减。 //-1:避免角标越界。 { if(arr[y]>arr[y+1]) { int temp = arr[y]; arr[y] = arr[y+1]; arr[y+1] = temp; } } } }
4、折半查找(二分法)
public static int halfSeach(int[] arr,int key) { int min,mid,max; min = 0; max = arr.length-1; mid = (max+min)/2; while(arr[mid]!=key) { if(key>arr[mid]) min = mid + 1; else if(key<arr[mid]) max = mid - 1; if(min>max) return -1; mid = (max+min)/2; } return mid; }
5、数组翻转public static void reverseArray(int[] arr) { for(int start=0,end=arr.length-1; start<end; start++,end--) { swap(arr,start,end); } } //对数组的元素进行位置的置换。 public static void swap(int[] arr,int a,int b) { int temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; }
6、多维数组Java语言中,多维数组被看作数组的数组。
①二维数组的定义type arrayName[ ][ ]; type [ ][ ]arrayName;
②二维数组的初始化
静态初始化
Java语言中,由于把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小相同。int intArray[ ][ ]={{1,2},{2,3},{3,4,5}};
动态初始化
直接为每一维分配空间,格式如下:从最高维开始,分别为每一维分配空间:arrayName = new type[arrayLength1][arrayLength2]; int a[ ][ ] = new int[2][3];
例: 二维简单数据类型数组的动态初始化如下:arrayName = new type[arrayLength1][ ]; arrayName[0] = new type[arrayLength20]; arrayName[1] = new type[arrayLength21]; … arrayName[arrayLength1-1] = new type[arrayLength2n];
对二维复合数据类型的数组,必须首先为最高维分配引用空间,然后再顺次为低维分配空间。而且,必须为每个数组元素单独分配空间。int a[ ][ ] = new int[2][ ]; a[0] = new int[3]; a[1] = new int[5];
例如:String s[ ][ ] = new String[2][ ]; s[0]= new String[2];//为最高维分配引用空间 s[1]= new String[2]; //为最高维分配引用空间 s[0][0]= new String("Good");// 为每个数组元素单独分配空间 s[0][1]= new String("Luck");// 为每个数组元素单独分配空间 s[1][0]= new String("to");// 为每个数组元素单独分配空间 s[1][1]= new String("You");// 为每个数组元素单独分配空间
③二维数组元素的引用
对二维数组中的每个元素,引用方式为:arrayName[index1][index2]
例如:num[1][0];
④二维数组举例:
【例】两个矩阵相乘public class MatrixMultiply{ public static void main(String args[]){ int i,j,k; int a[][]=new int [2][3]; //动态初始化一个二维数组 int b[][]={{1,5,2,8},{5,9,10,-3},{2,7,-5,-18}};//静态初始化 一个二维数组 int c[][]=new int[2][4]; //动态初始化一个二维数组 for (i=0;i<2;i++) for (j=0; j<3 ;j++) a[j]=(i+1)*(j+2); for (i=0;i<2;i++){ for (j=0;j<4;j++){ c[j]=0; for(k=0;k<3;k++) c[j]+=a[k]*b[k][j]; } } System.out.println("*******Matrix C********");//打印Matrix C标记 for(i=0;i<2;i++){ for (j=0;j<4;j++) System.out.println(c[j]+" "); System.out.println(); } } }
7、List相互转换的方法
①List转换成为数组。(这里的List是实体是ArrayList)
调用ArrayList的toArray方法。
toArray
public <T> T[] toArray(T[] a)返回一个按照正确的顺序包含此列表中所有元素的数组;返回数组的运行时类型就是指定数组的运行时类型。如果列表能放入指定的数组,则返回放入此列表元素的数组。否则,将根据指定数组的运行时类型和此列表的大小分配一个新的数组。
如果指定的数组能容纳列表并有剩余空间(即数组的元素比列表的多),那么会将数组中紧跟在集合末尾的元素设置为 null。这对确定列表的长度很有用,但只 在调用方知道列表中不包含任何 null 元素时才有用。
指定者:
接口 Collection<E> 中的 toArray
指定者:
接口 List<E> 中的 toArray
覆盖:
类 AbstractCollection<E> 中的 toArray
参数:
a - 要存储列表元素的数组,如果它足够大的话;否则,它是一个为存储列表元素而分配的、具有相同运行时类型的新数组。
返回:
包含列表元素的数组。
抛出:
ArrayStoreException - 如果 a 的运行时类型不是此列表中每个元素的运行时类型的超类型。
具体用法:List list = new ArrayList(); list.add("1"); list.add("2"); final int size = list.size(); String[] arr = (String[])list.toArray(new String[size]);
②数组转换成为List。
调用Arrays的asList方法.
asList
public static <T> List<T> asList(T... a)返回一个受指定数组支持的固定大小的列表。(对返回列表的更改会“直写”到数组。)此方法同 Collection.toArray 一起,充当了基于数组的 API 与基于 collection 的 API 之间的桥梁。返回的列表是可序列化的,并且实现了 RandomAccess。
此方法还提供了一个创建固定长度的列表的便捷方法,该列表被初始化为包含多个元素:
List stooges = Arrays.asList("Larry", "Moe", "Curly");
参数:
a - 支持列表的数组。
返回:
指定数组的列表视图。
另请参见:
Collection.toArray()
具体用法:
String[] arr = new String[] {"1", "2"}; List list = Arrays.asList(arr);
Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称。由詹姆斯·高斯林(James Gosling)和...
Python3 os.stat_float_times() 方法 Python3 OS 文件/目录方法概述os.stat_float_times() 方法用于决定stat_result是否以float...
Python3 os.read() 方法 Python3 OS 文件/目录方法概述os.read() 方法用于从文件描述符 fd 中读取最多 n 个字节,返回包含读取字...
本文转载至知乎ID:Charles(白露未晞)知乎个人专栏下载手机App,0基础随时随地学编程戳此了解导语利用Python实现手写笔记的压...