JAVA数组
数组的基本概念
什么数组
数组是可以储存固定你大小的相同类型的元素
数组的创建和初始化
数组的创建
int[] array3 = new int[3]
int[] 是数组的类型
int 是元素的类型
array3 是数组名
3 是数组的长度
- 创建了一个对象,给他分配了内存,并未初始化,基本的数据默认的内容还是0或是0.0f 0.0 /u0000 false等等
- 但是引用类型如果没有初始化 它默认的就是 null。
数组的初始化
数组的初始化只要分为动态初始化和静态初始化
动态初始化:在创建数组的时候,直接指定数组元素的个数
int[] array3 = new int[3]
静态初始化:就是在创建数组的时候不直接指定数据元素的个数,而直接将具体的数据内容进行指定
int[] array = {1,2,3,4,5,6}
int[] array2 = new int[]{1,2,3,4,5,6}
- 虽然静态初始化 没有指定数组的大小,但是编译器会根据你的元素个数来确定数组的长度
- {}中的类型必须跟你的元素类型相同,你放黄豆的罐,怎么可以放绿豆呢?
- 上面代码是等价的,new int[] 完全可以省略,编译器会默认有这个。
数组的使用
数组中的元素访问
数组在内存中是一段连续的空间,这个空间也是有编号的,都是从0开始 数组访问是通过下标访问的
public class Array {
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7};
System.out.println(array[4]);
//5
- 因为我的数组内存分配时连续的,所以支持随机访问
- 你创建的元素大小决定你访问内存的大小,如果访问超过你的元素大小,那就是越界了(简单做个比方:你买了3个车位,3号4号5号,你打算今天停3号,明天停4号后天停5号依次停,当到第四天的时候,你停到了6号车位去了,但是6号车位是你邻居的,不属于你的,这就是越界了,越界了人家就会警告你)
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7
at Array.main(Array.java:40)//这就是越界的警告
抛出了 java.lang.ArrayIndexOutOfBoundsException 异常. 使用数组一定要下标谨防越界.
数组的遍历
什么叫遍历:简单说就是不管你数组有几个元素我都要访问一遍
比如
public class Array {
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7}
for (int i = 0; i < array.length; i++) {
System.out.print((array[i])+" ");
}
-
我创建了一个数组,里面有7个元素,我通过for循环,把每个元素都访问一遍,
-
数组中array.length 是获取数组的长度的,如果超过你本身的数组长度就像上面所说的,就会越界访问
遍历的方法有好多,接下来给大家说一说
第一种就是for循环,上面已经说过了
第二种是 for-each循环 :JDK1.5引进了一种新的循环类型,它可以在不使用下标的情况下遍历数组
for- each语法格式
for(type element: array)
{//数据类型 数据名 需要访问的数组名
System.out.println(element);
}
实列
public class Array {
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7};
for (int x:array) {
System.out.print((x)+" ");
}
第三种 通过java.util包中的Arrays.toString 来把数组中的元素以字符串的形式打印出来
-
这里需注意,第三种方法仅仅是打印,不可以使用,如果你想使用你的元素还是要通过第一种
实例
ublic class Array { public static void main(String[] args) { int[] array = {1,2,3,4,5,6,7}; String ret = Arrays.toString(array); System.out.println((ret)); //结果[1, 2, 3, 4, 5, 6, 7]
这里Arrays类中还可以排序 ,如果你的数组是个无序的,首先可以先给他排序在遍历
实例
import java.util.Arrays;
public class Array {
public static void main(String[] args) {
int[] array = {18,2,33,14,25,66,27};
Arrays.sort(array);
String ret = Arrays.toString(array);
System.out.println((ret));
//结果[2, 14, 18, 25, 27, 33, 66]
//这里面就用到了Arrays中的sort按照数字顺序排列指定的数组。
数组是引用类型
初始jvm的内存分布
-
程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址
-
虚拟机栈(JVM Stack): 与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含 有:局部变量表、操作数栈、动态链接、返回地址以及其他的一些信息,保存的都是与方法执行时相关的一 些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了。
-
本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局 部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的 堆(Heap): JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 (例如前面的 new int[]{1, 2, 3} ),
-
堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销 毁。
-
方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数 据. 方法编译出的的字节码就是保存在这个区域
目前先了解堆和虚拟机这两块空间。
基本类型变量和引用类型变量的区别
基本数据类型创建的变量,称为基本变量。
引用数据类型创建的变量,一般成为对象的引用,储存的是对象所在空间的地址。
//具体代码怎么实现呢?
public class Array {
public static void main(String[] args) {
int[] array = new int[]{1,2,3,4,5,6,};
System.out.println(array);
//结果[I@1b6d3586
[I@1b6d3586 : 这个结果是什么意思呢,引用变量存储对象的地址,注意不是引用变量本身的地址,接下来我们拆分一下
[ : 指数组
I :指Int类型
@:指分隔符
1B6D3586: 指16进制数组,可以看做就是地址