数组的长度时固定的,集合的长度是可变的,
数组用来存放基本类型数据,集合用来存放对象的引用,
常用的集合有List集合、Set集合和Map集合,其中List与Set继承了Collection接口,各接口还提供了不同的实现类。
数组的初始化
大致分为两种:静态初始化,动态初始化
- 动态初始化格式:
数据类型 [ ] 数组名称 = new 数据类型[数组长度] - 静态初始化格式:
数据类型 [ ] 数组名称 = new 数据类型[ ]{元素1,元素2,元素3…} - 静态初始化省略格式:
数据类型 [ ] 数组名称 = {元素1,元素2,元素3…}
其中,数据类型可以是8种基本的数据类型,也可以是引用数据类型。
数据类型 | 默认初始化 |
---|---|
byte、short、int、long | 0 |
foat、double | 0.0 |
char | 一个空字符,即 ‘\u0000’ |
boolean | false |
引用数据类型 | null,表示变量不引用任何对象 |
注意:
通过数组下标索取来取得元素,下标默认从0开始。数组下标超出数组长度,数组越界异常(运行时异常)。
数组属于引用数据类型,在使用之前一定要开辟空间(实例化),否则就会产生”NullPoninterException”。
同一块堆内存空间可以被不同的栈内存所指向。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19public class Study02{
public static void main(String[] args){
int[] arr = new null;
int[] temp = null; // 声明对象
arr = new int[3]; // 开辟一个长度为3的数组
System.out.println(arr.length);
arr[0] = 1; // 数组第一个元素
arr[1] = 2; // 数组第二个元素
arr[2] = 3; // 数组第三个元素
for(int i = 0; i < arr.length; i++)
{
//通过循环控制索引下标更改
System.out.println(arr[i]);
}
temp = arr; // 发生引用传递,不能出现[]
temp[0] = 55; // 修改数据
System.out.println(arr[0]);
}
}
数组的遍历
通常可以使用for循环。在不需要对数组进行操作的情况下,使用foreach语句会更简单。
1 | // type:数据类型; var:变量名; iterable:数组的变量名 |
数组元素替换
可通过Arrays类的静态方法fill()来对数组中的元素进行替换。该方法通过各种重载形式可完成对任意类型的数组元素的替换。fill()方法有两种参数类型。
fill(int[ ]a,int value)
该方法可将指定的int值分配给int型数组的每一个元素
1
2
3
4
5
6
7public static void main(String[] args) {
int[]arr=new int[5];
Arrays.fill(arr, 6);
for (int i = 0; i < arr.length; i++) {
System.out.println("第"+i+"个元素是:"+arr[i]);
}
}输出:
1
2
3
4
5第0个元素是:6
第1个元素是:6
第2个元素是:6
第3个元素是:6
第4个元素是:6fill(int []a, int fromIndex, int toIndex, int val)
该方法将指定的int值分配给int型数组指定范围中的每个元素。填充的范围从索引fromIndex(包括)一直到索引toIndex(不包括)。如果fromIndex==toIndex,则填充范围为空。
1
2
3
4
5
6
7public static void main(String[] args) {
int arr[]=new int[]{1,2,3,4};
Arrays.fill(arr, 1, 2, 5);
for (int i = 0; i < arr.length; i++) {
System.out.println("第"+i+"个元素是"+arr[i]);
}
}输出:
1
2
3
4第0个元素是1
第1个元素是5
第2个元素是3
第3个元素是4如果指定的索引位置大于或等于要进行填充的数组的长度,则会报ArrayIndexOutOfBoundsException(数组越界异常)异常。
数组排序
通过Arrays类的静态sort()方法可以实现对数组的排序。sort方法提供了多种重载形式,可对任意类型的数组进行升序排序。
1 | public static void main(String[] args) { |
复制数组
Arrays类的copyOf()方法与copyOfRange()方法可以实现对数组的复制。
copyOf()方法是复制数组至指定长度。copyOfRange()方法是将指定数组的指定长度复制到一个新数组中。
copyOf()
该方法提供了多种重载形式,用于满足不同类型数组的复制
1
2
3
4
5
6
7public static void main(String[] args) {
int arr[]=new int[] {1,2,3};
int newArr[]=Arrays.copyOf(arr, 5);
for (int i = 0; i < newArr.length; i++) {
System.out.println(newArr[i]);
}
}输出:
1
2
3
4
51
2
3
0
0copyOfRange()
多种重载
1
2
3
4
5
6
7public static void main(String[] args) {
int arr[]=new int[] {1,2,3,4,5,6};
int newArr[]=Arrays.copyOfRange(arr, 0, 3);
for (int i = 0; i < newArr.length; i++) {
System.out.println(newArr[i]);
}
}
数组查询(搜索)
Arrays类的binarySearch()方法,可使用二分搜索法来搜索指定数组 ,以获得指定对象。该方法返回要搜索元素的索引值。binarySearch()方法提供了多种重载形式,用于满足各种类型数组的查找需要。binarySearch()方法有两种参数类型。
binarySearch(Object [ ],Object key)
1
2
3
4
5
6public static void main(String[] args) {
int arr[]=new int[] {4,25,10};
Arrays.sort(arr); // 注意此处进行了排序操作
int index=Arrays.binarySearch(arr, 0,1,8);
System.out.println(index);
}输出:
1
-2
上面的代码中变量index的值是元素8在数组arr中索引在0~1内的索引位置。由于在指定的范围内并不存在元素8,index的值是“-”(插入点)。如果对数组进行排序,元素8应该在25的前面,因此插入点应是元素25的索引值2,所以index的值是-2。
如果数组中的所有元素都小于指定的键,则为arr.length。
必须在进行此调用之前对数组进行排序(通过sort()方法)。如果没有对数组进行排序,则结果是不确定的。如果数组包含多个带有指定索引值的元素,则无法保证找到的是哪一个。
binarySearch(Object [ ],int fromIndex,int toIndex,Object key)
该方法在指定的范围内检索某一元素。
1
2
3
4
5
6public static void main(String[] args) {
String str[]=new String[] {"ab","cd","ef","yz"};
Arrays.sort(str);
int index=Arrays.binarySearch(str, "cd");
System.out.println("cd的索引位置是:"+index);
}输出:
1
cd的索引位置是:1
在使用此方法之前同样对数组进行排序,来获取准确的索引值。如果要搜索的元素key在指定的范围内,则返回搜索键的索引;否则返回-1或“-”(插入点)。如果范围中的所有元素都小于指定的键,则为toIndex。
如果指定的范围大于或等于数组的长度,则会报出ArrayIndexOutOfBoundsException异常。
向数组添加元素
一般数组是不能添加元素的,因为他们在初始化时就已定好长度了,不能改变长度。
声明为ArrayList
定义一个ArrayList数组,然后用add(element)方法往里添加元素即可,还可add(index,element)往指定下标处添加元素。
1
List<Integer> list=new ArrayList<Integer>();
先把array转化为list,用list的add()方法添加元素,再把list转化为array
这儿会有一个陷阱盲区,在把array转化为list的过程中,使用的asList()方法会返回一个final的,固定长度的ArrayList类,并不是java.util.ArrayList,直接这样利用它进行add()或remove()是无效的。
1
2
3List<Integer> list=new ArrayList<Integer>();
list=Arrays.asList(sz);
list.add(5);这里应该在定义list的时候就直接对array进行转化,代码如下:
(注意这儿Array类型是包装类,若是一般数据类型记得转化)1
2
3
4
5
6Integer []sz={3,2};
List<Integer> list=new ArrayList(Arrays.asList(sz));//**须定义时就进行转化**
list.add(1,5);
Integer[] nsz=new Integer[list.size()];
list.toArray(nsz);
System.out.println(Arrays.toString(nsz));使用上面所说的copyOf()方法,新元素的大小为旧元素的大小+1,再在新元素里添加即可。