1.6 数组
- 数组特性:
- 一致性:数组保存类型相同的元素
- 有序性:数组中的元素是有序的,通过下标访问
- 不可变性:数组一旦初始化,长度不可变
数组创建
- 一维数组
- type[] arrayName;
- type[]与type是不同类型,type[]是引用类型,type可能是基本数据类型,也可能是引用类型
- type[]方法和属性
名称 返回值 clone() Object equals(Object obj) boolean getClass() Class<?> hashCode() int notify() void notify All() void toString() String wait() void wait(long timeout) void wait(long timeout,int nanos) void
- type arrayName[];
- type[] arrayName;
- 二维数组
- type[][] arrayName;
- type arrayName[][];
- 声明数组时不用规定数组长度
分配空间
- 使用new type[size]为数组分配连续的size空间
- 如果没有指定初始化值,系统默认分配null
- null==null是false,因为都是空值,两个空值不相等
- 如果没有指定初始化值,系统默认分配null
- 直接赋值进行初始化
- type[] a = new type[]{value1,value2,…}
- 注意:分配空间时不要即指定数组长度也为每个数组元素分配空间
- type[] a = {value1,value2,…}
- 使用这种方式,一定要同时声明和初始化数组,千万不要分开
- type[] a = new type[]{value1,value2,…}
- 不规则数组:
int arr[][] = new int[4][]; arr[0]=new int[2]; arr[1]=new int[1]; arr[2]=new int[3]; arr[3]=new int[4]; /* arr = { {s,s} {s} {s,s,s} {s,s,s,s} } 这种时候使用foreach遍历方法显得特别方便 */
获取数组元素
- 特殊for循环
//一维数组 for(type item:arrayName) { .... } //二维数组 for(type[] item:arrarName){ for(type value:item){ .... } }
Arrays工具类
- 均为静态方法
- 位于java.util内,使用时需要导入
静态方法
方法 | 说明 |
---|---|
int binarySearch(type[] a, type key) | 使用二分法查询key元素是否在数组内 |
int binarySearch(type[] a, int fromIndex, int toIndex, type key) | 指定二分查找的范围 |
type[] copyOf(type[] original, int length) | 复制original,新数组长度为length;如果 length 小于 original 数组的长度,则新数组就是原数组的前面 length 个元素,如果 length 大于 original 数组的长度,则新数组的前面元索就是原数组的所有元素,后面补充 0(数值类型)、false(布尔类型)或者 null(引用类型)。 |
type[] copyOfRange(type[] original, int from, int to) | 复制指定范围的元素 |
boolean equals(type[] a, type[] a2) | 判断两个元素是否相等 |
void fill(type[] a, type val) | 将a数组的所有元素赋值为val |
void fill(type[] a, int fromIndex, int toIndex, type val) | 将指定范围内的数组元素赋值为val |
void sort(type[] a) | 排序,使用的排序算法取决于数组的长度,详情请见 2.1 Arrays源码分析 |
void sort(type[] a, int fromIndex, int toIndex) | 指定排序范围 |
String toString(type[] a) | 将数组转换为字符串,使用","连接 |
- sort方法:
- 如果要实现自定义排序,数组类型要是包装类型,不能是基本数据类型。
- 排序类实现Comparator接口
main(){ Integer[] a = {}; Comparator cmp = new MyComparator(); Array.sort(a,cmp); } class MyComparator implements Comparator<Integer>{ @override public int compare(Integer o1,Integer o2){ return o1-o2; //如果结果是负数,则调转o1、o2顺序 } }
java8新增功能
方法 | 说明 |
---|---|
void parallelPrefix(xxx[] array, XxxBinaryOperator op) | op包括left、right两个形参,left代表数组中前一个索引处的元素,rught代表数组中当前索引处的元素,计算第一个新数组元素时,left默认是1 |
void parallelPrefix(xxx[] array, int fromIndex, int toIndex, XxxBinaryOperator op) | 与上一个方法相似,指定操作的区间 |
void setAll(xxx[] array, IntToXxxFunction generator) | 使用指定的生成器为所有数组设置值,该生成器可以控制数组元素的值的生成算法 |
void parallelSetAll(xxx[] array, IntToXxxFunction generator) | 与上一个方法相同,但可以进行并行运算,利用多CPU提高性能 |
void parallelSort(xxx[] a) | 增加并行能力 |
void parallelSort(xxx[] a,int fromIndex, int toIndex) | 指定排序范围 |
Spliterator.OfXxx spliterator(xxx[] array) | 将数组的所有元素转换成对应的Spliterator对象 |
Spliterator.OfXxx spliterator(xxx[] array, int startInclusive, int endExclusive) | 指定范围转换成Spliterator对象 |
XxxStream stream(xxx[] array) | 将数组转换成Stream |
XxxStream stream(xxx[] array, int startInclusive, int endExclusive) | 指定转换成Stream的范围 |
- 代码:
- void parallelPrefix():计算结果保留在当前元素位置
int[] s = {1,2,3,4,5}; Arrays.parallelPrefix(s,new IntBinaryOperator(){ public int applyAsInt(int left,int right){ return left+right; } }); System.out.println("s:"+Arrays.toString(s)); // 输出:[1,3,6,10,15]
数组与字符串的转换
- 字符串转换为数组
- 调用String类的toCharArray()方法
String s = "123abc"; char[] c = s.toCharString(); //c= 1,2,3,a,b,c
- String.split(regex)方法:使用regex作为分隔符分隔字符串
- 注意:如果使用“.”或者“|”作为分隔符,需要使用“\”
String s = "Iandamora!student!"; char[] c = s.split("and|or|!"); //c=I,am,a,student
- 数组转换为字符串
- 使用StringUtils,需要下载
- StringUtils.join(charAarray,regex):使用regex连接数组,regex默认是无
- 使用String.copyValueOf(char array)
char c = [1,2,3,4] String s = String.copyValueOf(c,'.') //s="1.2.3.4"
- 如果是StringBuffer类,可以直接使用StringBuffer的append方法
- 使用StringUtils,需要下载