面向初学者的java基础知识(二)数组/数组列表

上次写面向初学者的java基础知识(一)的时候本来只是试着写写,但是没想到有三十多个读者收藏了我的内容,在此感谢大家的支持。

在这一篇中,我会继续讲解一些上一篇没有涉及到的java中的数据类型。

基本数据类型

6)数组(array)

与其说数组是一个数据类型,不如说它是一个包括了很多同一类型的变量的一个集合。和前面涉及到的int,double,string等不一样的是,数组并没有明确的primitive 和reference之分,对于数组的分类取决于数组内每个变量的数据类型。对于primitive类型的数据,数组存储的是值,但是声明reference类型的数组时,数组内部存储的都是指针,这些指针指向heap上的内容。

初始化数组有好几种方式,但是无一例外,都要先决定该数组内的变量类型。由于声明数组时可能会用到数组下标以及数组大小,因此在讲解声明方式前,我先介绍一下数组的大小和下标。

无论什么类型数组,都有下标和大小,或者说数组的长度。像字符串一样,数组长度就是该数组中包括的元素类型,而数组的下标从0开始,到长度-1结束。值得注意的是,数组的长度在声明之后就是不能改变的。

说回声明,我们以整数数组为例,如果我想声明一个名为nums并且包括2,4,6,8,10这五个数的数组,那么我有两种声明方式:

方式一:type[] ArrayName={element 1,element 2,element 3,……,element n};

int[] nums = {2,4,6,8,10};

方式二:tpye[] ArrayName=type[length];

用这种方式声明数组时,需要用到数组下标:

int[] nums = new int[5];
nums[0]=2;
nums[1]=4;
nums[2]=6;
nums[3]=8;
nums[4]=10;

如上文所示,nums是一个整数类的数组,包括2,4,6,8,10这五个整数,这五个整数按声明时输入的顺序排列,每个值都有一个下标,如下表:

下标01234
nums246810

在例子中我们还可以看到,使用方法二声明数组时,需要先声明一个空数组再向空数组中添加值,而在向数组中添加值之前,数组内是有初始值的。整数类数组的初始值均为0,字符串类型的初始值为null,boolean类型的初始值为false。

讲完数组声明和下标,接下来我会介绍几个数组的特殊特点。

a.下标访问

如果想知道一个数组中下标为n的位置是什么值,可以用下标访问:

ArrayName[n];

以上文中nums为例,将nums数组中下标为1的整数存储在名为n1的变量中:

int n1 = nums[1];

执行完这一行代码之后,n1的值为4。

b.长度

如果想知道数组的长度,可以用length方法:

nums.length;

以nums为例: 

int len = nums.length;

此时len的值为5。

c.遍历

而对于一个比较大的数组,为了访问数组中所有数据,比如输出数组中的所有值,我们会使用for循环遍历这个数组.

以nums为例,输出nums中所有的值:

for(int i=0;i<nums.length;i++){
    System.out.print(nums[i]);
}

输出结果为:246810

其中i是一个暂时变量,它在上文这个for循环中的作用是暂时充当数组的下标。

不只是输出数组中的值,利用for循环还可以做到很多事情,比如对数组中的值进行加减乘除,批量修改数组中的值,或者是查找数组中有没有某个特定值等等,甚至有时候将变量输入空数组也可以利用循环。而且,遍历数组时,除了常规的for循环,我们也可以使用for-each循环。

for-each循环是针对数组的一种for循环的简化版,使用for-each循环时,不用数组下标就可以遍历数组。还是上文中的例子,如果我想用for-each循环遍历nums并输出nums中的每个值:

for(int num:nums){
    System.out.print(num);
}

在上面的代码中,num指代的是nums里的每个元素,这一段代码会按顺序遍历nums并且输出nums中的整数。与常规的for循环不同的是,for-each循环只能正序遍历数组,并且无法修改数组里的元素。所以,在需要进行元素的修改或者是需要以倒序的方式遍历数组时,我们通常选择用常规的for循环来实现。

d.比较

许多读者在刚接触到数组的时候可能会认为只要用==就可以比较两个数组内所有元素是否相同,但是这样写是会报错的。数组无法用==判断,equals()方法也只适用于字符串,无法用来比较数组,因此在对比两个数组时,只能用遍历的方式依次对比数组中的每个元素。

