博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java数组(初学者必看)
阅读量:4980 次
发布时间:2019-06-12

本文共 3961 字,大约阅读时间需要 13 分钟。

数组无论在哪种编程语言中都算是最重要的数据结构之一,同时不同语言的实现及处理也不尽相同。但凡写过一些程序的人都知道数组的价值及理解数组的重要性,与链表一道,数组成为了基本的数据结构。尽管Java提供了很棒的集合API和集合类如:ArrayList、HashMap,他们内部都是基于数组。如果你是来自于基于c或c++背景的程序员,那么你会发现一些关于数组的行为和如何在Java工作中的异同。最值得注意的是C中的数组与Java中的数组的边界检查,c编译器不检查如果程序访问无效的数组索引,而java如果程序尝试访问无效的数组索引的话jvm会抛出ArrayIndexOutOfBoundException。在这篇文章中,我们看看Java中的数组,包括原生类型和对象类型的数组,下面就介绍些有关Java数组及属性的知识点。

Java数组101

(译注:101指介绍某件事,读者不需要任何预备知识)

1)数组在Java中是一个对象,数组实例同样是使用new操作符创建的。Array.length指定了数组长度,例如:

1
2
3
4
int
[] intArray =
new
int
[
10
];
System.out.println(intArray.length)
 
Output:
10

 

Array.length 表示数组的容量,只要数组创建了,每一个索引被初始化为默认值。

2)数组索引起始为0,负数索引在Java中是无效的,会抛出ArrayIndexOutOfBoundException ,如果你尝试用无效的索引访问数组,这个无效的索引可能是一个负索引,或者是大于等于数组长度的索引。

3)数组存储在Java堆的连续内存空间,所以如果你创建一个大的索引,你可以有足够的堆空间直到抛出OutofmemoryError,因为请求的内存大小在连续的内存空间不可用。

4)数组一个固定长度 的数据结构,一旦声明,你不能改变数组的长度。

5)不同类型的数组有不同的类型,例如下面例子,intArray.getClass()不同于floatArray.getClass()

1
2
int
[] intArray =
new
int
[
10
];
float
[] floatArray =
new
float
[
10
];
1
6
)你不能存储
double
值在
int
数组中,否则导致编译错误。
1
2
int
[] intArray =
new
int
[
10
];
intArray[
5
]=
1.2
;
//compilation error

如果尝试在运行时做这个操作,那么Java抛出ArrayStoreException

7)在Java数组中可以有不同方式的创建方式,这里就是创建数组的例子:

1
2
3
4
int
[] intArray;  
//creating array without initializing or specifying size
int
intArray1[]; 
//another int[] reference variable can hold reference of an integer array
int
[] intArray2 =
new
int
[
10
];
//creating array by specifying size
int
[] intArray3 =
new
int
[]{
1
,
2
,
3
,
4
};
//creating and initializing array in same line.

你既可以选择在创建数组的时候初始化数组,也可以以后通过for循环初始化,中括号既可以在变量的前面也可以在变量后面。

第一种方法是方便的创建多个数组如:

int[] array1, array2

这里的array1和array2是整型数组,而第二种方法你需要放两次括号如:

int array1[], array2[]

尽管在风格上没有很多不同,我读“int[] ”叫int数组,这种写法更容易被理解。

8)如果没有明确的初始化数组元素,那么数组就会用默认的类型值初始化,例如假若没有初始化整型数组,元素都将默认值为0,没有初始化的boolean值是false,对象数组是null。

9)你可以通过使用[]操作符访问数组元素,因为数组索引起始于0,[0]返回第一个元素,[length-1]返回最后一个元素,for循环是一种迭代整个数组便捷方法。你可以使用for循环初始化整个数组、访问的每个索引或更新、获取数组元素。Java5同样提供了加强的for循环,数组自己管理索引,防止ArrayIndexOutOfBoundException,这里是一个迭代的例子:

传统的方式:

1
2
3
4
5
6
7
8
9
10
11
12
int
[] numbers =
new
int
[]{
10
,
20
,
30
,
40
,
50
};
 
for
(
int
i =
0
; i < numbers.length; i++) {
  
System.out.println(
"element at index "
+ i +
": "
+ numbers[i]);
}
 
