数组定义和访问

数组概念

数组概念: 数组就是存储多个数据的容器,数组的长度固定,多个数据的数据类型要一致。

数组的定义

方式一
数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度];

举例: 定义可以存储3个整数的数组容器,代码如下:

int[] arr = new int[3];

方式二
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3…};

举例: 定义存储1,2,3,4,5整数的数组容器。

int[] arr = new int[]{1,2,3,4,5};

方式三
数据类型[] 数组名 = {元素1,元素2,元素3…};

举例: 定义存储1,2,3,4,5整数的数组容器

int[] arr = {1,2,3,4,5};

数组的访问

直接输出数组名,显示的是数组的地址 [I@50cbc42f
索引: 每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。

格式:数组名[索引]

通过索引访问数组中的元素:
数组名[索引],获取出数组中的元素
数组名[索引]=数值,为数组中的元素赋值

数组的长度属性: 每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的
长度,语句为: 数组名.length ,属性length的执行结果是数组的长度,int类型结果。由次可以推断出,数
组的最大索引值为 数组名.length-1

public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5};
//打印数组的属性,输出结果是5
System.out.println(arr.length);
}

数组原理内存图

内存概述

内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。
Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。

Java虚拟机的内存划分

为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

JVM的内存划分:

区域名称 作用
寄存器 给CPU使用,和我们开发无关。
本地方法栈 JVM在使用操作系统功能的时候使用,和我们开发无关。
方法区 存储可以运行的class文件。
堆内存 存储对象或者数组,new来创建的,都存储在堆内存。
方法栈 方法运行时使用的内存,比如main方法运行,进入方法栈中执行。

数组在内存中的存储

一个数组内存图

public class Demo{
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr); // [I@50cbc42f
arr[1] = 2;
System.out.println(arr[1]);
}
}

