Java数组(1):一维数组

本文深入讲解了Java中数组的概念,包括数组的定义、初始化、遍历和常见问题处理。同时,详细解析了一维数组的内存存储方式及数组操作中常见的数组索引越界和空指针异常。此外,还提供了数组应用实例,如寻找两数之和的目标值和数组元素的循环移动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.定义

定义:一组相同数据类型的数据元素的有序集合。

数组中究竟可以存储哪些类型的数据呢?

基本类型数据:byte short int char double float……
引用类型数据:对象、对象数组等

2.数组的定义格式

格式1:数据类型[ ] 数组名;//推荐
格式2:数据类型 数组名[ ];

数组的初始化:
Java中的数组必须先初始化,然后才能使用。
所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋初值。JVM默认为数组赋初值0.

3.数组的初始化方式

①动态初始化:
初始化时程序只指定数组长度,由系统为数组分配初始值0。
格式: 数据类型[] 数组名 = new 数据类型[数组长度];
数组长度其实就是数组中元素的个数。
例:

int[] arr = new int[3];

②静态初始化:
初始化时指定每个数组元素的初始值,由系统决定数组长度。
格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};
例:

int[] arr = new int{1,2,3};

简化写法:

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

注意:
简化写法只在数组定义时有效!

4.一维数组的遍历

public static void print(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
    }

或者可以调用方法:Arrays.toString(数组名);

5.Java虚拟机内存模型

一个Java程序在虚拟机运行的过程中,在内存中需要保存很多中类型的数据。比如局部变量,数组等等。不同类型的数据,其使用方式和生命周期都不相同。为了更好的管理这些不同类型的数据,JVM将自己的内存空间划分为不同的内存区域,各个区域针对不同类型的数据,其内存空间有不同的管理方式。

栈(Stack):存储局部变量;
堆(Heap): 存储new出来的东西 ;
方法区 (后面讲);
本地方法栈(系统相关):Java调用其他非Java语言代码(如c/c++等)存储在本地方法栈;
程序计数器;

栈上变量堆上变量
变量类型局部变量new出来的东西
初值局部由coder自己赋初值由JVM赋初值
内存管理方式管理方式和作用域(即{ })有关垃圾回收器

JVM赋给变量初值:

整数型(byte、int等):0
小数型(float、double等):0.0
字符型char:’\u0000’(码值0对应的字符)
布尔类型:false
引用类型:null

数组在JVM内存中的存储:
数组名存储在栈中,数组空间在堆上开辟。如图:
在这里插入图片描述
注意:
①直接输出数组名:

int[] arr = new int[]{1,5,6,8,9};
System.out.println(arr);//[I@4554617c

[I@4554617c:[表示一维数组 ,I整数类型 ,4554617c数组实际存储的首地址。
②数组操作中,常见的两个问题:

数组索引越界(ArrayIndexOutOfBoundsException):访问超出数组范围的元素。

空指针异常(NullPointerException):

	 int[] arr = new int[3]; //包含的元素 位置 0 1 2
	//空指针异常  NullPointerException
    arr = null; // null空常量
    System.out.println(arr[0]);

6.补充

1.给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标,假设每种输入只会对应一个答案 (因为是两个数,所以下标值,有两个,所以该方法返回一个int[],里面包含两个整数对应的数组下标)。

package com.day06;

public class GetArraySubscriptThroughTarget {
   //找出和为目标值的那两个整数
   public static int[] getArraySubscript(int[] arr,int target){
       int[] result=new int[2];
       for(int i=0;i<arr.length;i++){
           //因为每种输入对应一个答案,所以j从i+1开始
           for (int j = i+1; j < arr.length; j++) {
               if(arr[i]+arr[j] == target){
                   result[0] = i;
                   result[1] = j;
                   break;
               }
           }
       }
       return result;
   }
   public static void main(String[] args) {
       int[] arr = {1,5,8,6,3,4};//整数数组
       int[] result=new int[2];//存放结果
       int target=12;//目标值
       result=getArraySubscript(arr,target);
       for(int i=0; i<result.length; i++){
           System.out.println(result[i]);
       }

   }
}
  1. 给定一个数组,将数组中的元素循环向右移动 k 个位置,其中 k 是非负数。
    举例
    输入: [1,2,3,4,5,6,7] 和 k = 3
    输出: [5,6,7,1,2,3,4]
    解释:
    向右循环移动 1 位: [7,1,2,3,4,5,6]
    向右循环移动 2 位: [6,7,1,2,3,4,5]
    向右循环移动 3 步: [5,6,7,1,2,3,4]
package com.day06;

import java.util.Arrays;

public class ShiftKBitRight {
   //循环右移K位
   //每次右移1位,移动K次
   public static int[] shiftRight(int[] arr,int k){
       int newK=k % arr.length;//移动K次和移动K+K*arr.length结果相同
       int temp=0;
       for(int i=0;i < newK;i++){
           temp=arr[arr.length-1];//暂存数组最后一位
           //数组元素后移1位
           for (int j = arr.length-2; j >= 0 ; j--) {
               arr[j+1] = arr[j];
           }
           arr[0] = temp;//最后一个元素赋给第一个元素
       }
       return arr;
   }
   public static void main(String[] args){
       int[] arr={1,2,3,4,5,6,7};//待移位数组
       int k=3;//右移位数
       System.out.println("右移前:"+Arrays.toString(arr));
       shiftRight(arr,k);
       System.out.println("右移"+k+"位后:"+Arrays.toString(arr));
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值