数组初始化
一维:
数组在new之后还是引用,赋值了才算初始化过程结束
double[] scores = new double[] {78, 45, 85, 97, 1};
这样也可以:(但是不能把声明和初始化分开)
double[] scores = {78, 45, 85, 97, 1};
二维:
声明:type array[][];或者type[][] array;
初始化:
int[][] temp = new int[][] {{1,2,3, 4},{3,4,5}};
这里是按行存入的,实际就是每个元素是一维数组的一个一维数组,所以下面这样访问不会抛出异常,最后输出是
1 2 3 4
3 4 5
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 4; j++) {
System.out.print(temp[i][j] + " ");
}
System.out.print("\n");
}
三维:每一个元素是二维数组的一维数组
String[][][] namelist={{{"张阳","李风","陈飞"},{"乐乐","飞飞","小曼"}},
{{"Jack","Kimi"},{"Lucy","Lily","Rose"}},
{{"徐璐璐","陈海"},{"李丽丽","陈海清"}}};
函数里传递的是引用,所以这样完全可以赋值
void assign(int[] a, int[] b) {
for (int i = 0; i < a.length; i++) {
a[i] = b[i];
}
}
获取控制台输入
import java.util.Scanner;
int[] prices = new int[5];
Scanner input = new Scanner(System.in);
for (int i = 0; i < prices.length; i++) {
System.out.println("请输入第" + (i+1) + "件商品的价格:");
prices[i] = input.nextInt();
}
数组填充
Arrays.fill(arrayName, value) //为数组填充一个统一的值
数组比较
Arrays.equals(arrayA, arrayB);
返回boolean,会比较对应位置的元素
数组去重复
- 字符串数组转ArrayList时注意
- 用HashSet给数组去重
String[] two = {"1","2","1","test","11"};
List<String> temp = new ArrayList<String>(Arrays.asList(two));
HashSet<String> hs = new HashSet<String>(temp);
temp.clear();
temp.addAll(hs);
for(String tmp:temp) {
System.out.println("*" + tmp + "*");
}
报错原因是,asList返回的是java.util.Arrays A r r a y L i s t ,并不是 A r r a y L i s t , A r r a y s ArrayList,并不是ArrayList,Arrays ArrayList,并不是ArrayList,ArraysArrayList和ArrayList都是继承AbstractList,remove、add等method在AbstractList中默认是throw UnsupportedOperationException而且不作任何操作。ArrayList重载了操作,而Arrays$ArrayList没有重载,所以报错。
数组排序
import java.util.Arrays;
Arrays.sort(数组名);
这里需要注意,Arrays.sort是就地排序的,如果下图这里令int[] temp = heights
,然后对
temp排序的话,heights也会被排序。大概相当于只赋值了地址吧。所以如果要保留heights的顺序,必须为temp开辟空间,然后排序temp。
数组二分查找
需要先对数组进行排序,然后Arrays.binarySearch(数组名,val)
如果 key 包含在数组中,则返回搜索值的索引;否则返回 -1 或“-插入点”。插入点指搜索键将要插入数组的位置,即第一个大于此键的元素索引。
这个插入点有点tricky,其实可以插入的位置包括[0, length+1],比如如果查找0,就会返回-1。
origin vals:
54 20 55 74 50 55 29 21 43 37
sorted vals:
20 21 29 37 43 50 54 55 55 74
where is 100? -11
也可以指定查找范围:
Arrays.binarySearch(Object[] a,int fromIndex,int toIndex,Object key);
数组复制
copyOf方法:复制指定长度
如果指定的长度比原数组长度更长,则用默认值填充,短的话就是实际长度。如果目标数组已经存在,那么会重构。
import java.util.Arrays;
// Arrays.copyOf()方法返回的是Object[],所以要强制转换
double[] newScores = (double[])Arrays.copyOf(scores, 8);
copyOfRange方法:复制指定范围
复制[start, end)这个范围。如果end大于数组实际长度,那么默认值填充。目标数组已存在,那么重构。
import java.util.Arrays;
int newScores[]=(int[])Arrays.copyOfRange(scores,0,5);
clone方法:不能指定范围,完全复制。重构。
int newScores[]=(int[])scores.clone();
arraycopy方法:从原数组中截取一段,替换到目标数组中
System.arraycopy(dataType[] srcArray,int srcIndex,dataType[] destArray,int destIndex,int length)
此方法要求srcIndex+length <= srcArray.length
且destIndex+length <= destArray.length
如果目标数组存在,不会重构,相当于替换部分元素
System.arraycopy(scores,0,newScores,2,8);
这里表示使用scores数组的[0,8)替换newScores数组的[2, 10)