java 数组

java 数组

1.数组创建

java中数组创建有两种方式分别如下:

type arrName[]=new type[arrSize];
type[] arrName=new type[arrSize];

type为元素数据类型,arrName为数组名,arrSize为数组大小,数据类型可以是原始数据类型int等,也可以是引用数据类型。

我个人一般比较喜欢用第二种方式,这样可以把type[]看做一个类,那么arrName就是一个对象,便于理解。但二者是没有功能差别的

arrSize是预先确定数组大小,一旦确定,不再更改,所以需要提前确定你需要多大的空间。

2.初始化

初始化包括静态和动态初始化,分别如下方式:

静态:
int[] arrInt={1,2,3,4,5};
String[] arrString={"aaa","bbb","ccc"};
这样可以不用声明数组大小。

动态:
float[] arrFloat=new float[3];
arrFloat[0]=0.1f;
arrFloat[1]=1.0f;
arrFloat[2]=1.2f;
需要预先确定数组大小。

注意:对于引用类型数据初始化,需要先创建特定对象,再将数组指向该对象。什么意思?看如下代码:

public class Array {

    public static void main(String[] args) {
        MyClass[] arr=new MyClass[3];
        arr[1].id=1;
        System.out.println(arr[1].id);
    }

}

class MyClass{
    public int value;
    public int id;

    public MyClass(int id,int value){
        this.value=value;
        this.id=id;
    }
}

运行该代码,会发现报错:
Exception in thread “main” java.lang.NullPointerException
这是由于没有显式的把某个对象引用传给数组元素。
修改如下:

public class Array {

    public static void main(String[] args) {
        MyClass[] arr=new MyClass[3];
        arr[1]=new MyClass(1,2);//将一个真实对象传给数组元素
        System.out.println(arr[1].id);
    }

}

对于数组元素是引用类型的数组,在访问数组中对象之前,需要创建相应的对象并 让数组元素引用它.

3.数组访问

跟c,c++一样,直接通过下标访问元素,但是一定要确保下标大于等于0小于数组最大长度,数组长度用length属性指明。

数组变量一般会直接想到使用for循环,如下示例:

public class Array {

    public static void main(String[] args) {
        int[] arr={1,2,3,4,5};
        for(int i=0;i<arr.length;i++){
            System.out.println(arr[i]);
        }
    }

}

这种方法固然可行,但是java还提供foreach供用户遍历,示例如下:

public class Array {

    public static void main(String[] args) {
        int[] arr={1,2,3,4,5};
        for(int ele:arr){
            System.out.println(ele);
        }
    }

}

其中迭代变量ele必须在()内声明,该方法就是声明了一个和arr相同数据类型的变量ele,使用ele来遍历整个arr数组,从第一个元素到最后一个。

4.数组作为方法参数

数组作为方法参数是按引用传递的,如果方法中有代码更改了数组元素的值,实 际上是直接修改了原始的数组元素。

按值传递时,方法体中修改的仅是原始数组 元素的一个拷贝。

public class Array {

    public static void main(String[] args) {
        int[] arr={1,2,3,4,5};

        for(int e:arr){
            modifyElement(e);
        }
        String str1="";
        for(int e:arr){
            str1+=(e+",");
        }
        System.out.println(str1);//输出:1,2,3,4,5,

        String str2="";
        modifyArray(arr);
        for(int e:arr){
            str2+=(e+",");
        }
        System.out.println(str2);//输出:2,4,6,8,10,
    }
    public static void modifyElement(int e){
        e*=2;
    }
    public static void modifyArray(int[] arr){//改变了arr
        for(int i=0;i<arr.length;i++){
            arr[i]*=2;
        }
    }
}

5.多维数组

实际上并不存在多维数组,可以看做一个一维数组,只不过他的元素是多维数组罢了。

java中多维数组可以是不整齐的。

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

6.一些方法使用

