Java数组第一篇

数组

数组的定义:

数组概念:是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们,数组主要解决多变量多数据的存储问题,方便程序后期统一维护操作数据;

数组的基本特点

  1. 长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
  2. 其元素必须是相同类型,不允许出现混合类型。元素的类型可以是 java 支持的任意类型
  3. 数组类型可以是任何数据类型,包括基本类型和引用类型。
  4. 数组的元素在堆内存中被分配空间,并且是连续分配的
  5. 使用new 关键字对数组进行 内存的分配。每个元素都会被 jvm 赋予默认值。默认规则:整数:0, 浮点数:0.0, 字符:\u0000, 布尔:false, 引用数据类型:null。
  6. 数组的元素都是有序号的,序号从0开始,0序的。称作数组的下标、索引、角标
     
  7. 数组的本质:数组就是一系列空间大小相等且地址连续的一片存储空间;
  8. 空间大小:空间大小是相等的,是为了方便统一维护我们的数据,必须得保证数据之间的类型是一样的。(多个同类型的变量空间连在一起组成的结构叫数组);
  9. 变量的空间地址:变量空间的地址是连续的,是为了方便统一操作我们的数据。

总结:

1.数组就是一片地址连续且空间大小一致的存储空间;

2.数组存在于堆内存中,但凡在堆中存储的数据都称之为对象,但凡在堆内存中创建的对象都会有默认初始值;

3.数组提供角标来访问数组当中的元素;

4.数组变量存的就是数组在堆内存中首元素的地址;

5.数组通过角标来访问元素的具体计算方式是 所要访问数据的地址=首元素地址+角标*数据类型大小;

6.数组一旦定义下来,其长度不可改变;数组中有几个地址?就看数组有几个元素空间<==>数组的长度;

7.创建数组时必须明确规定大小或内容

  • 数据类型[] 数组名=new 数据类型[长度] 创建数组只指定长度但不指定内容
  • 数据类型[] 数组名=new 数据类型[]{1,2,3,4,5};创建数组指定内容(指定长度)
  • 数据类型[] 数组名={1,2,3,4,5}; 创建数组指定内容(指定长度)
  • []表示是一维数组;
  • [][]表示二维数组

数组内存图

 

 

 数组常见错误

(1)ArrayIndexOutOfBoundsException 数组角标越界

(2)NullPointerException 空指针异常

如下:

class Test{
    public static void main(String[] args){
        int[] arr=new int[5];
        System.out.println(arr[3]);
        System.out.println(arr[0]);
        System.out.println(arr[2]);
        String[] strArr=new String[5];
        System.out.println(strArr[0]);

        //System.out.println(arr[10]);
        //ArrayIndexOutOfBoundsException 角标越界
        int[] arr2=arr;
        //此时此刻 数组还是那个数组对象 
        //只不多有两个变量引用到了而已
        arr2[0]=10;
        System.out.println(arr[0]);
        arr2=null;
        //System.out.println(arr2[0]);
        //NullPointerException 空指针异常
        arr=null;
    }
}

 基本数据操作

(1)遍历

(2)赋值

(3)最大值/最小值

介绍如下:

import java.util.Scanner;
class Test05{
    public static void main(String[] args){
        
        maxormin();
    }
    public static void maxormin(){//最大值最小值
       
        int[] arr={10,2,8,3,1,6,4,7,9,5};
        int max=arr[0];
        int min_index=0;
        for(int i=0;i<arr.length;i++){
            if(arr[i]>max){
                max=arr[i];
            }
            if(arr[i]<arr[min_index]){
                min_index=i;
            }
        }
        System.out.println("最大值"+max);
        System.out.println("最小值角标"+min_index);

    }
    public static void fuzhi(){//赋值
        Scanner scanner=new Scanner(System.in);
        // System.out.print("请输入10个数字:");
        int[] arr2=new int[10];
        for(int i=0;i<arr2.length;i++){
            System.out.print("请输入1个数字:");
            arr2[i]=scanner.nextInt();
        }
        for(int i=0;i<arr2.length;i++){
            System.out.print(arr2[i]+" ");
        }
    }
    public static void bianli(){//遍历
        int[] arr={1,2,3,4,5,6,7,8,9};//[0,8]
        //数组只有一个唯一的属性 length 数组的长度
        System.out.println(arr.length);
        for(int i=0;i<arr.length;i++){
            System.out.println(arr[i]);
        }
    }
}

查找操作

  • 线性查找
  • 二分查找
  • 斐波那契查找

二分查找应用:

class Test06{
    public static void main(String[] args){
        //线性查找
        //linearSearch();
        //二分查找
        binarySearch();
    }
    public static void binarySearch(){
        
        int[] arr={12,17,21,32,38,41,46,49,50,50,51,59,60};
        int key=46;
        int index=-1;
        int min_index=0;
        int max_index=arr.length-1;
        int mid_index=(min_index+max_index)/2;
        while(arr[mid_index]!=key){
            if(key<arr[mid_index]){
                max_index=mid_index-1;
            }
            if(arr[mid_index]<key){
                min_index=mid_index+1;
            }
            if(min_index>max_index){
                index=-1;
                break;
            }
            mid_index=(min_index+max_index)/2;
        }
        System.out.println(mid_index);

    }
    public static void linearSearch(){
        
        int[] arr={10,2,8,3,1,6,4,7,9,5};
        int key=11;
        int index=-1;   //key元素不存在
        for(int i=0;i<arr.length;i++){
            if(arr[i]==key){
                index=i;
                break;
            }
        }
        System.out.println(index);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值