7)arraylist数组列表

看到这个名字大家应该都多多少少猜到了数组列表和数组有一定的关系,其实数组列表是基于数组的一个数据类型。与数组不同的是,数组列表里的元素是可以在初始化后进行添加或者删除的,也就是说,数组列表的长度是可以改变的。

比起数据类型,数组列表在使用时更像是一个库,这么说是因为使用数组列表其实是需要导入的:

import java.util.Arraylist;

也可以一次性导入java中所有的库:

import java.util.*;

导入数组列表之后,就可以声明了。数组列表的声明方式是:

ArrayList<数据类型(包装类)>  listname=new ArrayList<数据类型(包装类)>();

举个例子,如果我要声明一个名为nums的整数类数组列表:

ArratList<Integer> nums = new ArrayList<Integer>();

这样就算声明完成了。

当然,也可以像声明object那样声明数组列表:

ArrayList nums = new ArrayList();

但由于这样写可能会因为不够明确而导致错误,所以这一种声明方式使用的并不太多。

那么,如何向列表内添加元素呢?

这需要用到add()方法,即listname.add(element);

以前文中已经声明好的nums列表为例,向该数组中按顺序添加2,4,6,8,10:

nums.add(2);
nums.add(4);
nums.add(6);
nums.add(8);
nums.add(10);

现在的nums列表中就包括了五个整数。

除此之外,数组列表还有很多函数。以下是几个常用的方法

(注:下标中所有方法均以上文中已经声明并且添加了元素的nums数组列表为例,且每个示例中使用的nums列表均为未修改过的列表):

方法内容示例
add(object)将括号内需要添加的内容直接添加在数组列表的结尾并返回一个布尔值,添加成功返回true,否则返回false

nums.add(2);

则上文中nums里的元素变成了[2,4,6,8,10,2]
add(index,object)

将object插入在数组列表内index位置,原本index位置的值和后续的所有只一起向后移动

若index等于数组长度,则在数组末尾添加object

nums.add(2,3);

在2位置添加了3,则原本的6所处的位置变成了3,后续的6,8和10都向后移动一位,列表元素变成了[2,4,3,6,8,10]
get(index)返回数组列表内下标为index上的元素

nums.get(3);

返回nums列表中3位置上的元素,即8
remove(index)将数组列表内下标为index的元素移除,后续的所有元素向前移动一位

nums.remove(2);

将nums中2位置上的元素移除,即移除了6,nums变成了[2,4,8,10]
set(index,object)将数组列表内下标为index的元素替换为object

nums.set(2,3);

将nums中2位置上的元素替换为3,则原本的6变成了3,nums列表变为[2,4,3,8,10]
size()返回数组列表的长度

nums.size();

返回nums的大小,即5
toString()以字符串的形式返回数组列表里的所有元素,默认返回的形式是[element 1, element 2,…,element n]

nums.toString();

按字符串格式返回nums列表,即返回[2,4,6,8,10]

需要注意的是,上述使用到了数组下标的方法中,一旦输入的下标超过了数组的长度,方法都会报错,输入下标等于数组长度时,除了add(index,object)之外其他的函数也会报错。toString()也是一个很特殊的方法,学过class的读者可能知道,这个方法是可以重写的,也就是说我们可以自定义列表的输出格式。而且在输出列表时,如果我们用System.out.println(listname);的形式输出,java会自动输出列表的字符串形式,即自动调用toString()方法。具体的内容我会在介绍class时一并讲解。

和数组一样,数组列表也可以使用for-each循环,使用的方式也与数组大致相同,并且也不能使用for- each循环修改元素,只是for()括号中的int,double等数据类型均需要写为包装类。

例:遍历上文中声明的nums数组并输出数组内所有元素

for(Integer e = nums){
    System.out.print(e);
}

结果为246810。

以上是关于数组和数组列表的基础知识,在java的使用过程中,这两个数据类型都是十分重要的,因此掌握并熟练运用数组和列表也是java初学者的一个重要任务。

小结

写这篇文章的时候我思考了很久,最终还是考虑到篇幅的限制,将查找和排序放在了下一篇。这两个部分对于数组和列表来说是至关重要的,并且也是初学java的两个难度稍高的知识点,因此接下来我会花一到两篇文章来详细讲解关于这两个部分的知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值