【无标题】

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开始 数组访问是通过下标访问的

image-20221112104644055

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的内存分布

image-20221112120420108

  • 程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址

  • 虚拟机栈(JVM Stack): 与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含 有:局部变量表、操作数栈、动态链接、返回地址以及其他的一些信息,保存的都是与方法执行时相关的一 些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了。

  • 本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局 部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的 堆(Heap): JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 (例如前面的 new int[]{1, 2, 3} ),

  • 堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销 毁。

  • 方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数 据. 方法编译出的的字节码就是保存在这个区域

目前先了解堆和虚拟机这两块空间。

基本类型变量和引用类型变量的区别

基本数据类型创建的变量,称为基本变量。

引用数据类型创建的变量,一般成为对象的引用,储存的是对象所在空间的地址。

image-20221112122828451

//具体代码怎么实现呢?
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进制数组,可以看做就是地址

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值