目录

1.一维数组含义:

2.数组作用:

3.数组的声明:

4.数组的初始化

1.静态初始化:

2.动态初始化:

内存:

步骤:

静态初始化内存:

我们来看看动态初始化

5.数组的使用:

1.通过下标获取元素

2.获取数组中元素个数

3.遍历数组

4.增强for循环遍历数组

注意:

6.数组的复制

数组复制内存图​

我们来看看复制时候的内存图

7.数组的扩容

8.数组的删除


今天来学习一维数组,并深入底层理解一维数组。

1.一维数组含义:

一组数组的容器

2.数组作用:

存放数据,并且操作数据

3.数组的声明:

1.数据类型[] 数组名;

2.数据类型 数组名[];

4.数组的初始化

1.静态初始化:

我们来指定元素,系统自动分配空间长度

比如:

String[] names = new String[]{"张三","李四","王五","小红","小绿"};
String[] names;
names = new String[]{"张三","李四","王五","小红","小绿"};
String[] names = {"张三","李四","王五","小红","小绿"};

三种静态初始化最后的结果是一样的。

2.动态初始化:

我们来指定长度,系统会自动分配元素

在系统自动分配的时候,系统会自动把数组中元素置为空(null),我们来总结一下系统会自动默认分配的类型:

整数类型:0

浮点类型:0.0

字符类型:'  '

布尔类型:false

引用类型:null

我们声明的数组就是引用类型,所以系统会自动把数组元素置为空

比如:

String[] names = new String[5]//通过下标设置元素
names[0] = "张三";
names[1] = "李四";
names[2] = "王五";
names[3] = "小红";
names[4] = "小绿";

内存:

(主要以jdk1.7为例子)

步骤:

1.jvm会将这个类加入到方法区,存放字节码类文件

2.扫描整个程序,找到所有的字面值常量(数字,字符串等),和final修饰的变量

3.一旦调用方法,就会在栈里面开辟方法,用于存放改方法内的局部变量,一旦方法执行完毕,垃圾回收器(gc)会立刻回收

4.在堆里面开辟空间,存放new出来的对象,用于存放对象中数据

静态初始化内存:

就比如我们在main方法中声明一个数组,采用静态初始化的方法

1.首先jvm将字节码文件加载到方法区中

2.扫描程序中所有常量,将常量存入常量池

3.调用main方法,在栈中开辟空间,将name这个数组引用赋值给names

4.将常量池里的数据放入对应的区域

这样就完成了一个数组的初始化(静态初始化)

我们来看看动态初始化

在刚把names对象创建出来时,系统会自动把全部元素置为空,然后再将常量池中的数据赋值给元素。

注意:

1.数组是引用数据类型
2.new表示新建对象,会在堆内存开辟空间
3.数组一旦初始化后,长度不可改变(数组不可以扩容和删除)
4.数组初始化开辟的空间在内存中是连续的

5.数组的使用:

1.通过下标获取元素

String n = names[2];
System.out.println("通过下标获取元素:" + n);

2.获取数组中元素个数

int len = names.length;
System.out.println("获取数组中元素的个数:" + len);

3.遍历数组

for(int i = 0;i<names.length;i++){System.out.println(names[i]);
}

4.增强for循环遍历数组

for(String item : names){//遍历names数组,依次取出元素赋值给itemSystem.out.println(element);
}

注意:

下标为负数或者大于等于长度会出现"数组下标越界异常"-ArrayIndexOutOfBoundsException

6.数组的复制

public class Test{public static void main(String[] args){//原数组String[] names = {"张三","李四","王五"};String[] newNames = names;names[1] = "徐精华";for(String element : newNames){System.out.println(element);}}
}

这段代码就是将原数组赋值给新数组,但是我们会发现,我们改变新数组的元素,原数组的元素也会跟着改变,原因是

将原数组中的对象地址赋值给新数组这个引用,names和newNames这两个引用是指向的同一个数组对象

数组复制内存图

此时我们可以看见,两个数组的引用都是同一个数组,所以我们无论改变哪一个数组的元素,两个数组的元素都会跟着改变。

为了能够将数组完全复制出来且不受影响,所以我们采用这种方法,我们用动态初始化再声明一个数组,然后将原数组的元素赋值给新数组。

public class Test{public static void main(String[] args){//原数组String[] names = {"麻生希","椎名空","水菜丽","爱田奈奈"};//新数组String[] newNames = new String[names.length];//遍历原数组,将原数组中的数据依次迁移到新数组中for(int i = 0;i<names.length;i++){newNames[i] = names[i];}//遍历新数组for(String element : newNames){System.out.println(element);}}
}

我们来看看复制时候的内存图

可以看到,因为两个数组的引用不一样,现在修改就不会相互影响了。

7.数组的扩容

其实数组是不可以扩容的,所以我们只能换一种方式来,我们可以动态声明一个比较长的数组,然后把原来的数组的元素迁移过去,再将新数组的引用赋值给原来的数组,通过这样来达到扩容的目的。

public class Test08{public static void main(String[] args){//原数组String[] names = {"张三","李四","王五"};//创建新数组(新数组长度是原数组长度的1.5倍)int capacity = names.length;int newCapacity = capacity*2;String[] newNames = new String[newCapacity];//将原数组的数据迁移到新数组中for(int i = 0;i<names.length;i++){newNames[i] = names[i];}//将新数组赋值给原数组names = newNames;//遍历原数组for(String element : names){System.out.println(element);}}
}

8.数组的删除

因为数组的大小是不可以改变的,所以我们可以声明一个新数组,然后将除了删除的那个元素外,将其他元素迁移到新数组,以此达到删除的目的,但是还有一种方法,就是我们用覆盖的方法,将要删除的元素用后面的元素覆盖掉,相当于所有元素往前移动。

public class Test{public static void main(String[] args){//原数组String[] names = {"张三","李四","王五"};//数据的迁移for(int i = 1;i<names.length-1;i++){names[i] = names[i+1];}names[names.length-1] = null;//遍历原数组for(String element : names){System.out.println(element);}}
}

java学习笔记(九)一维数组与内存关系相关推荐

