Java基础之数组类型
对于Java,前面的一些基础概念不是很想写,看了看还是从数组开始写吧(毕竟数组是第一个引用类型,相对复杂一点),我也是学了JAVA不是很久,目前看完了JAVA的基础视频,还有JAVA疯狂讲义这本书的大部分跟基础相关的内容,但是看完之后发现之前学的很多东西都忘记了(太急于求成,动手实践太少),所以想在学习框架之前二刷一遍,把基础知识点在重温一下。顺便写写博客记录我的JAVA学习历程,以及我所理解的知识重点~!
浅谈数组
数组是我们在学习JAVA过程中遇到的第一个引用类型,它与我们之前所了解的基本类型(int,flout,String)不同,数组存储的数据是在堆内存中存储的,而我们基本类型的数据是在栈内存的存储的(关于堆,栈后面会详细说明)。接下来就开始我们的数组之旅~
数组的概述
JAVA中,我们要求数组存储的必须是同一个数据类型的数据,因此我们的数组不能同时存储多种数据类型的元素(区别于Javascript)。当我们的数组初始化结束之后,我们数组的长度就被确定下来,数组的长度是固定不变的(与集合的区别:集合的长度是可变的)。数组被清空的时候,它所占的空间依然被保留。
数组的定义
定义: 数据类型[] 数组名 = new 数据类型[元素个数或数组长度];
对于数组定义的说明:1)数据类型: 数组中存储元素的数据类型。
2) [] 表示数组的意思。
3) 变量名 自定义标识符 。
4) new 创建容器关键字。
5)数据类型: 数组中存储元素的数据类型
6)[] 表示数组的意思。
7)元素个数,就是数组中,可以存储多少个数据 (恒定, 定长)
数组是一个容器: 存储到数组中的每个元素,都有自己的自动编号。最小的下标值为0,最大下标值(为数组的长度-1)。访问数组存储的元素,必须依赖于索引:数组名[索引]。
数组提供了一个属性来求得数组的长度:length属性。因此假设我们的数组名为arr,这个数组的长度就为:arr.length,数组的第一个元素就为arr[0],数组的最后一个元素就为arr[arr.length-1]。
JVM的理解
JVM虚拟机相当于连接着JAVA与操作系统,通俗的理解为,java是在JVM上进行开发的。
JVM对自己的内存划分为5个区域:(1).寄存器:内存和CUP之间。(2).本地方法栈: JVM调用了系统中的功能。 (3).方法和数据共享: 运行时期class文件进入的地方。(4).方法栈:所有的方法运行的时候进入内存。 (5). 堆:存储的是容器和对象

数组的初始化
数组的初始化有两种方式:静态初始化和动态初始化。
(1).静态初始化:由程序员显示指定每个数组元素的初始值,由系统决定数组长度。
int[] array = {1,2,3,4,5};
(2).动态初始化:程序员只指定数组长度,由系统为数组元素分配值。
int[] array = new int[5];
系统所分配的值有几下几种:1).byte,short,int,long类型,数组被赋值成0.
2).float,double类型,数组被赋值成0.0.
3).char类型,数组被赋值成“\u0000”.
4).boolean类型,数组被赋值成false.
5).引用类型(类,接口,数组),数组被赋值成null.
增强的for循环---foreach循环
在Java5之后,Java提供了一种新的循环:foreach循环。foreach循环会自动遍历数组和集合的每个元素。
foreach的语法格式如下:
for(type arrName : array||collection){
//自动迭代访问的每个元素
}
type:数组元素或者集合元素的类型。arrName:一个形参名。array:要遍历的数组名。collection:要遍历的集合名。
下面举一个例子来使用foreach方法:
public class fun {
public static void main(String[] args) {
String[] array = {"ABC","abc","sdf","gvc","sf"};
for(String arr : array){
System.out.println(arr);
}
}
}
//最终的结果是:
ABC
abc
sdf
gvc
sf
但是值得注意的是:使用foreach循环的时候,不能在循环中对数组元素进行赋值,否则得出的结果是不正确的,这里面不详细说明。
深入了解数组
上面我们了解了数组的一些基本的功能以及使用方法,但是数组在内存中的运行机制是什么呢?之前提到的基本类型以及引用类型的存储在哪里呢?堆存储和栈存储的区别是什么呢?接下来我一一讲述。
我们首先要明确的一个概念就是:数组是一个引用的数据类型,数组的引用变量只是一个引用,数组元素和数组变量在内存中是分开的。
数组变量其实是一个引用(相当于C语言里面的指针),我们通过这个数组变量指向有效的内存来访问元素。因此我们如果要访问数组里面的变量,我们只能使用数组的引用变量来访问它的元素。
接下来是一个数组的内存图,通过这个图来理解内存中的数组:

