声明:该专栏本人重新过一遍java知识点时候的笔记汇总,主要是每天的知识点+题解,算是让自己巩固复习,也希望能给初学的朋友们一点帮助,大佬们不喜勿喷(抱拳了老铁!)
Java学习day04:数组
一、开发中为什么要有数组
声明一个变量,存储多个数据
二、在java中如何定义数组
1.第一种声明方式
数据类型[] 数组变量名字={值1,值2,值3......}
数据类型 数组变量名字[] ={值1,值2,值3......}
int arr[]={1,2,3,4}
2.第二种声明方式
数据类型[] 数组变量名字=new 数据类型[数组容量]
int[] arr=new int[3]
这种方式仅仅是声明了一个容器,里面还没有放值 ,此时部分类型具有默认值
int型的默认值是0 |
Boolean型的默认值是false |
string型的默认值是null |
char型的默认值是空格 |
3.第三种声明方式
数据类型[] 数组变量名字=new 数据类型 []{值1,值2,值3......}
int [] arr=new int[]{1,2,3,4}
三、如何给数组赋值
这里针对第二种声明方式,已经声明大小的数组
直接赋值,数组下标改动,注意点:1.数组下标从0开始、2.不能超出数组容量
int [] arr=new int[3]
注:一般开发中是不会用数组的,用集合,毕竟数组大小需要事先确定,这是个不可避免的缺点。但是集合的底层是数组
数组的输出
如果直接打印,实际打印的是数组内存地址 :System.out.print(arr);
利用一个方法arrays.tostring(数组名)转换一下就ok :System.out.print(Arrays.toString(arr));
注:特殊的,char型不需要转换,底层已经做了,本来就是单个字符串
四、数组的取值
1.用循环遍历
数组大小用数组名.length,这样即使数组大小改变也不影响
for(int i=0; i<arr.length;i++){
System.out.print(arr[i]);
}
char型和string型数组赋值练习
char[] arr1=new char[]{'a',98,'c'};
String[] arr2=new String[]{"asd","dasd","qrwe"};
for (int j = 0; j < arr1.length; j++) {
System.out.println(arr1[j]);
}
for (int j = 0; j < arr2.length; j++) {
System.out.println(arr2[j]);
}
五、二维数组(了解)
格式:int [][] arr=new int[2][3]
先行后列,这里就是一个两行三列的数组,此时赋值就是arr[0][0]=1;
二维数组只能用两个嵌套for循环进行遍历,不能再用tostring的方法了,tostring打印出来的还是内存地址
六、数组作为方法的参数
跟基本的方法定义是一样的,只是说,方法的形参变成了一个数组
public class Main {
public static void main(String[] args) {
int [] arr=new int[5];//1.声明一个空数组
Arr(arr);//2.调用Arr方法对数组赋值
System.out.println(Arrays.toString(arr));//3.输出数组
}
public static void Arr(int[] arr){
Scanner sc=new Scanner(System.in);
for (int i = 0; i < arr.length; i++) {
int j=sc.nextInt();
arr[i]=j;
对一个空数组进行赋值,可以用for循环持续输入
七、数组作为方法的返回值
用一个例题来体现:反转数组的值,比如本来是{1,2,3}就变成{3,2,1}
public class Main {
public static void main(String[] args) {
int [] arr={1,2,3,4};
int[] reversearr= reverse(arr);
System.out.println(Arrays.toString(reversearr));
}
public static int[] reverse(int[] arr){
//声明一个空数组来接收转换后的数据
int [] arr1=new int[arr.length];
//这里可以看到for循环的使用是可以有多个参数的
for (int i = 0, j=arr.length-1 ; i <arr.length ; i++, j--) {
arr1[j]=arr[i];//实现数据的反转存储
}
return arr1;
}
这里用了一个for,把一个数组的值进行反转,而在后面是可以用stringbuffer封装的reverse方法直接调用的
八、数组咋内存中是如何分配的(了解)
目前主要关注堆内存和栈内存
1.栈内存:
存储的是八大基本数据类型的数据
int a = 20; 这个存在了栈区
存储的是对象的引用 scanner 就是一个对象的等号的左边的
Scanner scanner = new Scanner(System.in);
2.堆区:
凡是new的 都存在堆区
int[] arr = new int[5];
arr存在了栈区 而 new int[5];存在了堆区
Scanner scanner = new Scanner(System.in);
scanner 存在了栈区, new Scanner(System.in); 在堆区
大家好好理解下面这幅图片:1、2、3步骤
3.各大内存区域及其作用
以上就是今天的知识点,下面做题:
九、习题
先说一个例题:大家自己先做
找出数组中最大值的索引下标,这里提供两种解法,可以对比一下做法,差距出在哪里,是哪里没有想到,
第一种差的:
public static int maxindex(int [] arr){
int num=0;
for (int i = 0; i < arr.length; i++) {
num=0;
for (int j = 0; j < arr.length; j++) {
if(arr[i]>=arr[j]){
num++;
}
}
if(num==arr.length){
num=i;
break;
}
}
return num;
}
第二种好的:
//求一个数组中的最大值的索引下标
public static int maxIndexOfArray (int[] arr) {
int maxIndex = 0;
/**
* i=0 0<4 true arr[0] <arr[0] false i++
* i=1 1<4 true arr[0] <arr[1] false i++ maxIndex=0
* i=2 2<4 true arr[0]<arr[2] true maxIndex=2 i+=
* i=3 3<4 true arr[2]<arr[3] false maxIndex=2 i++
* i=4 4<4 false 循环结束
*
*/
for (int i = 0; i < arr.length; i++) {
if (arr[maxIndex] < arr[i]) {
maxIndex = i;
}
}
return maxIndex;
}
}
1.题目
1.需求:定义一个方法,找出int数组中,最大值的索引下标 [1,2,23,5,6,7,8] 打印出来2
2.需求:定义一个方法,找出int数组中,最小值的索引下标
3.需求:定义一个方法,在指定的int数组中找出指定的数据第一个的下标,8这个数的下标
[1,2,8,4,5,78,7,8,9]4. 在一个数组中,找出所有的 指定数据的下标位置 找出数组中所有的8这个数的下标
[1,2,8,4,5,7,8,7,8,9]
5. 完成一个方法,替换掉数组中所有元素为0的元素,替换为指定元素 [1,2,3,0,0,0]
6. 完成一个方法,删除指定下标的元素,要求从删除位置开始,之后的元素整体前移。
[1,2,3,4,5,6,7]=>[1,2,4,5,6,7,0]
7. 完成一个方法,添加指定元素到指定下标位置,要求从指定下标位置之后的元素,整体向后移动。 [1,2,3,4,5,0]=>[1,2,250,3,4,5]8. 找出数组中最大的元素,放到下标为0的位置
9. 在上一道题的基础上,不考虑下标为0的元素。 找出数组中最大的元素,放到下标为1的位置
建议初学者都敲一敲,而且是不看我的答案,先自己敲,很多东西看着会,实际自己上手敲的时候往往会出错。另外题解肯定不止一个,我也只是记录其中一种,大家大可寻找更优解,同时我基本没写注释,希望大家还是多自己思考原因。
2.部分习题答案
//3.需求:定义一个方法,在指定的int数组中找出指定的数据第一个的下标 8这个数的下标
//[1,2,8,4,5,78,7,8,9]
public static int first8index(int[] arr){
int first8index=0;
for (int i = 0; i < arr.length; i++) {
if(arr[i]==8){
first8index=i;
break;
}
}
return first8index;
}
// 4. 在一个数组中,找出所有的 指定数据的下标位置 【难】
// 找出所有的下标存倒数组中
// 8这个数的下标
//[1,2,8,4,5,7,8,7,8,9]
public static int[] index(int[] arr){
int number=0;
for (int i = 0; i < arr.length; i++) {
if(arr[i]==8){
number++;
}
}
int[] index=new int[number];
int num=0;
for (int i = 0; i < arr.length; i++) {
if(arr[i]==8){
index[num]=i;
num++;
}
}
return index;
}
// 6. 完成一个方法,删除指定下标的元素,要求从删除位置开始,之后的元素整体前移。【难】
// [1,2,3,4,5,6,7]=>[1,2,4,5,6,7,0]
public static void deletearr(int[] arr){
int num=0;
for (int i = 0; i < arr.length; i++) {
if(arr[i]==3){
num=i;
}
}
for (int j = num; j <arr.length-1; j++) {
arr[j]=arr[j+1];
}
arr[arr.length-1]=0;
}
//8. 找出数组中最大的元素,放到下标为0的位置
public static int[] maxindex(int [] arr){
int maxindex=0;
for (int i = 0; i < arr.length; i++) {
if(arr[maxindex]<arr[i]){
maxindex=i;
}
}
int temp=0;
temp=arr[0];
arr[0]=arr[maxindex];
arr[maxindex]=temp;
return arr;
}