Java学习_Day05

Java第5天学习内容:

数组(array)

一、数组的定义和使用
理解:数组是用来存储多个元素的容器。
特点:
1)数组是一种引用数据类型
2)同一数组中元素的数据类型是一致的
3)数组在堆内存中一旦被创建其长度就不可改变

数组的3种定义格式
	构造出的数组都存放在堆内存中
	1.数组的格式1(动态初始化-只告诉数组长度,数组的元素在具体应用中才知晓):
		数据类型[] 数组名=new 数据类型[长度值];
		
		//定义一个数组,存储5个int类型的元素
		int[] arrayA=new int[5];
		//定义一个数组,存储3个字符串的元素
		String[] arrayB=new String[3];
		//自定义一个数组,存储2个“萝卜”类型的元素
		萝卜[] arrayC=new 萝卜[2]; 
		
	2.数组的格式2(静态初始化-直接指定数组内的元素并且通过元素个数可知数组长度)
		数据类型[] 数组名=new 数据类型[]{元素1,元素2...};
		
		//定义一个数组,元素分别为 "张三","李四","王五"
		String[] arrayA=new String[]{"张三","李四","王五"};
		//定义一个数组,元素分别为 100,200,300
		int[] arrayB=new int[]{100,200,300};
	
	3.数组的格式3(简化的静态初始化-比较常用)
		数据类型[] 数组名={元素1,元素2...};
		
		//定义一个数组,元素分别为 "张三","李四","王五"
		String[] arrayA={"张三","李四","王五"};
		//定义一个数组,元素分别为 100,200,300
		int[] arrayB={100,200,300};

数组的元素访问
索引:
数组为每一个元素分配的了一个编号,这个编号专业术语叫做【索引】,索引从0开始。

	访问元素格式:数组名[索引]//同过这个索引访问到对应的元素
		
	int[] array=new int[]{100,200,300};
	System.out.println(array[0]); //100
	System.out.println(array[1]); //200
	System.out.println(array[2]); //300
	array[1]=500; //把500赋值给 1索引的元素
	System.out.println(array[0]); //100
	System.out.println(array[1]); //500
	System.out.println(array[2]); //300 

二、Java的内存分配
Java虚拟机把内存划分为5个区域(栈、堆、方法区、本地方法栈、寄存器)

我们重点了解3个数据存放区域
栈:存储局部变量(即在方法中的变量)
堆:new出来的数据(都存放在堆内存中)
堆内存中的数据有一些特点
* 都有地址值
* 都有默认值(在静态创建数组时也有一个默认值的过程,只不过快速的被你新定义的值覆盖了)
各种数据类型的默认值:
整数 0
浮点数 0.0
字符 ‘\u0000’ (字符的默认值在unicode编码中表示为:0000)
布尔 false
引用数据类型(比如String类型) null

  • 当没有引用指向堆内存中的数据时,堆内存中的数据就会变成垃圾,会被垃圾回收器(GC)在空闲时自动回收。

数组在内存中的分配:
堆内存的地址(0x666)
在这里插入图片描述多个数组的内存分配:
在这里插入图片描述数组之间的赋值-就是变量存储数组在堆内存中的地址
原理图:
在这里插入图片描述在这里插入图片描述

方法区:字节码(.class文件)的相关信息

数组的常见问题
	1.java.lang.ArrayIndexOutOfBoundsException  数组索引越界异常
		原因:索引超过了最小值或者最大值
	
	2.java.lang.NullPointerException	空指针异常
		原因:当一个变量的值为null时(这个变量没有引用任何堆内存中的数据)
			  而使用这个变量,就会出现空指针异常
			  在面向对象中如果一个对象为空,但通过这个对象引用该类的方法就会报空指针异常

获取数组的长度:数组名.length

(size 和 length都是长度的意思,size在list集合里面用,length多用数组里面(是数组的属性/方法)
size()方法:
List,Set和Map也有size()方法,所以准确说size()方法是针对集合而言,用来查看容器中有多少个元素。
length():
String提供length()方法来计算字符串的长度)
int[] array={1,2,3,4,5,6,7,8};
System.out.println(array.length); //8

三、数组的练习
1.遍历数组的元素

int[] array={100,200,300,400,500,600};
		//i表示数组的索引
		for(int i=0;i<array.length;i++){
			System.out.println(array[i]);
		}

2.求数组中元素的和(String类型的数组是不能求和的,最大值最小值也不能求)

	/*
	步骤:
		1)定义求和变量sum,默认(初始)为0
		2)遍历数组中的元素
		3)把元素和sum累加起来
	*/
	int[] array={1,2,3,4,5};

    //1) 定义求和变量
    int sum=0;
    //2) 遍历数组
    for (int i = 0; i < array.length; i++) {
        //3)把数组中的元素累加求和sum
        sum+=array[i];//通过索引实现把每个索引所对应的元素求和
    }
    System.out.println("元素的和为:"+sum);  

3.求出数组中的最大值和最小值

步骤:
1)假设数组中0索引的元素为最大值max
2)遍历其他的元素和max比较
3)把较大的值重新赋值max

