Java基础之数组(后附大量练习题)

1、Java数组

概念:Java语言中的数组是用来存储固定大小的同类型元素。

1.1声明数组

方式一:

数据类型[] 数组变量名字 = {1, 值2, 值3,......};
或者
数据类型 数组变量名字 []= {1, 值2, 值3,......};

实例:
int[] arr = {1, 2, 3, 5};

方式二:

数据类型[]  数组变量名字 = new 数据类型[容量]; 

只是确定了数组的容量,但是没有赋值
实例:
int[] arr = new int[4];

方式三:

数据类型[] 数组变量名字 = new 数据类型[]{1,2, 值3,.....};
是第一种的简写情况

实例:
int[] arr = new int[]{1, 2, 3, 5};

案例:

public class Demo1 {
	public static void main(String[] args) {
		//使用第一种方式声明数组
		//声明数组并赋值,这个数组里面存了三个值
		int[] arr = {12, 56, 89};
		float f1[] = {34.2f, 89.78f, 76.345f};
		char[] ch1 = {'中', 'a', '2'};
		boolean[] b1 = {false, true, false};
		String[] strs = {"学虎", "腾飞", "狗蛋"};
		
		//使用第二种声明方式
		//声明的这个数组的容量是3,就意味着可以存放3个数据
		//仅仅是声明了一个容器而已。里面还没有放值,但是会存放默认的值
		//如果是int  默认值就是0 [0, 0, 0]
		int[] arr1 = new int[3];
		boolean[] b2 = new boolean[2];//[false,false]
		String[] strs1 = new String[3];
		//[null, null, null]
		//第三种写法
		int[] arr2 = new int[] {34, 56, 7,8};		
	}
}
1.2 对第二种声明方式进行赋值
import java.util.Arrays;
public class Demo2 {
	public static void main(String[] args) {
		int[] arr = new int[3];//只能存3个元素
		//[0, 0, 0]
		//对空的容器进行赋值
		arr[0] = 12;//[12, 0,0]  将12赋值给下标为0的位置
		arr[1] = 13;//[12, 13, 0]
		//arr[2] = 14;//[12, 13, 14]
		//数组下标越界的
		//arr[3] = 78;
		
		//打印一下看看结果
		System.out.println(arr);//打印的是一个内存地址
		//内存地址对程序友好不?不优化,看不出来你的数据是个啥
		//咋办?有一个超纲的东西可以将内存地址转为字符串
		System.out.println(Arrays.toString(arr));
		
		//对一个String类型的数组进行赋值
		String[] strs1 =  new String[4];
		strs1[0] = "老邢";
		strs1[1] = "骚磊";
		strs1[3] = "老万";
		System.out.println(strs1);
		System.out.println(Arrays.toString(strs1));
		//对一个char 类型数组进行赋值
		//但是唯独char不需要toString
		char[] ch1 = new char[4];
		ch1[0] = 97;
		ch1[1] = 'z';
		ch1[3] = 'x';
		System.out.println(ch1);	
	}
}
1.3 对数组进行取值(利用for循环)
public class Demo3 {
	public static void main(String[] args) {
		int[] arr = {12, 78, 13, 89, 100,200};
		System.out.println(arr[0]);//下标为0的位置上的值
		System.out.println(arr[1]);
		System.out.println(arr[2]);
		System.out.println(arr[3]);
		System.out.println("=========");
		//发现一个特点,下标是有规律的,循环是专门出来重复或者有规律的
		for (int i = 0; i < 4; i++) {
			System.out.println(arr[i]);
		}
		System.out.println("-----------");
		//arr.length   arr的长度 【重点】
		
		System.out.println(arr.length);//6
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}
}
1.4 二维数组【了解】
import java.util.Arrays;

public class Demo5 {
	public static void main(String[] args) {
		
		//[1,2,3,4]
		//二维数组  行 列
		//[[1 , 2, 3],
		// [2, 4 , 5]]
		//int[] arr = new int[3];
		int[][] arr = new int[2][3];//总共6个
		arr[0][0] = 1;
		arr[0][1] = 2;
		arr[0][2] = 3;
		arr[1][0] = 2;
		arr[1][1] = 4;
		arr[1][2] = 5;
		System.out.println(arr);
		System.out.println(Arrays.toString(arr));
		//取值 使用循环
		for (int i = 0; i < 2; i++) {//行
			for (int j = 0; j < 3; j++) {
				System.out.println(arr[i][j]);
			}	
		}
	}
}
ps:想挑战一下的话可以做一下杨辉三角
1.5 数组可以当成一个方法的参数【重点】