首先我们要了解的就是,在JVM中,栈和堆都是存储的容器。每一个方法在执行的时候,该方法都会建立一个自己的内存栈,在这个方法内定义的变量将会逐个的放在这块栈里。随着这个方法的结束,这个栈会自动的销毁,因此,所有方法中的局部变量都是存储在栈内存中的。当程序中创建一个对象的时候,这个对象将被保存在运行时的数据区中,以便可以反复的利用(因为创建对象的成本大),这个运行时的数据区就是堆内存,堆内存中的对象不会因为方法的结束而被销毁,因为即使这个方法结束后,该对象也可能被另一个引用变量引用,只有当一个对象没有任何引用变量引用它的时候,它才会被系统的垃圾回收器在合适的时候销毁。有时候我们会让系统回收一个数组所占的空间,那么我们只需要将数组变量赋值为null,这就切断了数组引用变量和实际数组之间的关系,数组就被回收了。
如上所示,我们将数组的引用放在栈内存中(arr),将数组的对象放在堆内存中(new int[3]),我们数组的引用实际上是一个指向它的对象的指针,当我们想在数组中取第一个元素的时候,我们只需要将这个指针指向第一个元素,我们便可以获得第一个元素的值:arr[0]。
二维数组
所谓二维数组,通俗的来说就是将一维数组存储到了一维数组中.。我们将二维数组的定义为:
type[][] arrName = new type[][];
或者
type[][] arrName = [[1,2,3],[2,3,4],[3,4,5]];
其中第一个代表行数,第二个代表列数。
二维数组的内存图如下所示(与一维数组差不多,就是在一维数组中存储了一维数组而已):

我们可以把二维数组理解成一维数组。向3维,4维......n维数组,暂且可以不用看,一般二维就已经够了,了解了内存的存储方式,其实也挺好理解的。
为了我们共同进步,我这里有计算机专业的各种视频,
如果想要,关注我的公众号:念流声。私聊我,看到后给你连接(只放了一张图片,视频有很多,需要什么可以私聊问我,有的话就给你)。


Java基础之数组类型的更多相关文章
- java基础(十) 数组类型
1. 数组类简介 在java中,数组也是一种引用类型,即是一种类. 我们来看一个例子,理解一下数组类: public static void main(String[] args) { Class ...
- 【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错
原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-impor ...
- Java基础之枚举类型Enum的使用
Java基础之枚举类型Enum的使用 定义 public enum AccruedCleanEnum { SPREAD("1","发票"),OTHER(&quo ...
- java基础04-数据类型扩展及面试题
java基础04-数据类型扩展及面试题讲解 public class demo02 { public static void main(String[] args){ // 一.整数拓展: 进制 二进 ...
- Java基础之 数组详解
前言:Java内功心法之数组详解,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) 数组概念 同一种类型数据的集合.其实数组就是一个容器. 数组 ...
- Java基础之数组详解
数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java 语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如 numbers[1 ...
- Java基础之数组(一)
数组的定义 数组是相同类型数据的有序集合.数组描述的是相同类型的若干个数据,按照 一定的先后次序排列组合而成.其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们.数组的三个基本特 ...
- Java 基础:数组
一.数组声明: int[] x; int x[]; 在Java中一般使用前者,机把int[]看做一个类型,C++中只能后者 二.数组初始化: 直接提供值: int[] x = {1, 3, 4}; i ...
- java基础(6)--数组和方法
数组 1. 什么是数组? 数组是相同数据类型的元素组成的集合.这些元素按线性顺序排列.所谓线性顺序是指除第一个元素外,每一个元素都有唯一的前驱元素:除最后一个元素外,每一个元素都有唯一的后继元素.(“ ...
随机推荐
- python+selenium下弹窗alter对象处理01
alt.accept() : 等同于单击“确认”或者“OK” alt.dismiss() : ...
- Java——HashMap底层源码分析
1.简介 HashMap 根据键的 hashCode 值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的. HashMap 最多只允许一条记录的key为 nu ...
- Java文件手动编译执行步骤
Java编译执行步骤: 1)将 Java 代码编写到扩展名为 .java 的文件中.2)通过 javac 命令对该 java 文件进行编译.3)通过 java 命令对生成的 class 文件进行运行. ...
- 掌握这些 Redis 技巧,百亿数据量不在话下!
一.Redis封装架构讲解 实际上NewLife.Redis是一个完整的Redis协议功能的实现,但是Redis的核心功能并没有在这里面,而是在NewLife.Core里面. 这里可以打开看一下,Ne ...
- 【6.10校内test】T2 医院设置
医院设置[题目链接] 感觉我超废 我是一个连floyd都不会写了的灵魂OI选手qwq(考场上写了半天spfa然后写炸了(微笑)) floyd的暴力: 1.先建树:用邻接矩阵存.存之前记得先初始化为IN ...
- mysql5.7单机多实例安装
基于之前的mysql5.7单实例安装 修改/etc/my.cnf文件如下(这里配置4个实例,可自行修改数目) # # 多实例配置文件,可以mysqld_multi --example 查看例子 # [ ...
- SharePoint自己定义程序页面部署 不用重新启动IIS
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/dz45693/article/details/30840255 SharePoint的部署方式默认是 ...
- 两个 DataTable 读取重复数据,dataTable1与dataTable2不同
protected void Page_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns.Ad ...
- CSS行内框(内联元素)
行内框在一行中水平布置.可以使用水平内边距.边框和外边距调整它们的间距.但是,垂直内边距.边框和外边距不影响行内框的高度.由一行形成的水平框称为行框(Line Box),行框的高度总是足以容纳它包含的 ...
- bak文件恢复成 SQL2005 数据库 的全程讲解
经常会碰到客户给我们发的是一个bak的数据库备份文件,而不是一个数据库.这就需要我们把这数据文件还原成数据库的形式. 如将demo.bak数据库恢复到mssql2005下 打开SQL2005,打开后就 ...