java学习第七天

数组

1.数组的扩容

一个数组的工具类Arrays

1.1手动方法
  • 创建新数组
  • 把数组的值,按照其下标放到新数组中
  • 重新赋值
/*
 * 数组的扩容
 */
int[] arr2 = new int[3];
arr2[0] = 4;
arr2[1] = 6;
arr2[2] = 7;

//把arr2数组扩容为长度7

int[] newArr = new int[7];
for(int i=0; i<arr2.length; i++) {
  newArr[i] = arr2[i];
}
arr2 = newArr;
1.2Arrays.copyOf()

语法:

Arrays.copyOf(需要扩容的数组,目标长度)
/*
 * 数组的扩容
 */
int[] arr2 = new int[3];
arr2[0] = 4;
arr2[1] = 6;
arr2[2] = 7;

arr2 = Arrays.copyOf(arr2, 7);
1.3System.arraycopy()

语法:

System.arraycopy(原数组,原数组起始,新数组,新数组起始,长度)
/*
* System
* 	System.out.print()   在控制台打印
*  System.arraycopy(原数组,原数组起始,新数组,新数组起始,长度)。
* 
*/
int[] arr3 = new int[3]; // [41,6,77]
arr3[0] = 41;
arr3[1] = 6;
arr3[2] = 77;

//把arr3长度扩容7

int[] newArray = new int[7]; //[0,0,0,0,0,0,0]
System.arraycopy(arr3, 0, newArray, 5, 2);

2.数组的定义方式

//1. 首先定义时创建数组,然后逐个位置赋值
int[] arr = new int[3]; 
arr[0] = 8;
arr[1] = 24;
arr[2] = 16;
//2. 先声明,创建数组赋值给变量,然后逐个位置赋值
int[] arr2; //声明

arr2 = new int[3];  //初始化
//为每个位置赋值
arr2[0] = 8;
arr2[1] = 24;
arr2[2] = 16;
//3. 空数组,区别于null  长度为0
int[] arr3 = {};
/*
 * 4. 可以在定义数组时,确定数组的长度,以及每个位置的值
 */
int[] arr4= {1,4,2,6,8};

3.数组类型参数

  • 直接定义数组类型参数
public static 返回数据类型 方法名(数据类型[] 参数名){
  
}
  • 定义可变参数
    • 可变参数只能在参数列表的最后面
public static 返回数据类型  方法名(数据类型... 参数名){}
package com.qfedu;

public class Demo03 {
	public static void main(String[] args) {
		int[] arr= {1,2,3,4,22};
		int max = max2(arr);
		
		System.out.println(max);
		
		int max2 = max2(4,33,2,3,4,6,8,123,5647);
		System.out.println(max2);
		
	}
	//两个数最大值
	public static int max01(int a,int b) {
		int max=a>b?a:b;
		return max;
	}
	//三个数最大值
	public static int max02(int a,int b,int c) {
		int max=a>b?a:b;
		max=max>c?max:c;
		return max;
	}
	
	public static int max(int[] arr) {
		int max=arr[0];
		for (int i=1; i <arr.length; i++) {
			max = max>arr[i]?max:arr[i];
		}
		return max;
	}
	
	/*
	 * int... 可以在调用函数是直接在实参中填写,不需要重新定义数组
	 */
	public static int max2(int... arr) {
		int max=arr[0];
		for (int i=1; i <arr.length; i++) {
			max = max>arr[i]?max:arr[i];
		}
		return max;
	}	
}             

4.数组类型返回值

package com.qfedu;

import java.util.Arrays;

public class Demo04 {

	/*
	 * 参数1为整数数组,参数2为目标长度 使数组扩容 如果目标长度小于原数组长度则不分割也不扩容
	 */

	public static void main(String[] args) {
		int[] arr = { 1, 3, 6 };
		int[] newArr = copyOf(arr, 2);
		System.out.println(Arrays.toString(newArr));
	}

	public static int[] copyOf(int[] arr, int length) {
		if (arr.length < length) {
			int[] newArr = new int[length];
			for (int i = 0; i < arr.length; i++) {
				newArr[i] = arr[i];
			}
			return newArr;
		}
		return arr;

	}
}

5.数组的排序

  • 自己的算法
    • 冒泡排序
    • 选择排序
    • ………………
  • 使用工具类Arrays
5.1冒泡排序

从第一个位置开始,一直至倒数第二个元素,用前面的元素和后面的元素去比较,只要前面大于后面,就对换位置

每次都会确定一个位置的值,这种循环进行数组的长度减一次

package com.qfedu;

import java.util.Arrays;

public class Demo05 {