int[] array={1,-2,3,8,4,5};
		//1)假设数组中0索引的元素为最大值max(或最小值min)
		int max=array[0];//通过索引实现把每个索引的元素赋值给变量max
		int min = array[0];
		
		//2)遍历其他的元素和max比较
		for(int i=1;i<array.length;i++){
			//3)把较大的值重新赋值max
			if(array[i]>max){
				max=array[i];
			}
		}
		//2)遍历其他的元素和min比较
		for(int i=1;i<array.length;i++){
			//3)把较大的值重新赋值min
			if(array[i]<min){
				min=array[i];
			}
		}
		
		//循环结束之后,max存储的就是最大值
		System.out.println("最大值为:"+max);
		//循环结束之后,max存储的就是最小值
		System.out.println("最小值为:"+min);

4.把一个数组中的元素翻转
核心思想是,从数组的两端向中间遍历

		/*
		步骤:
			1)定义开始和结束的索引
				int start=0; //开始索引
				int end=array.length-1; //结束索引
		
		2)从数组的两头往中间进行遍历
			循环条件:start<end
			每次循环之后:start++  ,  end--
		
		3)每次循环,需要对array[start]和array[end]进行互换
			采用第三方变量实现
	*/
	int[] array={1,2,3,4,5};
	
	//1) 2)从数组的两头往中间进行遍历
	for(int start=0,end=array.length-1;start<end;start++,end--){//for循环的条件,括号中必须有两个;
		//每次循环,需要对array[start]和array[end]进行互换
		//通过索引实现其对应的元素的互换
		int temp=array[start];
		array[start]=array[end];
		array[end]=temp;
	}
	
	//再对数组进行遍历,打印就是翻转后的元素
	for(int i=0;i<array.length;i++){
		System.out.println(array[i]);
	}

数组作为参数的内存图解:
在这里插入图片描述5.数组的合并(merge)

内存图解:
在这里插入图片描述

 public static void merge(){                                                                        
      int[] arrayA={1,3,4,5,53,534};  
	 int[] arrayB = {32,121,42,332}; 
                                                                                                                              
     System.out.println("数组A的长度为:"+arrayA.length);                                                                            
     System.out.println("数组B的长度为:"+arrayB.length);                                                                            
     System.out.println("------------------------------");                                                                    
     int[] arrayC = new int[arrayA.length+arrayB.length];//动态new一个数组C其长度为数组A和B的长度和                                            
                                                                                                                              
     for (int i = 0; i < arrayA.length; i++) {                                                                                
         arrayC[i] = arrayA[i];//通过索引把arrayA数组各索引所对应的元素赋值给arrayC数组各索引(arrayC数组从索引为0处存储接受赋值)                                   
     }                                                                                                                        
     for (int i = 0; i < arrayB.length; i++) {                                                                                
         arrayC[i+arrayA.length] = arrayB[i];//通过索引把arrayB数组各索引所对应的元素赋值给arrayC数组各索引(arrayC数组从索引为i+arrayA.length处存储接受arrayB的赋值)
     }                                                                                                                        
     System.out.println("数组C的长度为:"+arrayC.length+" 分别是:");                                                                    
     for (int i = 0; i < arrayC.length; i++) {                                                                                
         System.out.print(arrayC[i]+" ");//通过循环打印出数组索引所对应的元素                                                                  
     }                                                                                                                        
                                                                                                                              
 }                                                                                                                            

小练习
第一题:
在main方法中定义3个变量:int a = 50; int b = 30; int c = 80;
并依次完成以下要求:
定义方法getMin()利用三元运算符求出a、b、c中最小的数并打印到控制台上;

package com.exam;

/**
 * 通过三元运算符求出三个数的最小值
 */
public class ExamTest01 {
    public static void main(String[] args) {
        getMin();
    }
    public static void getMin(){
        int a = 50;
        int b = 30;
        int c = 80;
        int Min = (a<b?a:b)<c?(a<b?a:b):c;//通过三元运算符的嵌套应用判断3个数是最值
        System.out.println("最小值:"+Min);
    }
}

运行结果:

最小值:30

第二题:
定义一个swap(int[] array,int x,int y)方法 把array数组中x和y位置的元素互换位置。并在main方法中测试 (测试数组自己定义)

package com.exam;
import java.util.Scanner;
/*
把数组中指定位置的元素互换
 */
