一,数组的查找
1.线性查找
java
//案例:
int[] arr ={1,55,81,32,68,50,33};
int num =81;//需要查找的元素
for(int i=0;i<arr.length-1;i++){
if(num==arr[i]){
System.out.println("找到该元素了下标为:"+i);
break;
}
}
2.二分法查找
前提一定先排序,再查找
java
import java.util.Arrays;
public class Test01{
public static void main(String[] args){
int[] arr = {6,23,7,35,8,24};
//排序
Arrays.sort(arr);
int num =81;//需要查找的元素
int start =0;
int end = arr.length-1;
while(start <=end){
int mid = (start+end)/2;
if(num>arr[mid]){
start =mid+1;
}else if(num<arr[mid]){
end =mid-1;
}else{
System.out.println("找到该元素了,下标为:"+mid);
break;
}
}
}
}
二,数组的复制
复制1
html
String[] names = {"周杰伦";"陈奕迅";"林俊杰";"杨千嬅","王力宏"};
//新数组
String[] newNames =names;
//改变源数组的数据
names[1] ="马思唯";
//遍历新数组
for(String element : arr){
System.out.println(element);
}
//注意:复制后,改变源数组,新数组里的数据也会发生改变
复制2
html
//源数组
String[] names = {"周杰伦";"陈奕迅";"林俊杰";"杨千嬅","王力宏"};
//新数组
String[] newNames =new String[names.length];
//遍历源数组,将元素赋值给新数组
for(int i =0;i<names.length;i++){
newNames[i] =names[i];
}
//改变源数组的数据
names[1] ="马思唯";
//遍历新数组
for(String element : arr){
System.out.println(element);
}
//此时,改变源数组,新数组里面的数据也不会发生改变
三,数组的扩容
html
//需求:扩容后的长度是原来的1.5倍
//源数组:
String[] names = {"周杰伦","陈奕迅","林俊杰","吴亦凡"};
//获取数组长度
int oldCapacity = names.length;
//计算新数组长度
int newCapacity = oldCapacity+(oldCapacity>>1);//注意加小括号
//新数组 -[null,null,null,null,null,null]
String[] newNames = new String[newCapacity];
//遍历源数组,将数据赋值给新数组
for(int i =0;i<names.length;i++){
newNames[i] =names[i];
}
//将新数组的地址赋值给源数组
names= newNames;
//遍历数组
for(String element:names){
System.out.println(element);
}
四,数组的删除
删除1
html
//源数组
String[] names = {"陈奕迅","周杰伦","林俊杰","王力宏"};
//新数组
String[] newNames = new String[names.length-1];
//遍历源数组,将"周杰伦"以外的元素赋值到新数组中
int index =0;
for(String element:names){
if(!element.equals("周杰伦")){
newNames[index]=element;
index++;
}
}
//将新数组的引用赋值给源数组
names= newNames;
//遍历源数组
for(String element:names){
System.out.println(element);
}
缺点:这种方式删除的数组,会让数组的空间越变越小,数组是用来存储数据的,越变越小会使得存储数据不方便
删除2
html
//源数组
String[] names = {"陈奕迅","周杰伦","林俊杰","王力宏"};
//元素的迁移
for(int i =1;i<names.length-1;i++){
names[i] =names[i+1];
}
//将最后一个元素赋为null
names[names.length-1] =null;
//遍历源数组
for(String element:names){
System.out.pritnln(element);
}
五,数组作为方法的参数和返回值
html
//案例:设计一个方法,传入int类型的数组,返回最大值和最小值
public static void main(String[] args){
int[] arr={6,23,7,35,8,24};
int[] maxAndMin= getMaxAndMin(arr);
System.out.println("最大值为:"+maxAndMin[0]);
System.out.println("最小值为:"+maxAndMin[1]);
}
public static int[] getMaxAndMin(int[] arr){
int max = arr[0];
int min = arr[0];
for(int i=1;i< arr.length-1;i++){
if(max<arr[i]){
max=arr[i];
}
if(min>arr[i]){
min=arr[i];
}
}
int[] is = new int[]{max,min};
return is
}
小结:方法的返回值只能有一个;如果想返回多个数据,就可以将多个数据存入一个数组中。
六,可变参数
html
//案例:设计一个方法,传入n个int值,获取最大值并返回
public static void main(String[] args){
int max = getMax(new int[]{1,2,3,4,5,67,8});
System.out.println("最大值为:"+max);
}
public static int getMax(int[] arr){
int max = arr[0];//假设下标为0的数最大
for(int i=1;i<arr.length;i++){
if(max<arr[i]){
max = arr[i];
}
}
return max;
}
//方法二:可变参数
public static void main(String[] args){
int max = getMax(1,2,3,4,5,67,8);//实参作为元素压入到数组中
System.out.println("最大值为:"+max);
}
// int... arr就是数组
public static int getMax(int... arr){
int max = arr[0];//假设下标为0的数最大
for(int i=1;i<arr.length;i++){
if(max<arr[i]){
max = arr[i];
}
}
return max;
}
小结:可变参数就是数组;实参就是数组里的元素;可变参数后不能添加其他参数。
七,Arrays工具类
1.概念
Arrays是Java给我们提供专门操作数组的工具类
2.理解
1.工具类 -该类中所有的方法都是静态的,直接使用类名调用
2.API - Java提供类的使用说明书
html
int[] arr={18,20,81,35,58,99};
//排序
Arrays.sort(arr);
//查找下标(底层使用二分法去查找元素,所以必须先查找,再排序)
//返回值规则:如果搜素的元素不再数组中,返回(-插入点-1)
int index = Arrays.binarySearch(arr,81);
System.out.println("查找元素的下标为:"+index);
//拷贝数组(目标数组,新的长度)
int[] copyOf =Arrays.copyOf(arr,10);
//拷贝区间数组 (目标数组,开始下标-包含,结束下标-排他)
int[] copyOfRange = Arrays.copyOfRange(arr,1,7);
//替换元素
Arrays.fill(copyOfRange,666);
//替换区间元素 (目标数组 开始下标-包含 结束下标-排他 替换的值)
Arrays.fill(copyOfRange,2,5,888);
//将数组转换为字符串
String str = Arrays.toString(arr); //需要导包,已省略
System.out.println(str);