  public static void main(String[] args) {

    int[] arr = {3,5,2,7,6,1};

    System.out.println(Arrays.toString(arr));

    /*
	 * 从第一个位置开始,一直到倒数第二个元素,拿前面和后面的比较
	 * 只要前面的大于后面,就对换位置
	 *
	 */
    for(int i=0; i<arr.length-1-0; i++) {

      if(arr[i] > arr[i+1]) {
        int temp = arr[i];
        arr[i] = arr[i+1];
        arr[i+1] = temp;
      }

    }
    System.out.println(Arrays.toString(arr));

    for(int i=0; i<arr.length-1-1; i++) {

      if(arr[i] > arr[i+1]) {
        int temp = arr[i];
        arr[i] = arr[i+1];
        arr[i+1] = temp;
      }

    }
    System.out.println(Arrays.toString(arr));

    for(int i=0; i<arr.length-1-1-1; i++) {

      if(arr[i] > arr[i+1]) {
        int temp = arr[i];
        arr[i] = arr[i+1];
        arr[i+1] = temp;
      }
    }
    System.out.println(Arrays.toString(arr));
  }
}
package com.qfedu;

import java.util.Arrays;

public class Demo05_2 {

  public static void main(String[] args) {
    int[] arr = {3,5,2,7,6,1};

    //冒泡排序
    for(int i=0; i<arr.length-1; i++) { //循环(长度-1)次

      for(int j=0; j<arr.length-1-i; j++) {

        if(arr[j] < arr[j+1]) {
          int temp = arr[j];
          arr[j] = arr[j+1];
          arr[j+1] = temp;
        }
      }
    }

    System.out.println(Arrays.toString(arr));
    //使用冒泡排序法,对数组进行降序排序
  }
}
5.2选择排序

从第一个数开始,一直到结束,找到最小值的下标,然后第一个位置,和该下标的值,互换

从第二个数开始,一直到结束,找到最小值的下标,然后第二个位置,和该下标的值,互换

从第(length-1)个数开始,一直到结束,找到最小值的下标,然后第(length-1)个位置,和该下标的值,互换

package com.qfedu;

import java.util.Arrays;

public class Demo06 {

  public static void main(String[] args) {
    int[] arr = {3,5,2,7,6,1};
    //选择排序
    for(int i=0; i<arr.length-1; i++) { // i=0
      int minIndex = i;

      //确定从坐标i开始,到结束的最小值的下标
      for(int j=i+1; j<arr.length; j++) {// 获取i坐标后,左右的下标
        if(arr[j] < arr[minIndex]) {
          minIndex = j;
        }
      }

      //把i位置的值和minIndex下标的值互换
      int temp = arr[i];
      arr[i] = arr[minIndex];
      arr[minIndex] = temp;

    }

    System.out.println(Arrays.toString(arr));

    /*
		 * 使用选择排序   对数组进行降序排序
		 */
  }
}
5.3Arrays.sort排序
package com.qfedu;

import java.util.Arrays;

public class Demo07 {
  public static void main(String[] args) {
    int[] arr = { 3, 5, 2, 7, 9, 1 };

    /*
	 * sort方法排序
	 */
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr));
  }
}

6.值传递和引用传递

6.1局部变量

定义在方法中,或者方法的参数都是局部变量

  • 必须初始化才能使用
  • 局部变量都有作用范围
    • 作用范围就是离他最近的大括号,
  • 在相同的作用范围内不能定义名称相同的变量
    • 方法的参数也可以看作作用范围在该方法中的变量
    • for循环中定义的变量,可以看过作用范围再该循环内的变量
6.2变量的存储
  • 基本数据类型
    • 变量和值都是放在栈中
  • 引用数据类型
    • 变量在栈里
    • 数组在堆里
    • 栈中变量指向堆中的对象
6.3 方法的执行
  • 方法在执行的时候,jvm会为该方法在栈中分配内存的空间,保存方法在执行过程中定义的变量,或者运算的结果,方法一旦执行结束,这块内存区域就立马回收,里面所有的值都会被清空
  • 如果参数为基本类型,则在调用方法时,传递该参数的是值
    • 不会影响原变量的值
  • 如果参数为引用类型,则在调用方法时,参数传递的时堆中值的地址
    • 会影响原变量的值
package com.qfedu;

import java.util.Arrays;

public class Demo08 {
	public static void main(String[] args) {
		int n=8;
		changeNum(n);
		
		System.out.println(n);
		
		int[] arr= {1,2,3};
		changeArr(arr);
		System.out.println(Arrays.toString(arr));
	}
	
	public static void changeNum(int n) {
		n=7;
	}
	
	public static void changeArr(int[] arr) {
		arr[1]=66;
	}
}

7.二维数组

package com.qfedu;

public class Demo09 {

  public static void main(String[] args) {

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

    arr[0][0] = 6;
    arr[0][1] = 77;
    arr[0][2] = 55;

    //二维数组的循环
    for(int i=0; i<arr.length; i++) {
      int[] ar = arr[i];

      for(int j=0; j<ar.length; j++) {
        System.out.print(arr[i][j]+"\t");
      }

      System.out.println();
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值