public class ExamTest02 {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6,7,8};
        Scanner input = new Scanner(System.in);
        String str;
        do{
            str = "";
            System.out.println("请输入x,y[0,"+(array.length-1)+"]");
            System.out.print("请输入x:");
            int x =input.nextInt();//得到键盘录入的数,将他储存在x变量中
            System.out.print("请输入y:");
            int y = input.nextInt();//得到键盘录入的数,将他储存在y变量中
            //逻辑判断语句不要全部写在同一条语句中,这样代码的可读性差,不易快速找出程序错误
            if(x<0 || x>=array.length){//x只能有一种情况所以用短路或
                System.out.println("数据x不合法,请重新输入:");

            }else if(y<0 || y>=array.length){//只能有一种情况所以用短路或
                System.out.println("数据y不合法,请重新输入:");

            }else {
                System.out.println("数据正确,结果如下:");
                swap(array,x,y);
                break;
            }
            str = "数据不合法";
        }while(str.equals("数据不合法"));
        System.out.println("\n再见!");

    }
    public static void swap(int[] array,int x,int y) {//一般是void类型的方法,其方法体中都有输出语句
        System.out.println("原数组");
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println("\n----------------");
        int temp = array[x];
        array[x] = array[y];
        array[y] = temp;
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }
}

运行结果:

请输入x,y[0,7]
请输入x:3
请输入y:6
数据正确,结果如下:
原数组
1 2 3 4 5 6 7 8 
----------------
1 2 3 7 5 6 4 8 
再见!

第三题:
定义五个方法分别求数组的最大值 ,最小值, 总和, 平均值
在主方法中定义数组{23,55,32,18,67,75,97,12,78,89}, 调用每个方法完成测试

package com.exam;
//定义五个方法分别求数组的最大值 ,最小值, 总和, 平均值
public class ExamTest03 {
    public static void main(String[] args) {
        int[] array = {23,55,32,18,67,75,97,12,78,89};

        getMax(array);
        getMin(array);
        getArraySum(array);
        arrayAvg(array);
    }

    //1.求数组元素的最大值
    public static void getMax(int[] array){
        int Max = array[0];
        for (int i = 0; i < array.length; i++) {
            if(array[i]>Max){
                Max = array[i];
            }
        }
        System.out.println("数组array中最大元素是:"+Max);
    }

    //2.求数组元素的最小值
    public static void getMin(int[] array){
        int Min = array[0];
        for (int i = 0; i < array.length; i++) {
            if(array[i]<Min){
                Min = array[i];
            }
        }
        System.out.println("数组array中最小元素是:"+Min);
    }

    //3.求数组元素的总和
    public static void getArraySum(int[] array){
        int sum = 0;
        for (int i = 0; i < array.length; i++) {
            sum += array[i];
        }
        System.out.println("数组array中元素的总和是:"+sum);
        return ;
    }

    //4.求数组中元素的平均值
    public static void arrayAvg(int[] array){
        int sum = 0;
        double avg;
        for (int i = 0; i < array.length; i++) {
            sum += array[i];
        }
        //两个int类型的数做运算得到的是int类型的结果,但结果不一定准确,需要把其中一个数值转为浮点类型
        avg = (double)sum/array.length;//把其中一个数值转为double类型,运算的结果也是double类型
        System.out.println("数组array的元素平均值是:"+avg);
    }

}

运行结果:

数组array中最大元素是:97
数组array中最小元素是:12
数组array中元素的总和是:546
数组array的元素平均值是:54.6

第四题:
定义一个方法printNum, 打印1-500(包含1和500)能同时被2,5,7整除的所有数 ,并统计满足条件的个数, 在主方法中调用此方法完成测试.

package com.exam;
/*
 打印1-500(包含1和500)能同时被2,5,7整除的所有数
 ,并统计满足条件的个数
 */
public class ExamTest04 {
    public static void main(String[] args) {
        test();
    }
    public static void test(){
        int count = 0;
        for (int i = 1; i <= 500; i++) {
            if(i%2==0 && i%5==0 && i%7==0){
                count++;
                System.out.println("符合条件的数有-->"+i);
            }
        }
        System.out.println("符合条件的数总共有:"+count+"个");
    }
}

运行结果:


符合条件的数有-->70
符合条件的数有-->140
符合条件的数有-->210
符合条件的数有-->280
符合条件的数有-->350
符合条件的数有-->420
符合条件的数有-->490
符合条件的数总共有:7个

第五题:
1.定义一个方法union(),传入两个数组,方法的功能是将两个数组的元素合并到一个新数组中, 并返回这个新数组
public static int[] union(int[] arr1, int[] arr2){
功能: 将两个数组的元素存入到一个新数组中并返回
}

package com.exam;
/*
数组的合并
 */
public class ExamTest05 {
    public static void main(String[] args) {
        int[] arr1 = {1,2,3,4,5};
        int[] arr2 = {6,7,8,9,10};

        union(arr1,arr2);

    }
    public static int[] union(int[] arr1,int[] arr2){

        int[] arr3 = new int[arr1.length+arr2.length];

        for (int i = 0; i < arr1.length; i++) {
            arr3[i] = arr1[i];
        }
        for (int i = 0; i < arr2.length; i++) {
            arr3[i+arr1.length] = arr2[i];
        }
        System.out.println("新数组的元素有:");
        for (int i = 0; i < arr3.length; i++) {
            System.out.print(+arr3[i]+" ");
        }
        return arr3;
    }
}

运行结果:

新数组的元素有:
1 2 3 4 5 6 7 8 9 10 

Java第六天学习内容链接:

https://blog.csdn.net/LJN951118/article/details/88832027

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值