System.arraycopy((Object src,int srcPos,Object dest,int destPos,int length)

src是源数组,srcPos是源数组赋值起始位置,dest是目标数组,destPos是目标数组起始位置,length是赋值长度。

Arrays类中提供了许多静态方法供使用,参考Arrays

一: 内容:1、设线性表存放在向量A[arrsize]的前elenum个分量中,且递增有序。试设计一算法,将x插入到线性表的适当位置上,以保持线性表的有序性。 2、用向量作存储结构,试设计一个算法,仅用一个辅助结点,实现将线性表中的结点循环右移k位的运算。 3、用向量作存储结构,试设计一个算法,仅用一个辅助结点,实现将线性表逆置的运算。 要求:了解线性表的逻辑结构特征,熟练掌握线性表的顺序存储结构的描述方法,及在其上实现各种基本运算的方法。 二:内容:1、已知带头结点的动态单链表L中的结点是按整数值递增排序的,试写一算法将值为x的结点插入到表L中,使L仍然有序。 2、设计一算法,逆置带头结点的动态链表L。要求利用原表的结点空间,并要求用尽可能少的时间完成。 3、假设有两个按元素值递增有序的线性表A和B,均以单链表作存储结构,试编写算法将A表和B表归并成一个按元素值递减有序的线性表C,并要求利用原表的空间存放C。 要求:熟练掌握线性表的单链式链接存储结构及在其上实现线性表的各种基本运算的方法。 三:内容:1、假设在长度大于1的单循环链表中,既无头结点也无头指针。s为指向某个结点的指针,试编写算法删除结点*s的直接前驱结点。 2、已知由单链表表示的线性表中,含有三类字符的数据元素(如:字母、数字和其它字符),设计算法构造三个以循环链表示的线性表,使每一个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的空间。(头结点可以另辟空间) 3、有一双链表,每个结点中除有prior、data和next域外,还有一访问频度域freq,在链表被启用前,其值均初始化为零。每当在链表上进行一次LOCATE(L,x)运算,元素值为x的结点中freq域的值增1,并使此链表中结点保持按freq递减的顺序排列,以便使频繁访问的结点总是靠近表头。设计满足上述要求的LOCATE算法。 要求:熟练掌握线性表的循环链式和双链式链接存储结构及在其上实现线性表的各种基本运算的方法。 四:内容:1、设单链表中存放着n个字符,设计算法,判断该字符串中是否有中心对称关系。例如:xyzzyx、xyzyx都算是中心对称的字符串。 2、设计算法判断一个算术表达式的圆括号是否配对。(提示:对表达式进行扫描,遇‘(’进栈,遇‘)’退掉栈顶的‘(’,表达式被扫描完毕,栈为空) 3、假设以带头结点的循环链表表示队列,并只设一个指针指向队尾,编写相应的置队空、入队和出队算法。 要求:掌握栈和队列的数据结构的特点;熟练掌握在两种存储结构上实现栈和队列的基本运算;学会利用栈和队列解决一些实际问题。 五:内容:1、若X和Y是用结点大小为1的单链表表示的串,设计算法找出X中第一个不在Y中出现的字符。 2、设计一算法,在顺序串上实现串的比较运算strcmp(S,T)。 3、若S和T是用结点大小为1的单链表存储的两个串,设计算法将S中首次与T匹配的子串逆置。 要求:熟练掌握串的顺序和链接存储结构的实现方法;熟练掌握在两种存储结构上实现串的各种运算。 六:内容:1、以二叉链表作存储结构,设计求二叉树高度的算法。 2、一棵n个结点的完全二叉树用向量作存储结构,用非递归算法实现对该二叉树进行前序遍历。 3、以二叉链表作存储结构,编写非递归的前序、中序、后序遍历算法。 要求:熟悉二叉树的各种存储结构的特点及适用范围;掌握建立二叉树的存储结构的方法;熟练掌握二叉树的前序、中序、后序遍历的递归及非递归算法;灵活运用递归的遍历算法实现二叉树的其它各种运算。
### Java数组的使用方法 Java中的数组是一种基本的数据结构,用于存储固定大小的相同类型元素。数组的创建和使用在Java中有多种方式,以下是一些常见的操作方法和示例。 #### 创建数组Java中,数组的创建方式主要有以下几种: - **指定大小创建数组**: ```java int[] numbers = new int[5]; // 创建一个长度为5的整型数组 ``` - **初始化数组并赋值**: ```java int[] numbers = new int[]{1, 2, 3, 4, 5}; // 创建并初始化一个整型数组 ``` - **简化方式创建并初始化数组**: ```java int[] numbers = {1, 2, 3, 4, 5}; // 简化方式创建并初始化数组 ``` #### 访问数组元素 数组的索引从0开始,可以通过索引来访问数组中的元素: ```java int[] numbers = {1, 2, 3, 4, 5}; System.out.println(numbers[0]); // 输出第一个元素,即1 ``` #### 修改数组元素 通过索引可以直接修改数组中的元素: ```java int[] numbers = {1, 2, 3, 4, 5}; numbers[0] = 10; // 将第一个元素修改为10 System.out.println(numbers[0]); // 输出10 ``` #### 遍历数组 可以使用循环来遍历数组中的所有元素: ```java int[] numbers = {1, 2, 3, 4, 5}; for (int i = 0; i < numbers.length; i++) { System.out.println(numbers[i]); } ``` #### 数组排序 Java提供了`Arrays.sort()`方法来对数组进行排序。该方法使用快速排序算法对数组进行排序: ```java import java.util.Arrays; int[] numbers = {4, 2, 9, 1, 5, 6}; Arrays.sort(numbers); // 对数组进行排序 System.out.println(Arrays.toString(numbers)); // 输出: [1, 2, 4, 5, 6, 9] ``` #### 多维数组 Java中也支持多维数组,最常见的是二维数组: ```java int[][] matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; // 访问二维数组中的元素 System.out.println(matrix[0][1]); // 输出2 ``` #### 示例代码:创建、修改和排序数组 以下是一个完整的示例代码,展示了如何创建数组、修改元素、遍历数组以及对数组进行排序: ```java import java.util.Arrays; public class ArrayExample { public static void main(String[] args) { // 创建并初始化数组 int[] numbers = {5, 3, 8, 1, 2}; // 修改数组元素 numbers[0] = 10; // 遍历数组 System.out.println("修改后的数组:"); for (int num : numbers) { System.out.print(num + " "); } // 对数组进行排序 Arrays.sort(numbers); System.out.println("\n排序后的数组:" + Arrays.toString(numbers)); } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值