Java数据结构-线性结构数组(Array)详解
2017-12-14 00:00
447 查看
摘要: 《Java常用算法》
《Java编程思想》
《疯狂Java讲义》
int[] a = new int[5]; //初始化为默认值,int型为0
int[] a = {1,2,3,4,5}; //初始化为给定值
int[][] a = new int[5][5];
int[][] a ={{2,3,4},{5,6,7},{8,9}}
1.动态初始化:数组定义与为数组分配空间和赋值的操作分开进行;
2.静态初始化:在定义数字的同时就为数组元素分配空间并赋值;
3.默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐士初始化
上面的是不允许的,而下面的这种方式却可以。
由于JVM泛型的擦除机制,在运行时JVM是不知道泛型信息的,所以可以给oa[1]赋上一个ArrayList<Integer>而不会出现ArrayStoreException,但是在取出数据的时候却要做一次类型转换,所以就会出现ClassCastException,如果可以进行泛型数组的声明,上面说的这种情况在编译期将不会出现任何的警告和错误,只有在运行时才会出错。而对泛型数组的声明进行限制,对于这样的情况,可以在编译期提示代码有类型安全问题,比没有任何提示要强很多。
基于以上的原因,Java不支持声明泛型数组,更确切地表达是:数组的类型不可以是类型变量,除非是采用通配符的方式,看下面这个例子:
![](https://static.oschina.net/uploads/space/2017/1214/173157_2lKK_2940767.png)
![](https://static.oschina.net/uploads/space/2017/1214/174434_o91k_2940767.png)
结果如下:
数据源
数据源从第几个索引开始
被修改数组
被修改数组从第几个索引开始
被修改数组开始往后修改几个元素
结果如下:
结果如下:
《Java编程思想》
《疯狂Java讲义》
一、概述
Java中的数组是一种聚合数据类型,是将具有相同类型的若干变量有序地组织在一起的集合。数组可以说是最基本的数据结构,在各种编程语言中都有对应。一个数组可以分解为多个数组元素,按照数据元素的类型,数组可以分为整型数组、字符串数组、浮点型数组、对象数组等。数组还可以分为一维、二维及多维等表现形式。二、数组的优点
数组的最大好处就是能都给存储进来的元素自动进行编号. 注意编号是从0开始。方便操作这些数据。三、数组格式及初始化
1、一维数组
int[] a; //声明,没有初始化int[] a = new int[5]; //初始化为默认值,int型为0
int[] a = {1,2,3,4,5}; //初始化为给定值
2、二维数组
int[][] a;int[][] a = new int[5][5];
int[][] a ={{2,3,4},{5,6,7},{8,9}}
1.动态初始化:数组定义与为数组分配空间和赋值的操作分开进行;
2.静态初始化:在定义数字的同时就为数组元素分配空间并赋值;
3.默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐士初始化
四、数据与泛型
Java 不支持泛型数组List<String>[] ls = new ArrayList<String>[10];
上面的是不允许的,而下面的这种方式却可以。
List<String>[] ls = new ArrayList[10];
由于JVM泛型的擦除机制,在运行时JVM是不知道泛型信息的,所以可以给oa[1]赋上一个ArrayList<Integer>而不会出现ArrayStoreException,但是在取出数据的时候却要做一次类型转换,所以就会出现ClassCastException,如果可以进行泛型数组的声明,上面说的这种情况在编译期将不会出现任何的警告和错误,只有在运行时才会出错。而对泛型数组的声明进行限制,对于这样的情况,可以在编译期提示代码有类型安全问题,比没有任何提示要强很多。
基于以上的原因,Java不支持声明泛型数组,更确切地表达是:数组的类型不可以是类型变量,除非是采用通配符的方式,看下面这个例子:
List<?>[] lsa = new List<?>[10];
五、数组内存描述
public class arraytest { public static void main(String[] args) { int[] s; s = new int[5]; for (int i = 0; i < 5; i++) { s[i] = i+1; } System.out.println(Arrays.toString(s)); } }
![](https://static.oschina.net/uploads/space/2017/1214/173157_2lKK_2940767.png)
![](https://static.oschina.net/uploads/space/2017/1214/174434_o91k_2940767.png)
六、Arrays使用功能
1、Arrays.fill()
Java标准类库Arrays有一个作用十分有限的fill()方法:只能用一个值填充各个位置,而针对对象而言,就是复制同一个引用进行填充。public class arraytest { public static void main(String[] args) { //###################数组fill介绍start###################// int[] a1 = new int[5]; System.out.println("原数据:"+Arrays.toString(a1)); Arrays.fill(a1,12); System.out.println("赋值数据:"+Arrays.toString(a1)); Arrays.fill(a1,1,4,15); System.out.println("索引赋值数据:"+Arrays.toString(a1)); //###################数组fill介绍end###################// } }
结果如下:
原数据:[0, 0, 0, 0, 0] 赋值数据:[12, 12, 12, 12, 12] 索引赋值数据:[12, 15, 15, 15, 12]
2、复制数组
Java标准类库提供有static方法System.arraycopy(),用它复制数组比用for循环复制要快很多。System.arraycopy()针对所有类型做了重载。参数描述:数据源
数据源从第几个索引开始
被修改数组
被修改数组从第几个索引开始
被修改数组开始往后修改几个元素
public class arraytest { public static void main(String[] args) { //###################数组复制介绍start###################// int[] a1 = new int[10]; int[] a2 = new int[10]; System.out.println("原数据:"+Arrays.toString(a1)); System.out.println("原数据:"+Arrays.toString(a1)); Arrays.fill(a1,20); Arrays.fill(a2,10); System.out.println("赋值数据:"+Arrays.toString(a1)); System.out.println("赋值数据:"+Arrays.toString(a1)); System.arraycopy(a2,2,a1,4,4); System.arraycopy(a1,2,a2,4,4); System.out.println("复制数据:"+Arrays.toString(a1)); System.out.println("复制数据:"+Arrays.toString(a2)); //###################数组复制介绍end###################// } }
结果如下:
原数据:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 原数据:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 赋值数据:[20, 20, 20, 20, 20, 20, 20, 20, 20, 20] 赋值数据:[20, 20, 20, 20, 20, 20, 20, 20, 20, 20] 复制数据:[20, 20, 20, 20, 10, 10, 10, 10, 20, 20] 复制数据:[10, 10, 10, 10, 20, 20, 10, 10, 10, 10]
3、数组比较
Arrays类提供了重载后的equals()方法,用来比较整个数组。同样,此方法针对所有基本类型与Object都做了重载。数组相等的条件是元素个数必须相等,并且对应位置的元素也相等,者可以通过对每一个元素使用equals()作为比较来判断。(例如对int类型使用Integer.equals()做比较)public class arraytest { public static void main(String[] args) { //###################数组比较介绍start###################// int[] a1 = new int[10]; int[] a2 = new int[10]; Arrays.fill(a1,10); Arrays.fill(a2,10); System.out.println(Arrays.equals(a1,a2)); a1[5] = 5; System.out.println(Arrays.equals(a1,a2)); String[] s1 = new String[5]; Arrays.fill(s1,"Hi"); String[] s2 = {new String("Hi"),new String("Hi"),new String("Hi"),new String("Hi"),new String("Hi")}; System.out.println(Arrays.equals(s1,s2)); //###################数组比较介绍end###################// } }
结果如下:
true false true
相关文章推荐
- 【数据结构】线性结构:栈&队列&数组
- 数据结构线性结构之连续存储---数组
- 数据结构之线性结构--数组
- 复习(数据结构:java):线性表(数组):泛型的写法
- 数据结构之数组Array实例详解
- 【郝斌数据结构自学笔记】57-59_递归8 _ 汉诺塔_1线性结构总复习 2线性结构和非线性结构关系 3栈队列链表数组之间的关系【重点】
- java数据结构--线性结构
- java.io中的read方法详解(尤其在数组流即在ByteArrayInputStream中)
- [精]JAVA数组的内存结构详解
- 07-数据结构_线性结构-连续存储-数组
- Java数据结构与算法—及实现 线性表 顺序表、链表、栈、队列详解
- 【Java数据结构学习笔记之一】线性表的存储结构及其代码实现
- 复习(数据结构:java):线性表(数组):迭代器
- java数据结构——Hash的实现(数组) 线性探测的方法解决冲突
- java数据结构--线性结构
- 数据结构实战——线性结构之静态数组表示法
- Java数据结构与算法之数据结构-逻辑结构-线性结构(9)------Java线性结构概念及其基本操作
- 数据结构实战——线性结构之动态数组表示法
- 复习(数据结构:java):线性表(数组):接口的写法
- 小白学数据结构——一、线性结构(数组&链表)