javaEE学习记录Day07

Day07

数组

(这一天学的是一维数组)

1.数组的说明

为什么使用数组?方便处理批量相同类型的数据

数组的概念:一组连续的存储空间,存储多个相同的数据类型的值。

数组声明:数据类型[ ] 数组名;

数组元素:组成数组的基本单元

注意:
1.数组是引用类型
2.每个元素都有编号又叫做下标(下标从0开始)
3.数组初始化时开辟一串连续的空间,初始化后此空间不会改变
(数组没有扩容或删除,后面提到的扩容是通过新建的数组进行一系列操作来达到原数组“扩容”的效果)
4.下标不能超过数组长度,也不能是负数,否则会出现数组下标越界异常(ArrayIndexOutOfBoundsException)
5.数组中的元素的类型一定要和此数组的类型一致

2.数组的初始化

静态初始化:数据由程序员指定,长度由系统根据数据个数开辟空间

public class S{
	
	public static void main(String[] args){
		//静态初始化1
		//String[] n = new String[]{"学","习","很","快","乐"};
		
		//静态初始化2
		//String[] n;
		//names = new String[]{"学","习","很","快","乐"};
		
		//静态初始化3
		String[] n = {"学","习","很","快","乐"};
		
		//设置指定下标上的元素
		n[2] = "多";
		
		//通过下标获取元素
		String a = n[2];
		System.out.println("通过下标获取元素"+a);
		
		//获取元素个数(获取数组长度)
		int len = n.length;
		System.out.println("获取元素个数"+a);
		
		//遍历-for循环
		for(int i=0;i<n.length;i++){
			System.out.println(n[i]);
		}
		//遍历-foreach(增强for循环)
		for(String e :n){//依次遍历n数组中的元素,每次循环就将赋值给e变量
			System.out.println(e);
		}
	}
}

动态初始化:长度由程序员指定,数据由系统根据数组类型赋默认值(整数类型:0,浮点类型:0.0,字符类型:’ ’ (一个空格),布尔类型:false,引用类型:null)

public class S{
    public static void main(String[] args){
            //动态初始化1
            //String[] names = new String[5];//5 - 开辟5个连续的空间,系统会给默认值null

            //动态初始化2
            String[] names;
            names = new String[5];//5 - 开辟5个连续的空间,系统会给默认值null

            //设置指定下标上的元素
            names[0] = "学";
            names[1] = "习";
            names[2] = "快";
            names[3] = "乐";
            names[4] = "吗";

            //遍历 - for循环
            for(int i = 0;i<names.length;i++){
                System.out.println(names[i]);
            }
    }
}

应用场景:在一开始就知道数据的情况使用静态初始化;一开始就知道长度,但随着代码的运行才知道具体数据类型的情况使用动态初始化。

3.数组的排序(先了解冒泡排序和选择排序)

冒泡排序:N个数排序,两两相比小靠前,外层循环条件i<N-1,内层循环条件j<N-1-i(这是升序,降序另说)

public class S{
    public static void main(String[] args){

        int[] a={4,7,9,3,2,1,6,5,8};

        for(int i=0;i<a.length-1;i++){
            for(int j=0;j<a.length-1-i;j++){
                if(a[j]>a[j+1]){
                    int temp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = temp;
                }
            }
        }
        for(int i :a){//输出排序结果
            System.out.println(i);
        }
    }
}

选择排序(升序)

固定位置的值(从首位开始)与其他位置的值做比较,每次比较将得到的最小的值放在这个固定位置,比较完过后此位置的值不会再参与下轮比较,每次确定一个数,最后一轮确定两数,所以需要比较的次数是数组的长度减一

public class S {

	public static void main(String[] args) {
		
		int [] num ={5,3,2,1,4};
		for (int i = 0; i < num.length-1; i++) {//首次是将num[0]的值和其他位置的值做比较
			for (int j = i+1; j < num.length; j++) {
				if(num[i]>num[j]){
					int temp = num[i];
					num[i] = num[j];
					num[j] = temp;
				}
			}
		}
		for (int i : num) {//遍历
			System.out.println(i);
		}
	}
}

4.数组的查找

顺序查找:从头到尾遍历查找,数据庞大时效率低下

public class S{
	
	public static void main(String[] args){
		
		int[] a={4,7,9,3,2,1,6,5,8};
		int num = 5;//要查找的数
		for(int i=0;i<a.length;i++){
			if(num == a[i]){
				System.out.println("找到该数!");
			}
		}
        
	}
}

二分法查找:先排序,再二分(将数组一分为二),效率高

import java.util.Arrays;//引用java给我们提供的工具类
public class S{
	
	public static void main(String[] args){
		
		int[] a={4,7,9,3,2,1,6,5,8};
		int num = 5;
		Arrays.sort(a);//对a进行排序(结果是升序)
		
		int start = 0;
		int end = a.length-1;
		
		while(start<=end){
			int mid =(start+end)/2;
			if(num<a[mid]){
				end = mid-1;
			}else if(num>a[mid]){
				start = mid+1;
			}else{
				System.out.println("找到该数");
				break;
			}
		}
	}
}

5.数组的复制

避免直接将原数组的地址赋值给新数组,因为修改原数组会影响到新数组

public class S{
	
	public static void main(String[] args){
		
		String[] a={"小明","小红","小亮"};//原数组
		
		String[] b= new String[a.length];//新数组
		
		for(int i=0;i<a.length;i++){//数据的转移
			b[i] = a[i];
		}
		for(String c :b){//遍历
			System.out.println(c);
		}
	}
}

6.数组的"扩容"

public class S{
	
	public static void main(String[] args){
		
		String[] a={"小明","小红","小亮"};//原数组
		
		String[] b= new String[a.length*2];//新数组
		
		for(int i=0;i<a.length;i++){//数据的转移
			b[i] = a[i];
		}
		
		a = b;//将新数组在堆里的内存地址赋值给原数组
		
		for(String c :b){//遍历
			System.out.println(c);
		}
	}
	
}

7.数组的"删除"

public class S{
	
	public static void main(String[] args){
		
		String[] a={"小明","小红","小亮"};
		
		for(int i=0;i<a.length-1;i++){
			a[i] = a[i+1];//数据-"小明"消失
		}

		a[a.length-1]=null;
        
		for(String c :a){//遍历
			System.out.println(c);
		}
	}
}

8.数组参数和返回值

现要求创建一个方法,传入int类型的数组,返回最大值与最小值

public class S{
	
	public static void main(String[] args){
		
		int[] a={8,9,0,7,4,5,1,2,3,6};
		int[] b=method(a);
		System.out.println("最大值为"+b[0]);
		System.out.println("最小值为"+b[1]);
		
	}
	public static int[] method(int[] c){
		int max = c[0];
		int min = c[0];
		for(int i=0;i<c.length-1;i++){
			if(max<c[i]){
				max = c[i];
			}
			if(min>c[i]){
				min = c[i];
			}
		}
		return new int[]{max,min};
	}
}

可变参数:在不确定传入参数个数时使用,使用时可变参数后面不能加其他参数。

public class S{
	
	public static void main(String[] args){
		int sum = method(1,2,3,4,5);//计算这5个数之和
		System.out.println(sum);
	}
    //可变参数就是数组
	public static int method(int...a){//将实参作为数组元素传入到a数组中
		int sum = 0;
		
		for(int i:a){
			sum += i;
		}
		return sum;
	}
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值