Output:
element at index
0
:
10
element at index
1
:
20
element at index
2
:
30
element at index
3
:
40
element at index
4
:
50

 

加强的for循环

1
2
3
4
5
6
7
8
9
10
for
(
int
i: numbers){
   
System.out.println(i);
}
 
Output:
10
20
30
40
50

正如你看到的,加强的for循环不需要检查数组索引,如果你想逐个地访问所有的元素这是一种很好的方法,但是同时因为你不能访问索引,你就不能修改数组元素。

10)Java中数组可以轻易的转换成ArrayList。ArrayList一个基于索引的集合,它是作为数组的备选方案。ArrayList的优点是可以改变容量大小,只需要创建个更大的数组然后拷贝内容到新数组,但你不能改变数组的大小。

11)Java API同样提供了一些便捷方法通过java.utils.Arrays类去操作数组,通过使用Arrays你可以排序数组,你可以做二分搜索。

12)java.lang.System类提供了实用方法拷贝元素到另一个数组。在拷贝内容从一个数组到另一个数组的时候System.arrayCopy非常强大和灵活。你可以拷贝整个或子数组,具体看你的需求。

System.arraycoy语法:

1
public
static
void
arraycopy(Object src,
int
srcPos, Object dest,
int
destPos,
int
length)

如你所见,arraycopy允许我们指定索引和长度,能很灵活给你拷贝子数组和存储到需要的位置或目标数组。这里是一个例子,拷贝前三个元素到目标数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public
static
void
main(String args[]) {
        
int
[] source =
new
int
[]{
10
,
20
,
30
,
40
,
50
};
        
int
[] target =
new
int
[
5
];
 
        
System.out.println(
"Before copying"
);
        
for
(
int
i: target){
            
System.out.println(i);
        
}
 
        
System.arraycopy(source,
0
, target,
0
,
3
);
 
        
System.out.println(
"after copying"
);
        
for
(
int
i: target){
            
System.out.println(i);
        
}
    
}
Output:
Before copying
0
0
0
0
0
after copying
10
20
30
0
0

你可以看到拷贝之前所有元素是0,之后前三个元素被替换了。

13)Java同样支持多维数组,在表示2D和3D的时候非常有用,像行和列或矩阵。多维数组也是一个数组的数组,这里是创建多维数组的例子:

1
int
[][] multiArray =
new
int
[
2
][
3
];

这是数组有2行3列,或者说长度是2的数组中,它的每个元素里保存的是长度为3的数组,这里是初始化多维数组的例子:

1
2
3
int
[][] multiArray = {
{
1
,
2
,
3
},{
10
,
20
,
30
}};
System.out.println(multiArray[
0
].length);
System.out.println(multiArray[
1
].length);
1
 
1
 

14)数组是一种非常快的数据结构,如果你已经知道元素的长度,那么就应该使用数组而非ArrayList等数据结构。

以上就是所有关于数组的话题,如你所见,数组是一种非常强大的数据结构。

原文链接: 翻译: -

译文链接:

转载于:https://www.cnblogs.com/cuker919/p/4878513.html

你可能感兴趣的文章
boost::asio::ip::tcp实现网络通信的小例子
查看>>
ios开发——仿新版iBooks书本打开与关闭动画
查看>>
hibernate官方新手教程 (转载)
查看>>
myeclipse6.0下载及注冊码
查看>>
关于二进制补码
查看>>
UVa 11584 - Partitioning by Palindromes [动规]
查看>>
Indonesians Using Smartphones to Connect to the Internet
查看>>
bzoj 1646: [Usaco2007 Open]Catch That Cow 抓住那只牛【bfs】
查看>>
关于【最短路径】
查看>>
PostgreSQL10.5安装详细步骤(Win10)
查看>>
Linux运维正则表达式之awk
查看>>
SpringMVC拦截器实现:当用户访问网站资源时,监听session是否过期
查看>>
PHP导出数据到CSV文件
查看>>
POJ - 3693 Maximum repetition substring (后缀数组)
查看>>
Ghost Win10系统X64位和32位10041装机版下载
查看>>
App跳转至系统Settings
查看>>
RabbitMQ
查看>>
参数传递 引用传递 值传递 ref传递
查看>>
spring ehcache使用笔记
查看>>
【知识总结】多项式全家桶(三点五)(拆系数解决任意模数多项式卷积)
查看>>