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]);
}
}
}
- 给定一个数组,将数组中的元素循环向右移动 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));
}
}