  1. java学习笔记Day3:数组

    1.数组 1.1Debug F5:往调用内追踪 F6:按行追踪 F7:跳出方法体 F8:跳过剩余或者跳到下一个断点 1.2数组的定义 数组是一个变量,存储相同数据类型的一组数据,声明一个变量就是在内存 ...

  2. 【Java学习笔记九】多线程

    程序:计算机指令的集合,它以文件的形式存储在磁盘上,是应用程序执行的蓝本. 进程:是一个程序在其自身的地址空间中的一次执行活动.进程是资源申请.调度和独立运行的单位,因此,它使用系统中的运行资源.而程 ...

  3. java时间规划书_【计算机本科补全计划】Java学习笔记(九) Java日期时间

    正文之前 终于好像仿佛看完了菜鸟教程的Java课程,感觉自己收获颇丰!很好,Java看完之后正愁如何开始进阶呢!结果发现菜鸟还准备了Java实例这种好东西!简直就是教程界的良心啊 !!!没事,先写写笔 ...

  4. JAVA学习笔记(九)- 初始化块与静态代码块

    初始化块 /** 初始化块* 初始化变量方式:声明时.构造函数.代码块* 使用static关键字修饰的代码块,称为静态代码块* * 执行顺序:静态代码块>代码块>构造方法* * 静态代码块 ...

  5. java学习笔记(九)----多线程

    class ThreadDemo1 { public static void main(String[] args)   { new TestThread().start(); //用start()默 ...

  6. (JAVA学习笔记) 关于稀疏数组

    稀疏数组介绍 当一个数组中大部分的元素为0,或者同一值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方式是: 1.记录数组一共有几行几列,有多少个不同的值 2.把具有不同值的元素的行列及值记 ...

  7. java学习笔记2(datawhale教程):运算符和表达式、流程控制、数组

    java学习笔记2(datawhale教程):运算符和表达式.流程控制.数组 文章目录 java学习笔记2(datawhale教程):运算符和表达式.流程控制.数组 一.运算符和表达式 1.数学函数与 ...

  8. Java中一维数组的内存解析(浅显易懂,新手必看)

    1.初识JVM 要认识Java中一维数组的内存存储情况,首先应该简单了解一下JVM这个概念 1.1什么是JVM JVM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计 ...

  9. Java 学习笔记 - 数组类型互转

    Java 学习笔记 - 数组类型互转 数组类型转换 字符串数组 to (Integer.Long.Double)列表 传统方式 Java8 Stream方式 数组 to 数组 字符串数组 to (in ...

最新文章

  1. 设置grep高亮显示匹配项
  2. 26.Azure备份服务器(下)
  3. rhel配置磁盘分区_rhel配置磁盘分区_centos系统三套硬盘分区方案[图文设置版]
  4. arm linux移植jvm,JVM的ARM移植.PDF
  5. 服务器保存所有用户的操作指令(history)
  6. [译]你真的理解grok吗
  7. HashMap 详解
  8. js导航条 二级滑动 模仿块级作用域
  9. 配置svn 报错E200002解决办法
  10. 域名转让代码_互联网域名转让协议(中英)
  11. Java简单语法与访问权限修饰符
  12. linux下安装交叉编译器
  13. 基于Python构建机器学习Web应用
  14. matlab怎么画两个自变量的图_眼线液的画步骤图 眼线怎么画好看图解
  15. 第二届长三角高校数学建模竞赛
  16. ssh开启图形界面_分享|3 个 Linux 上的 SSH 图形界面工具
  17. 《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——1.5 层次结构模型...
  18. 【知识分享】C语言中的设计模式——解释器
  19. c语言程序立体几何计算机,立体几何教学中巧妙利用信息技术 -----培养高中学生数学学习的兴趣   张芬     2014年11月10日...
  20. nohup: 忽略输入 Error: Unable to access jarfile【已解决】

热门文章

  1. 5年内禁用支付宝和微信支付!多地公安出手:这些人摊上大事了
  2. 学计算机的大学计划书,计算机系大学计划书
  3. 在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,用Python编写程序,问有多少种摆法?并列举出所有摆法。
  4. 程序员必备神器(GifCam)
  5. 计算机专业报考小学语文老师,各位大神,我是今年的专科应届毕业生,计算机应用专业,想当小学语文老师,考教师资格证对专业有限制吗?...
  6. Brave浏览器推出首个基于隐私的广告平台
  7. PM2报错‘Spawning PM2 daemon with pm2_home...’的解决方案
  8. [转载]ExtJs4 笔记(8) Ext.slider 滚轴控件、 Ext.ProgressBar 进度条控件、 Ext.Editor 编辑控件...
  9. requests模块基本使用、代理ip、session访问
  10. 旋转的数学表达:欧拉角、轴向角、四元数与矩阵