方法的参数可以是八大基本数据类型和String,数据也可以作为方法的参数

语法格式

public static void 方法名字(数据类型[] 形参) {

}
import java.util.Arrays;
import java.util.Scanner;

public class Demo6 {
	public static void main(String[] args) {
//		int[] arr = {1,2,3,4};
//		printArr(arr);
		//声明空的数组,然后向里面存值
		int[] arr = new int[5];//1.声明了一个空的数组
		add(arr);//2.对这个空的数组赋值
		//代码走到这一步,arr这个数组有值了没?
		System.out.println(Arrays.toString(arr));//3.打印这数组有哪些数据
	}
	//遍历一个数组  打印数据
	public static void printArr (int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}
	//使用方法对一个空的数组进行赋值
	/**
	 * 
	 * @param arr  是一个空的数组, 对空的数组进行赋值
	 */
	public static void add (int[] arr) {
		Scanner scanner = new Scanner(System.in);
		for (int i = 0; i < arr.length; i++) {
			System.out.println("请输入第" + (i + 1) + "数");
			int i1 = scanner.nextInt();
			arr[i] = i1;
		}
	}

}
1.6数组可以当成一个方法的返回值
public  static 数据类型 方法名字 () {

}

八大基本数据类型和String都可以当成一个方法的返回值,数组也可以

import java.util.Arrays;

public class Demo7 {
	public static void main(String[] args) {
		int[] arr = reverse();
		System.out.println(Arrays.toString(arr));
	}
	//需求:将一个数组[1,2,3,4]转为[4,3,2,1]
	/**
	 * 
	 * 
	 * @return
	 */
	public static int[] reverse () {
		int[] arr = {1,2,3,4};//原数组
		//定义一个空的数组 用来接收反转以后的数据
		int[] arr1 = new int[arr.length];
		
		//表达式1 :int i = 0, j = 3
		//初始话条件 有两个
		//表达式2: i < arr1.length
		//表达式3:i++, j--  循环条件
		for (int i = 0, j = arr.length - 1; i < arr1.length; i++, j--) {
			arr1[j] = arr[i];
			//arr=[1,2,3,4]
			//arr1=[0,0,0,0]
//			arr1[3] = arr[0];//arr1[0,0,0,1]
//			arr1[2] = arr[1];//arr1[0,0,2,1]
//			arr1[1] = arr[2];//arr1[0,3,2,1]
//			arr1[0] = arr[3];//arr1[4,3,2,1]
		}
		return arr1;
	}

}
1.7数组在内存中如何分配

数组存储的两个内存:堆内存 和 栈内存

内存区域的名字 作用
寄存器 给CPU使用的,和开发没有关系
本地方法栈 JVM虚拟机操作咱们的电脑的系统的时候,才会使用
方法区 存储和运行的class文件
堆区 存储的是对象或者数组, 凡是new出来的都存在堆区
方法栈 方法运行的时候使用的内存,比如main方法会进入到方法栈区

栈:存储的是八大基本数据类型的数据

​ int a = 20; 这个存在了栈区

​ 存储的是对象的引用 scanner 就是一个对象的等号的左边的

​ Scanner scanner = new Scanner(System.in);

堆区:

​ 凡是new的 都存在堆区

​ int[] arr = new int[5];

​ arr存在了栈区 new int[5];存在了堆区

​ Scanner scanner = new Scanner(System.in);

​ scanner 存在了栈区, new Scanner(System.in); 在堆区

Java基础之数组(后附大量练习题)_第1张图片

2.练习题

1.需求:定义一个方法,找出一个int数组中的最大值的索引下标

[3,1,2,7,6]=> 最大值的索引下标是3

