理解引用数据类型

这篇博客介绍了Java中数组的深层次知识,包括地址赋值、数组复制与克隆、动态扩展数组的方法以及最佳实践。此外,还展示了如何计算数组最小值、处理评委打分的平均分问题以及数组元素反转的算法。内容涵盖了数组长度、数组操作以及简单的算法应用。
摘要由CSDN通过智能技术生成

今天认识到了数组更深层次的知识,很绕啊

brr=arr意思是将arr所代表的复杂类型数据的地址传递给brr变量,结果是brr和arr变量使用的是同一个复杂类型数据,不管是brr修改或者arr修改,实际上修改是同一个数据,会发现一个修改,另外一个也
同时发生变化

在这里插入图片描述
数组复制备份:注意这里不是地址值的复制,因为地址值的复制brr=arr,实际上两个变量引用的是同一个复杂类型数据

需要两个不同复杂类型数据,操作中不相互影响

使用循环作数组复制—克隆

扩展:实现一个可变长的数组【Java中要求数组的长度是确定,一旦定义则不允许修改】

/**
 * 用于实现数组长度的自动增长
 * @param arr 原始数组
 * @param pos 需要添加数据的位置
 * @param num 添加的数据
 * @return 添加数据后的数组,有可能长度已经发生变化
 */
public static int[] changeLength(int[] arr,int pos,int num){
   if(pos<arr.length){
     arr[pos]=num;
    return arr;
     }
 else{
	 int newLength=arr.length*2;
		 if(pos>=newLength)
		 newLength=pos+1;
	 int[] res=new int[newLength];
	 for(int i=0;i<arr.length;i++)
		 res[i]=arr[i];
		 res[pos]=num;
		 return res; }
 }
 

两种写法的比较:
方法1:优势在于避免频繁的值拷贝,但是有可能会有开辟出的没有用的空间
方法2:不要不断的进行变长,但是每次变长都会导致值拷贝的过程,所以比较浪费时间,优势在于用多少空间则开辟多少空间

提示:一般情况下最佳实践为合理的评估长度,最少减少增长次数

数组的操作

length为数组对象的属性成员,可以直接使用【数组名称.length】获取数组长度。但是由于序号是从0开始,所以最大下标值为length-1,否则ArrayIndexOutOfBoundsException表示数组下标越界

数组的长度一旦定义后,则不能改变。如果需要改变则需要重新创建数组

使用System类别所提供的arraycopy()方法 [面试题]
int[] arr1 = {1, 2, 3, 4, 5};int[] arr2 = new int[5];

System.arraycopy(arr1, 0, arr2, 0, arr1.length);参数含义为从arr1的第0个位置开始拷贝,拷贝到arr2的第0个位置开始,总共拷贝arr1.length个元素

Java.lang.System类的静态方法arraycopy(Object源数组,int起始下标,Object目标数组,int目标起始下标,int长度) 如果源数组数目超过目标数组边界会抛出IndexOutOfBoundsException异常

int[] arr={1,2,3,4,5};
int[] brr=new int[arr.length];
System.arraycopy(arr, 0, brr, 0, 3);
for(int temp:brr)
    System.out.println(temp);

练习题

获取某个数组中的最小值

public class A2 {
	public static void main(String[] args) {
		// 生成一个随机数的数组,长10
		int[] arr = new int[10];
		Random r = new Random();
		for (int i = 0; i < arr.length; i++)
			arr[i] = r.nextInt();
		System.out.println(arr);// [I@4e25154f 数组的直接输出格式
		for (int temp : arr) // 自定义输出数组中的每个元素
			System.out.print(temp + "\t");
		System.out.println(); // 实现下次输出从头开始输出
		int min = Integer.MAX_VALUE;
		for (int i = 0; i < arr.length; i++)
			if (arr[i] < min)
				min = arr[i];
		System.out.println(min);
	}
}

B哥去参加青年歌手大奖赛,有10个评委打分,(去掉一个最高一个最低)求平均分