[I@50cbc42f是数组在内存中的地址。new出来的内容,都是在堆内存中存储的,而方法中的变量arr保存的是数组的地址。 输出arr[0],就会输出arr保存的内存地址中数组中0索引上的元素


两个数组内存图

public static void main(String[] args) {
int[] arr1 = new int[2];
int[] arr2 = new int[3];
System.out.println(arr1);
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
// 给arr1数组的索引为0元素赋值100
arr1[0] = 100;
// 给arr2数组的索引为0元素赋值200
arr2[0] = 200;
System.out.println("‐‐‐‐‐‐‐‐‐‐‐");
System.out.println(arr1);
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
}


两个变量指向一个数组

public static void main(String[] args) {
int[] arr = new int[3];
arr[0] = 100;
arr[1] = 200;
arr[2] = 300;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
// 定义数组变量arr2,将arr的地址赋值给arr2
// arr和arr2指向堆中同一个数组
int[] arr2 = arr;
arr2[0] = 111;
arr2[1] = 222;
arr2[2] = 333;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
}

数组的常见操作

数组越界异常

public static void main(String[] args) {
int[] arr = {1,2,3};
System.out.println(arr[3]);
}

创建数组,赋值3个元素,数组的索引就是0,1,2,没有3索引,因此不能访问数组中不存在的索引,程序运行后,将会抛出 ArrayIndexOutOfBoundsException 数组越界异常。

数组空指针异常

public static void main(String[] args) {
int[] arr = {1,2,3};
arr = null;
System.out.println(arr[0]);

arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候会抛出 NullPointerException 空指针异常。

数组遍历

数组遍历: 就是将数组中的每个元素分别获取出来。

public static void main(String[] args) {
int[] arr = {11, 22, 33, 44};
// 将数组中的每个元素都取出来
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}

数组获取最大值元素

public static void main(String[] args) {
int[] arr = {2, 16, 1000, 10000, 500, 3000};
// 1.定义变量记录较大的值,先假定arr[0]是最大值
int max = arr[0];
// 2.遍历拿到数组中的每个元素
for (int i = 0; i < arr.length; i++) {
// 3.如果arr[i]大于max,将max改成arrr[i]
if (arr[i] > max) {
// 10000
max = arr[i];
}
}
// 4.输出最大值
System.out.println(max);
}

数组反转

public static void main(String[] args) {
int[] arr = {11, 22, 33, 44, 55};
// 定义变量记录小索引: start = 0
// 定义变量记录大索引: end = arr.length ‐ 1
// 循环终止条件: start < end 才需要交换位置
for (int start = 0, end = arr.length ‐ 1; start < end; start++, end‐‐) {
// 循环交换位置,利用第三方变量
int tmp = arr[start];
arr[start] = arr[end];
arr[end] = tmp;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}

数组作为方法参数和返回值

数组作为方法参数

数组作为方法参数传递,传递的参数是数组内存的地址。

public static void main(String[] args) {
int[] arr = {11, 22, 33, 44, 55};
System.out.println("1位置: " + arr);
printArray(arr); // 数组作为方法参数传递,传递的参数是数组内存的地址
}
public static void printArray(int[] arr) {
System.out.println("2位置: " + arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}

数组作为方法返回值

数组作为方法的返回值,返回的是数组的内存地址

public static void main(String[] args) {
//调用方法,接收数组的返回值
//接收到的是数组的内存地址
int[] arr = getArr();
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
/*
创建方法,返回值是数组类型
return返回数组的地址
*/
public static int[] getArr() {
int[] arr = { 12, 54, 32 };
//返回数组的地址,返回到调用者
return arr;
}

java_数组的定义与操作的更多相关文章

  1. [java学习笔记]java语言基础概述之数组的定义&常见操作(遍历、排序、查找)&二维数组

    1.数组基础 1.什么是数组:           同一类型数据的集合,就是一个容器. 2.数组的好处:           可以自动为数组中的元素从零开始编号,方便操作这些数据. 3.格式:  (一 ...

  2. Javascript Jquery 中的数组定义与操作_子木玲_新浪博客

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  3. php第三天-数组的定义,数组的遍历,常规数组的操作

    0x01 数组分类 在php中有两种数组:索引数组和关联数组 索引数组的索引值是整数,以0开始.当通过位置来标识东西时用索引数组. 关联数组是以字符串作为索引值,关联数组更像操作表.索引值为列名,用于 ...

  4. paip.数组以及集合的操作uapi java php python总结..

    paip.数组以及集合的操作uapi 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/att ...

  5. php数组使用技巧及操作总结

    数组,可以说是PHP的数据应用中较重要的一种方式.PHP的数组函数众多,下面是一些小结,借此记之,便于以后鉴之. 1. 数组定义 数组的定义使用 array()方式定义,可以定义空数组:<?ph ...

  6. C 语言字符数组的定义与初始化

    1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'} ...

  7. Java基础_0306:数组的定义与使用

    数组 数组指的就是一组相关变量的集合.例如:如果说现在要想定义100个整型变量,按照传统的思路,可能这样定义: int i1,i2 ,... i100,一共写100个变量. 以上的形式的确可以满足技术 ...

  8. 数组的定义和使用,理解多维数组和Array类

    数组的作用 在执行程序的过程中,通常会需要存储大量数据.如果只有少量数据,那么通过声明变量,存储到变量中即可.但当我们的数据是20个.40个甚至是100以上时,就意味着需要声明很多变量,这是不现实的, ...

  9. 关于javascript数组的定义与其一些常用方法总结

    由于JavaScript是一门宽松的语言,这种宽松可能会带来更加麻烦的事情.比如JavaScript的数组,定义与使用的方式太灵活有时候让人迷惑.下面将JavaScript中关于数组常用的方法.定义之 ...

随机推荐

  1. ant design pro 实战 : 使用 ztree

    应当指出,antd 是有 ztree 组件的,但是太简单,无法满足复杂的业务需求. 所以我还是决定使用zTree. 用 npm | cnpm 或者 yarn | tyarn 安装,这一步略. 在 js ...

  2. javascript : 写一个类似于 jquery css() 的方法

    我们知道,jquery css() 方法可以很方便的更改DOM的样式. 但从原理上,这个并不复杂,我们完全可以自己写一个. 上代码. updateDOMStyle(DOM, obj){ Object. ...

  3. vuex : 模块化改造

    我们知道,vuex是vue技术栈中很重要的一部分,是一个很好用的状态管理库. 如果你的项目没有那么复杂,或者对vuex的使用没有那么重度,那么,是用不着modules功能的. 但如果你写着写着就发现你 ...

  4. [spring] -- 事务篇

    关于Transactional注解 五个表示隔离级别的常量 TransactionDefinition.ISOLATION_DEFAULT:使用后端数据库默认的隔离级别,Mysql 默认采用的 REP ...

  5. 小程序开发全栈1.2/3/4组件、flex布局、样式

    1.2 组件 1.2.1 text组件 编写文本信息,类似于HTTP中的span 1.2.2 view组件 容器,类似于HTTP中的div 1.2.3 image组件 图片显示组件 1.3 页面fle ...

  6. SW算法求全局最小割(Stoer-Wagner算法)

    我找到的唯一能看懂的题解:[ZZ]最小割集Stoer-Wagner算法 似乎是一个冷门算法,连oi-wiki上都没有,不过洛谷上竟然有它的模板题,并且2017百度之星的资格赛还考到了.于是来学习一下. ...

  7. Promise对象 异步编程

    Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是 ...

  8. 常用核心数据库查询sql

    一.查询账户信息 -- 查询数据量 /*{"xdb_comment":"1","table":"mb_tran_hist" ...

  9. PHP设计模式之----观察者模式

    一.概述 1.观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新. 2.场景:一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后 ...

  10. Centos 安装ixgbe驱动

    1. 首先查看网卡类型 [root]# lspci | grep 8259907:00.0 Ethernet controller: Intel Corporation 82599ES 10-Giga ...