public class Demo8 {
	public static void main(String[] args) {
		int[] arr = {3, 2, 6, 1, 7};
		//找出一个int数组中最大值的索引下标
		int maxIndex = 0;//用来接收最大值的下标的
		/**
		 * i=0 0<4 true arr[0] 
		for (int i = 0; i < arr.length; i++) {
			if (arr[maxIndex] < arr[i]) {
				maxIndex = i;
			}
		}
		System.out.println(maxIndex);	
	}
}

2.需求:定义一个方法,找出int数组中,最小值的索引下标

public class Demo2 {
	public static void main(String[] args) {
		minIndexOfArrays();
	}
	public static void minIndexOfArrays() {
		int[] arr = {1,2,23,5,6,7,8};
		int minIndex = 0;
		for(int i = 0; i < arr.length; i++) {
			if(arr[minIndex] > arr[i]) {
				minIndex = i;
			}
		}
		System.out.println(minIndex);	
	}	
}

3.需求:定义一个方法,在指定的int数组中找出指定的数据第一个的下标
例如:[1,2,8,4,5,78,7,8,9] 8的下标

import java.util.Arrays;
import java.util.Scanner;

public class Demo3 {
	public static void main(String[] args) {
		//从数组中查找一个数
		findNum();
		//findNumToNewArrays();
		
		
	}

	public static void findNum() {
		int[] arr = {1,2,8,4,5,7,8,7,8,9};
		int index = 0;
		Scanner scanner = new Scanner(System.in);
		System.out.print("请输入你想查找的数:");
		int b = scanner.nextInt();
		for(int i = 0; i < arr.length; i++) {
			if(arr[i]==b) {
				index=i;
				break;
			}
		}
		System.out.println("该数的下标为"+index);
	}
	
	public static void findNumToNewArrays() {
		int[] arr = {1,2,8,4,5,7,8,7,8,9};
		Scanner scanner = new Scanner(System.in);
		System.out.print("请输入你想查找的数:");
		int b = scanner.nextInt();
		int j = 0;
		for(int i = 0; i < arr.length; i++) {
			if(arr[i] == b) {
				j++;
			}	
		}
		int[] arr2 = new int[j];
		for(int i = 0,k = 0 ; i < arr.length;i++) {
			if(arr[i] == b) {
				arr2[k] = i;
				k++;
			}
		}
		System.out.println(Arrays.toString(arr2));	
	}
}

4.在一个数组中,找出所有的指定数据的下标位置 【难】
找出所有的下标存到新数组中
例如:[1,2,8,4,5,7,8,7,8,9] 8的下标为 [2,6]

import java.util.Arrays;
import java.util.Scanner;

public class Demo3 {
	public static void main(String[] args) {
		//从数组中查找一个数
		//findNum();
		findNumToNewArrays();
		
	}

	public static void findNum() {
		int[] arr = {1,2,8,4,5,7,8,7,8,9};
		int index = 0;
		Scanner scanner = new Scanner(System.in);
		System.out.print("请输入你想查找的数:");
		int b = scanner.nextInt();
		for(int i = 0; i < arr.length; i++) {
			if(arr[i]==b) {
				index=i;
				break;
			}
		}
		System.out.println("该数的下标为"+index);
	}
	
	public static void findNumToNewArrays() {
		int[] arr = {1,2,8,4,5,7,8,7,8,9};
		Scanner scanner = new Scanner(System.in);
		System.out.print("请输入你想查找的数:");
		int b = scanner.nextInt();
		int j = 0;
		for(int i = 0; i < arr.length; i++) {
			if(arr[i] == b) {
				j++;
			}	
		}
		int[] arr2 = new int[j];
		for(int i = 0,k = 0 ; i < arr.length;i++) {
			if(arr[i] == b) {
				arr2[k] = i;
				k++;
			}
		}
		System.out.println(Arrays.toString(arr2));	
	}
}
  1. 完成一个方法,替换掉数组中所有元素为0的元素,替换为指定元素 [1,2,3,0,0,0]
import java.util.Arrays;
import java.util.Scanner;

public class Demo4 {
	public static void main(String[] args) {
		replace0();
		
	}
	public static void replace0() {
		int[] arr1 = {1,2,3,0,0,0};
		Scanner scanner = new Scanner(System.in);
		
		for(int i = 0; i < arr1.length; i++) {
			if(arr1[i] == 0) {
				System.out.print("请输入你要更改的数据:");
				arr1[i] = scanner.nextInt();	
			}
		}
		System.out.println("替换后的数组为:"+Arrays.toString(arr1));
	}
}

6.完成一个方法,删除指定下标的元素,要求从删除位置开始,之后的元素整体前移。【难】

例如:[1,2,3,4,5,6,7]=>[1,2,4,5,6,7,0]

import java.util.Arrays;
import java.util.Scanner;

public class Demo5 {
	/**
	 * 完成一个方法,删除指定下标的元素,要求从删除位置开始,之后的元素整体前移。【难】
	 *	[1,2,3,4,5,6,7]=>[1,2,4,5,6,7,0]
	 * 
	 * */
	public static void main(String[] args) {
		delIndex();
	}
	
	public static void delIndex() {
		int [] arr1 = {1,2,3,4,5,6,7};
		Scanner scanner = new Scanner (System.in);
		System.out.print("请输入你要删除的下标:");
		int index = scanner.nextInt();
		int temp = 0;
		for(int i = 0; i < arr1.length; i++ ) {
			if(i>=index && i< arr1.length-1) { 
				temp =  arr1[i+1]; 
				arr1[i] = temp;
			}	
	}
		arr1[arr1.length-1] =0;	
		System.out.println(Arrays.toString(arr1));
	}
}
  1. 完成一个方法,添加指定元素到指定下标位置,要求从指定下标位置之后的元素,整体向后移动。【难】
    [1,2,3,4,5,0]=>[1,2,250,3,4,5]
import java.util.Arrays;
import java.util.Scanner;

/**
 * 完成一个方法,添加指定元素到指定下标位置,要求从指定下标位置之后的元素,整体向后移动。【难】
 *	[1,2,3,4,5,0]=>[1,2,250,3,4,5]
 * 
 * */
public class Demo6 {
	public static void main(String[] args) {
		addNum ();
	}
	public static void addNum () {
		int[] arr = {1,2,3,4,5,0};
		Scanner scanner = new Scanner(System.in);
		System.out.print("请输入你要添加的元素:");
		int num = scanner.nextInt();
		System.out.print("请输入你要添加的下标:");
		int index = scanner.nextInt();
		for (int i = arr.length-1; i > index; i-- ) {
			arr[i] = arr[i-1];
			}
		arr[index] = num;		
		System.out.println(Arrays.toString(arr));
		
	}
}

8.找出数组中最大的元素,放到下标为0的位置

import java.util.Arrays;

public class Demo7 {
	public static void main(String[] args) {
		findMax();
	}
	public static void findMax() {
		int[] arr = {1,2,3,4,8,0,6,7};
		int max = 0;
		int j = 0;
		for(int i = 0; i < arr.length; i++) {
			if(arr[i] > max) {
				max = arr[i];
				j = i;
			}
		}
		arr[j] = arr[0];
		arr[0] = max;
		System.out.println(Arrays.toString(arr));
	}
}

9.在上一道题的基础上,不考虑下标为0的元素。
找出数组中最大的元素,放到下标为1的位置

import java.util.Arrays;
public class Demo8 {
	public static void main(String[] args) {
		int[] arr = {1,2,3,4,8,0,6,7};
		int max = 0;
		int j = 0;
		for(int i = 0; i < arr.length; i++) {
			if(arr[i] > max) {
				max = arr[i];
				j = i;
			}
		}
		arr[j] = arr[0];
		arr[0] = max;
		int second = 0 ;
		int m = 0;
		for(int i = 1; i<arr.length; i++) {
			if(arr[i] > second) {
				second = arr[i];
				m = i;
			}
			arr[m] = arr[1];
			arr[1] = second ;
		}
		System.out.println(Arrays.toString(arr));	
	}	
}
> import java.util.Arrays;
> public class Demo8 {
> 	public static void main(String[] args) {
> 		int[] arr = {1,2,3,4,8,0,6,7};
> 		int max = 0;
> 		int j = 0;
> 		for(int i = 0; i < arr.length; i++) {
> 			if(arr[i] > max) {
> 				max = arr[i];
> 				j = i;
> 			}
> 		}
> 		arr[j] = arr[0];
> 		arr[0] = max;
> 		int second = 0 ;
> 		int m = 0;
> 		for(int i = 1; i<arr.length; i++) {
> 			if(arr[i] > second) {
> 				second = arr[i];
> 				m = i;
> 			}
> 			arr[m] = arr[1];
> 			arr[1] = second ;
> 		}
> 		System.out.println(Arrays.toString(arr));	
> 	}	
> }
> ```
>
> 

你可能感兴趣的:(Java基础,小白必刷练习题,java入门,java,数据结构,算法)