public class A3 {
	public static void main(String[] args) {
		// 评委打分 0-10
		Scanner sc = new Scanner(System.in);
		double[] arr = new double[10];
		for (int i = 0; i < arr.length; i++)
			inputNum(arr, i, sc);
		for (double temp : arr)
			System.out.println(temp);
		// 获取最值
		double min = min(arr);
		double max = max(arr);
		// 按照业务规则定义算法实现
		double res = 0;
		for (double temp : arr)
			res += temp;
		res -= min;
		res -= max;
		res /= 8;
		System.out.println("平均分:" + res);
	}

	// 用于获取arr数组中的最大值
	public static double max(double[] arr) {
		double res = Double.MIN_VALUE;
		if (arr != null) {
			for (int i = 0; i < arr.length; i++) {
				if (arr[i] > res)
					res = arr[i];
			}
		}
		return res;
	}

	// 用于获取arr数组中的最小值
	public static double min(double[] arr) {
 double res = Double.MAX_VALUE;// 默认值为double类型的最大取值
 if (arr != null) // 用于避免NullPointerException
 for (int i = 0; i < arr.length; i++)
 if (arr[i] < res res = arr[i];
 return res;
 }

	// 用于实现用户键盘录入评分,arr存储数据的数组,index是第几个评分,sc键盘
	public static void inputNum(double[] arr, int index, Scanner sc) {
		while (true) {
			System.out.println("请打分:");
			String ss = sc.nextLine();
			try {
				double d = Double.parseDouble(ss);
				if (d >= 0 && d <= 10) {
					arr[index] = d;
					break;
				}
				System.out.println("输入的分数不合法!");
			} catch (Exception e) {
				System.out.println("输入数据格式不正确");
			}
		}
	}
}

将指定数组中的数组元素进行反转 【中软的机试题】,例如:{1,2,3,4,5} 反转{5,4,3,2,1}

int[] arr=new int[]{1,2,3,4,5};
  for(int i=0;i<arr.length/2;i++){
	 int temp=arr[i];
	 int pos2=arr.length-i-1;
	 arr[i]=arr[pos2];
	 arr[pos2]=temp;
}

求一个整形数组中元素的平均值,并统计其中大于和小于此平均值的元素个数

public class Demo12 {

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int ss=shuru(sc);
		int[] arr=new int[ss]; 
		for(int i=0;i<=ss-1;i++) {
			int shujv=shujv(sc,i);
			arr[i]= shujv;   
		}
		int x=pingjunzhi(arr);
		int y=bijiao(arr,x);
         System.out.println("这个长度为:"+ss+"的数组平均值为:"+x);
         System.out.println("其中大于平均值的有"+(arr.length-y-1)+"个,小于平均值的有"+y);
	}

	private static int shujv(Scanner x,int i) {
		int se=0;
		while(true) {
			System.out.println("请为数组输入第"+(i+1)+"个正整数数据");
			String sc=x.nextLine();
			try {
				se=Integer.parseInt(sc);
				if(se>0)
					break;
				System.out.println("请输入大于0的整数");
			} catch (Exception e) {
				System.out.println("请输入合法长度");
			}
		}
		return se;
	}

	public static int shuru(Scanner x) {
		int se=0;
		while(true) {
			System.out.println("请输入大于5的整数,以确定数组长度");
			String sc=x.nextLine();
			try {
				se=Integer.parseInt(sc);
				if(se>5)
					break;
				System.out.println("请输入大于10的整数");
			} catch (Exception e) {
				System.out.println("请输入合法长度");
			}
		}
		return se;
	}

	public static int bijiao(int[] arr ,int pingjunzhi) {
		int xiaoyu=0;
		for(int i=0;i<=arr.length-1;i++) {
			if(arr[i]<pingjunzhi) {
				xiaoyu++;
				continue;
			}
				
		}
		return xiaoyu;
	}

	public static int pingjunzhi(int []arr) {
		int x=0;
		for(int i=0;i<=arr.length-1;i++) {
			x+=arr[i];
		}
		  x=x/arr.length;
		return x;
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值