IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 完整的java数组操作应用知识汇总 -> 正文阅读

[Java知识库]完整的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个数存储到数组中。这时候数组就有很大的帮助了~对于新手小白想更轻松的学好Java提升,Java架构,web开发、大数据,数据分析,人工智能等技术,这里给大家分享系统教学资源,扩列下我尉(同英):CGMX9880 【教程/工具/方法/解疑】

数组的格式

格式一:

元素类型[]数组名 = 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

示例:

String[] aArray = new String[5];  
String[] bArray = {"a","b","c", "d", "e"};  
String[] cArray = new String[]{"a","b","c","d","e"}; 

**注意:**int arr[] 也是一种创建数组的格式。推荐使用int [] arr 的形式声明数组。

创建数组的三种方式及区别

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};//错误写法 编译不同过  

方式二和方式三,声明和内存分配是分开的,如上面的例子,

int[] arr2;  和  int[] arr3;  

这一步是在栈空间分配一个引用,存放的是一个引用,null

arr2 = new int[]{1,2,3};<span style="font-family: Arial, Helvetica, sans-serif;">arr3 = new int[3];</span>  

到这一步的时候jvm才开始在内存堆区域分配空间,并赋值,方式二直接赋值 1,2,3 ?方式三 默认初始化,基本类型是 0 ?布尔类型是 false 引用类型为null,对于新手小白想更轻松的学好Java提升,Java架构,web开发、大数据,数据分析,人工智能等技术,这里给大家分享系统教学资源,扩列下我尉(同英):CGMX9880 【教程/工具/方法/解疑】

**注:**内存一旦分配不能改变,所有说数组长度固定

创建数组

数组初始化

方式一:不使用运算符new

int[]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;

如果数组初始化中不使用运算符new。需要注意:下列写法是错误的。

int[] arr;
arr={1,2,3,4,5};

此时初始化数组,必须将声明,创建,初始化都放在一条语句中个,分开会产生语法错误。

所以只能如下写:

int[] arr={1,2,3,4,5};

java.util.Arrays

Arrays类是一个非常有用数组工具类,里面有很多工具方法,检索、填充、排序、比较、toString()等。

下面给个例子:

import java.util.Arrays; 

/** 
* 数组综合测试 
* 
* @author leizhimin 2009-7-28 12:35:41 
*/ 
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;
} // 那么这就是数组的第一个常见操作.遍历
}

数组中有一个属性可以获取到数组中元素的个数,也就是数组的长度.数组名.length

public 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开始。

public static void main(String[] args) {
int[] x = { 1, 2, 3 };
System.out.println(x[3]);
//java.lang.ArrayIndexOutOfBoundsException
}

2、空指针异常:

public static void main(String[] args) {
int[] x = { 1, 2, 3 };
x = null;
System.out.println(x[1]);
// java.lang.NullPointerException
}

数组:
什么时候使用数组:当元素较多时为了方便操作这些数组,会先进行来临时存储,所使用的容器就是数组。

特点:
数组长度是固定的。

数组的常见操作

1、一个数组取出最大值

/*定义一个获取最大值的功能:
1、确定结果 :返回值类型 int
2、未知内容:要获取哪个数组的最大值没有确定,则是数组没有确定

思路:

1、定义一个变量,记录住数组的比较大的元素。
2、遍历整个数组,让数组的每一个元素都和该变量进行对比即可。
3、当变量遇到比它大的元素,则让该变量记录该元素的值,当循环结束时,最大 ? 值产生了

*/
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; 

②二维数组的初始化

静态初始化

int intArray[ ][ ]={{1,2},{2,3},{3,4,5}}; 

Java语言中,由于把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小相同。

动态初始化

直接为每一维分配空间,格式如下:

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[] toArray(T[] a)返回一个按照正确的顺序包含此列表中所有元素的数组;返回数组的运行时类型就是指定数组的运行时类型。如果列表能放入指定的数组,则返回放入此列表元素的数组。否则,将根据指定数组的运行时类型和此列表的大小分配一个新的数组。

如果指定的数组能容纳列表并有剩余空间(即数组的元素比列表的多),那么会将数组中紧跟在集合末尾的元素设置为 null。这对确定列表的长度很有用,但只 在调用方知道列表中不包含任何 null 元素时才有用。

指定者:
接口 Collection 中的 toArray

指定者:
接口 List 中的 toArray

覆盖:
类 AbstractCollection 中的 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 List 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知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:16:56  更:2022-02-26 11:17:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:52:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码