一.数组概述和定义格式说明
1.为什么要有数组(容器)
为了存储同种数据类型的多个值
2:数组概念
数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。
数组既可以存储基本数据类型,也可以存储引用数据类型。
3:数组定义格式
数据类型[] 数组名 = new 数据类型[数组的长度];
4.输出数组名称和数组元素
输出数组名:[I@659e0bfd
”[“代表一维数组
”I”代表int数据类型
”@659e0bfd”代表内存地址(哈希码)
二.数组的初始化动态初始化
1.数组的初始化
就是为数组开辟连续的内存空间,并为每个数组元素赋予值
2.对数组进行初始化
a:动态初始化只指定长度,由系统给出初始化值
int[] arr = new int[5];
b:静态初始化 给出初始化值,由系统决定长度
3.动态初始化的格式
数据类型[] 数组名 = new 数据类型[数组长度];
4.数组是引用类型的变量
定义数组相当于定义了一个引用变量(也就是定一个了一个指针),这个引用变量还未指向任何有效的内存
三.Java中的内存分配以及栈和堆的区别
1.栈
存储局部变量
存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
由输出引用数据变量名为内存地址可以证明
栈内存可以理解成线程的私有内存,具体方法执行结束之后,系统自动释放JVM内存资源。
2.堆
存储new出来的数组或对象
堆内存中的对象对所有线程可见,可以被所有线程访问。jvm不定时查看堆中的对象,如果没有引用指向这个对象就回收。
3.方法区
4.本地方法区
和系统相关
5.寄存器
给CPU使用
最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
6.常量池
存放字符串常量和基本类型常量(public static final)。
四.数组常见的小问题
1.ArrayIndexOutOfBoundsException:数组索引越界异常
原因:你访问了不存在的索引。
2.NullPointerException:空指针异常
原因:数组已经不在指向堆内存了。而你还用数组名去访问元素。
五.数组的常见操作
1.数组遍历
2.获取数组中的最大值最小值
3.数组元素反转
public class Temp3 {
public static void main(String[] args) {
int[] arr = new int[]{9,5,6,7,8,34,56};
System.out.print("原数组为:");
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
int[] revArr = getRever3(arr);
System.out.println();
System.out.print("数组反转后为:");
for(int i=0,len=revArr.length;i<len;i++){
System.out.print(revArr[i]+" ");
}
}
//第一种
public static int[] getRever1(int[] arr){
int temp;
for(int i=0,len=arr.length;i<len/2;i++){
temp = arr[i];
arr[i] = arr[len-1-i];
arr[len-1-i] = temp;
}
return arr;
}
//第二种
public static int[] getRever2(int[] arr){
int temp;
for(int i=0,len=arr.length;i<len/2;i++){
arr[i] = arr[i]^arr[len-1-i];
arr[len-1-i] = arr[i]^arr[len-1-i];
arr[i] = arr[i]^arr[len-1-i];
}
return arr;
}
//第三种
public static int[] getRever3(int[] arr){
int temp;
for(int i=0,len=arr.length;i<len/2;i++){
arr[i] = arr[i]+arr[len-1-i];
arr[len-1-i] = arr[i]-arr[len-1-i];
arr[i] = arr[i]-arr[len-1-i];
}
return arr;
}
}
4.查找指定元素第一次在数组中出现的索引
public class Temp13 {
public static void main(String[] args) {
int[] a = new int[]{45,67,25,98,34};
int index = getIndex(a,98);
if(index==-1){
System.out.println("不存在该数");
}else{
System.out.println("存在该数,且下标为:"+index);
}
}
public static int getIndex(int[] a,int num){
for(int i=0;i<a.length;i++){
if(num==a[i]){
return i;
}
}
return -1;
}
}
六.二维数组
1.二维数组的格式
int[][] arr = new int[3][2];
int[][] arr = new int[3][];
int[][] arr = {{1,2,3},{4,5},{6,7,8,9}};
2.二维数组的练习
二维数组的遍历
求和
3.二维数组内存结构
二维数组是由两个一维数组组成
第一个一位数组存放的是内存地址