java山崖奇遇之数组

数组

为了储存大量的数据,数组出现了,数组就是储存多个数据的容器,多个同类型的变量空间连在一起组成的结构叫数组

数组主要解决多变量多数据的存储问题

数组的本质就是一些列空间大小相等且地址连续的地址空间,为了方便统一维护我们的数据,必须保证数据之间的类型是相同的

在Java中,数组存储原始值(int, char,…)或引用(a.k。一个指针)到对象。

当使用“new”创建对象时,将在堆中分配内存空间并返回引用。

数组也是如此,因为数组是Java中的对象。

总结:

  • 数组就是一片地址连续且空间大小一致的存储空间;
  • 数组存储在堆内存中,但凡在堆内存中存储的数据都称为;、
  • 数组提供角标来访问数组当中的元素;
  • 数组变量存的就是数组在堆内存中收元素的地址;
  • 数组通过角标来访问的具体计算方式是*数据类型大小;
  • 数组一旦定义下来不可改变;数组中有几个地址?就看数组有几个元素空间

数组的定义:

数据类型[]  数组名=new  数据类型[长度]---------------创建数组只指定长度但不指定内容

数据类型[]  数组名=new  数据类型[]1{},2,3,4,5}------创建数组指定内容(指定长度)

数据类型[]  数组名=[1,2,3,4,5]----------------------------创建数组指定内容(指定长度)

int arr[]=new int[3];

int[] arr只是对包含3个整数的数组的引用。

如果您创建一个包含10个整数的数组,它是相同的——分配一个数组并返回一个引用。


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


    }
}





结果为:
0
0
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5

System.out.println(arr[0]);和System.out.println(arr[3]);打印出的结果都是零,这是因为这是一个空数组
 而System.out.println(arr[5]);是因为角标越界

再来看数组的遍历

public class Test01{
    public static void main(String[] args){
        int[] arr={1,2,3,4,5,6,7,8,9,10};
        //数组只有一个唯一的属性 length 数组的长度
        System.out.println(arr.length);
        for(int i=0;i<arr.length;i++){
            System.out.println(arr[i]);
        }


}

数组的赋值操作

import java.util.Scanner;
public class Test01{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        int[] arr=new int[10];
        for(int i=0;i<arr.length;i++){
            System.out.print("请输入1个数字:");
            arr[i]=scanner.nextInt();
        }
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
}


找到最大值的问题

import java.util.Scanner;
public class Test01{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        int[] arr=new int[10];
        int max=arr[0];
        int minjiaobiao=0;
        for(int i=0;i<arr.length;i++){
            System.out.print("请输入1个数字:");
            arr[i]=scanner.nextInt();
            if(arr[i]>max){
                max=arr[i];
            }
            if(arr[i]<arr[minjiaobiao]){
                minjiaobiao=i;
            }
        }
        System.out.println("最大值"+max);
        System.out.println("最小值角标"+minjiaobiao);
}

二分查找

二分查找的也称为折半查找,由于每次都能够将查找区间缩小为原来一半,这种算法的时间复杂度为O(logN)。

计算中值的方法有两种
m = (low+ hight) / 2
m = low + (hight - low) / 2

数组中查找指定元素

public class Test11 {
  public static void main(String[] args) {
      int[] arr = { 2, 3, 5, 1, 6, 4, 9, 7, 8 }; 
      //调用查找方法查找给定数组中5元素所在的索引值,并接收查找到的索引
      int index = getIndex(arr, 5);
      //输出索引
      System.out.println("index:"+index);
  }

  public static int getIndex(int[] arr, int num) {
      for (int i = 0; i < arr.length; i++) {
          //按顺序遍历获取数组中的每个元素和要查找的元素进行比较
          if (num == arr[i]) {
              //如果要查找的元素值等于对应位置的元素值,则返回索引
              return i;
          }
      }
      //如果所有的元素都不等于要查找的元素,则返回-1表示没有找到
      return -1;
  }
}

 

二分法查找

public class Test12 {
  public static void main(String[] args) {
      // 有序的被查找数组
      int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
      int index = getIndex(arr, 5);
      // 输出
      System.out.println("index:" + index);
  }

  public static int getIndex(int[] arr, int num) {
      // 查找数组范围的最左侧,先从0开始
      int left = 0; 
      // 查找数组范围的最右侧,先从最大开始
      int right = arr.length - 1;
      // 查找范围的中间值
      int mid;
      while (left <= right) {
          // 中间 = (左侧  + 右侧) / 2
          // mid = (left + right) / 2; 
          // 为了提高效率,我们可以用位运算代替除以运算
          mid = (left + right) >>> 2 
          if (arr[mid] > num) {
              //如果中间元素大于要查找元素,则在中间元素的左侧去找正确元素,最右侧变为mid - 1
              right = mid - 1;
          } else if (arr[mid] < num) {
              //如果中间元素小于要查找元素,则在中间元素的右侧去找正确元素,最左侧变为mid + 1
              left = mid + 1;
          } else {
              // 如果不大不小,那么就正好是找到了,返回找到的
              return mid;
          }
      }
      // 当查找范围的最左侧和最右侧重叠后还没有找到元素,则返回-1表示没有找到
      return -1;
  }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值