Java数组(初学者必看)
数组无论在哪种编程语言中都算是最重要的数据结构之一,同时不同语言的实现及处理也不尽相同。但凡写过一些程序的人都知道数组的价值及理解数组的重要性,与链表一道,数组成为了基本的数据结构。尽管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等数据结构。
以上就是所有关于数组的话题,如你所见,数组是一种非常强大的数据结构。
原文链接: javarevisited 翻译: ImportNew.com- 刘志军
译文链接: http://www.importnew.com/7127.html
Java数组(初学者必看)的更多相关文章
- java初学者必看之构造方法详细解读
java初学者必看之构造方法详细解读 构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法. 格式 public 类名称(参数类型 参数名称){ 方法体 } 注 ...
- 15个初学者必看的基础SQL查询语句
本文由码农网 – 小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 本文将分享15个初学者必看的基础SQL查询语句,都很基础,但是你不一定都会,所以好好看看吧. 1.创建表和数据插 ...
- mysql进阶(二十六)MySQL 索引类型(初学者必看)
mysql进阶(二十六)MySQL 索引类型(初学者必看) 索引是快速搜索的关键.MySQL 索引的建立对于 MySQL 的高效运行是很重要的.下面介绍几种常见的 MySQL 索引类型. 在数 ...
- web前端开发初学者必看的学习路线(附思维导图)
很多同学想学习WEB前端开发,虽然互联网有很多的教程.网站.书籍,可是却又不知从何开始如何选取.看完网友高等游民白乌鸦无私分享的原标题为<写给同事的前端学习路线>这篇文章,相信你会有所收获 ...
- java初学者必看经典
配置java环境变量: JAVA_HOME:配置JDK的目录 CLASSPATH:指定到哪里去找运行时需要用到的类代码(字节码) PATH:指定可执行程序的位置 LINUX系统(在" .ba ...
- java初学者必看的学习路线
不管在编程语言的排行榜中,还是在大多数企业应用的广泛程度来看,Java一直都是当之无愧的榜首.Java语言有着独特的魅力吸引着广大的年轻人去学习,每个人学习的方式方法不一样. 第一步:首先要做好学习前 ...
- JavaScript初学者必看“this”
译者按: JavaScript的this和Java等面向对象语言中的this大不一样,bind().call()和apply()函数更是将this的灵活度进一步延伸. 原文: JavaScript: ...
- Activity初步,初学者必看
Activity是什么? Activity是一个可与用户交互并呈现组件的视图.通俗说就是运行的程序当前的这个显示界面. 如果你还不明白,那么你写过HTML吗,它就好比一个网页.我们程序中的用户视图,都 ...
- Python初学者必看(1)
python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...
随机推荐
- A20的板子笔记
除了串口可以登入控制台,还可以用SSH2. ftp连接的时候要打开 vi /usr/sbin/stupid-ftpd.conf 修改端口,修改完端口,登入的时候root的密码跟以前不一样,可以从st ...
- 使用 html5 postMessage 实现跨域
英文原文 中文翻译 因为web的安全机制,浏览器的同源策略.在不同域之间做数据交换就会涉及到跨域.A域如果要实现向B域发关消息,多多少少要有对B域有一定控制权,最起码人家B域要接收你的消息啊. 最近发 ...
- wflag
http://stackoverflow.com/questions/41312622/how-to-echo-an-alert-in-php-a-string-some-confusion-with ...
- Swapping
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION Referring back to Fig ...
- max_allowed_packet
http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_in SELECT val1 FROM tbl1 W ...
- EF的表连接方法Include()
在EF中表连接常用的有Join()和Include(),两者都可以实现两张表的连接,但又有所不同. 例如有个唱片表Album(AlbumId,Name,CreateDate,GenreId),表中含外 ...
- yii2高级版账号密码问题
yii2高级版默认后台没有密码,生成账号密码步骤: 1. CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` ...
- Bluetooth RFCOMM介绍
目录 1. 介绍 2. 服务概述 2.1 RS-232控制信号 2.2 Null Modem Emulation 2.3 多串口仿真 3. 服务接口描述 4. RFCOMM帧类型 5. RFCOMM帧 ...
- angularJS的$watch和$apply
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- HTML-001-日期组件 layDate 演示
在日常的网页开发过程中,日期组件已经成为不可或缺的组件之一.同时,随着广大杰出攻城狮的不懈努力,也出现了很多优秀的日期组件,其中我个人觉得 layDate 日期组件是一个非常不错的组件,简洁易用,样式 ...