java基础-数组和常用方法

数组初始化

一维:
数组在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,并不是ArrayListArraysArrayList和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.lengthdestIndex+length <= destArray.length
如果目标数组存在,不会重构,相当于替换部分元素
System.arraycopy(scores,0,newScores,2,8);
这里表示使用scores数组的[0,8)替换newScores数组的[2, 10)
在这里插入图片描述

  • 35
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值