前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java数组(Array)

Java数组(Array)

作者头像
用户7886150
修改于 2021-04-08 03:05:11
修改于 2021-04-08 03:05:11
3910
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: Java数组

数组(Array),是多个相同类型数据一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。 

数组相关的概念: 

数组名元素角标、下标、索引数组的长度:元素的个数 

数组的特点: 

数组是按序排列的数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型创建数组对象会在内存中开辟一整块连续的空间数组的长度一旦确定,就不能修改。 

数组的分类: 

① 按维数:一维数组、二维数组、… 、n维数组②按数组元素的类型:基本数据类型元素的数组、引用数据类型元素的数组 

一维数组 

声明与初始化 

//正确的方式:

        int num;//声明

        num = 10;//初始化

        int id = 1001;//声明 + 初始化

        int[] ids;//声明

        //1.1 静态初始化:数组的初始化和数组元素的赋值操作同时进行

        ids = new int[]{1001,1002,1003,1004};

        //1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行

        String[] names = new String[5];

    int[] arr4 = {1,2,3,4,5};//类型推断

错误的方式: 

//        int[] arr1 = new int[];

//        int[5] arr2 = new int[5];

//        int[] arr3 = new int[3]{1,2,3};

一维数组元素的引用:通过角标的方式调用。 //数组的角标(或索引从0开始的,到数组的长度-1结束。 

names[0] = "王铭";

names[1] = "王赫";

names[2] = "张学良";

names[3] = "孙居龙";

names[4] = "王宏志";//charAt(0)

数组的属性:length 

System.out.println(names.length);//5

System.out.println(ids.length);

说明: 数组一旦初始化,其长度就是确定的。arr.length 数组长度一旦确定,就不可修改。 4.一维数组的遍历 for(int i = 0;i < names.length;i++){ System.out.println(names[i]); } 5.一维数组元素的默认初始化值 > 数组元素是整型:0 

  > 数组元素是浮点型:0.0

   > 数组元素是char型:0或'\u0000',而非'0'

   > 数组元素是boolean型:false

   > 数组元素是引用数据类型:null

6.一维数组的内存解析  

二维数组 

数组属于引用数据类型数组的元素也可以是引用数据类型一个一维数组A的元素如果还是一个一维数组类型的,则,此数组A称为二维数组。 

二维数组的声明与初始化 正确的方式: 

int[] arr = new int[]{1,2,3};//一维数组

    //静态初始化

    int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};

    //动态初始化1

    String[][] arr2 = new String[3][2];

    //动态初始化2

    String[][] arr3 = new String[3][];

//也是正确的写法:

    int[] arr4[] = new int[][]{{1,2,3},{4,5,9,10},{6,7,8}};

    int[] arr5[] = {{1,2,3},{4,5},{6,7,8}};//类型推断

错误的方式: 

//        String[][] arr4 = new String[][4];

//        String[4][3] arr5 = new String[][];

//        int[][] arr6 = new int[4][3]{{1,2,3},{4,5},{6,7,8}};

如何调用二维数组元素: 

System.out.println(arr1[0][1]);//2

        System.out.println(arr2[1][1]);//null

        arr3[1] = new String[4];

        System.out.println(arr3[1][0]);

    System.out.println(arr3[0]);//

二维数组的属性: 

System.out.println(arr4.length);//3

        System.out.println(arr4[0].length);//3

        System.out.println(arr4[1].length);//4

遍历二维数组元素: 

for(int i = 0;i < arr4.length;i++){

            for(int j = 0;j < arr4[i].length;j++){

                System.out.print(arr4[i][j] + "  ");

            }

            System.out.println();

    }

二维数组元素的默认初始化值 

 规定:二维数组分为外层数组的元素,内层数组的元素 int[][] arr = new int[4][3]; 外层元素:arr[0],arr[1]等 内层元素:arr[0][0],arr[1][2]等 数组元素的默认初始化值 针对于初始化方式一:比如:int[][] arr = new int[4][3]; 外层元素的初始化值为:地址值 内层元素的初始化值为:与一维数组初始化情况相同 针对于初始化方式二:比如:int[][] arr = new int[4][]; 外层元素的初始化值为:null 内层元素的初始化值为:不能调用,否则报错。  

二维数组的内存结构 

数组常见用法 

1.数组的创建与元素赋值: 杨辉三角(二维数组)、回形数(二维数组)、6个数,1-30之间随机生成且不重复。 2.针对于数值型的数组: 最大值、最小值、总和、平均数等 3.数组的赋值与复制 

int[] array1,array2;

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

3.1 赋值: 

array2 = array1;

如何理解:将array1保存的数组的地址值赋给了array2,使得array1和array2共同指向堆空间中的同一个数组实体。  3.2 复制: 

array2 = new int[array1.length];

for(int i = 0;i < array2.length;i++){

array2[i] = array1[i];

}

 如何理解:我们通过new的方式,给array2在堆空间中新开辟了数组的空间。将array1数组中的元素值一个一个的赋值到array2数组中。 4.数组元素的反转 

    //方法一:

//        for(int i = 0;i < arr.length / 2;i++){

//            String temp = arr[i];

//            arr[i] = arr[arr.length - i -1];

//            arr[arr.length - i -1] = temp;

//        }

    //方法二:

//        for(int i = 0,j = arr.length - 1;i < j;i++,j--){

//            String temp = arr[i];

//            arr[i] = arr[j];

//            arr[j] = temp;

//        }

5.数组中指定元素的查找:搜索、检索 5.1 线性查找: 实现思路:通过遍历的方式,一个一个的数据进行比较、查找。 适用性:具有普遍适用性。 5.2 二分法查找: 实现思路:每次比较中间值,折半的方式检索。 适用性:(前提:数组必须有序) 

6.数组的排序算法  

理解: 1)衡量排序算法的优劣: 时间复杂度、空间复杂度、稳定性 

2)排序的分类:内部排序 与 外部排序(需要借助于磁盘) 

3)不同排序算法的时间复杂度 

 4)手写冒泡排序 

int[] arr = new int[]{43,32,76,-98,0,64,33,-21,32,99};

    //冒泡排序

    for(int i = 0;i < arr.length - 1;i++){

        for(int j = 0;j < arr.length - 1 - i;j++){

            if(arr[j] > arr[j + 1]){

                int temp = arr[j];

                arr[j] = arr[j + 1];

                arr[j + 1] = temp;

            }

        }

    }        

数组的常见异常 

1.数组角标越界异常:ArrayIndexOutOfBoundsException 

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

//        for(int i = 0;i <= arr.length;i++){

//            System.out.println(arr[i]);

//        }

//        System.out.println(arr[-2]);

//        System.out.println("hello");

2.空指针异常:NullPointerException 

    //情况一:

//        int[] arr1 = new int[]{1,2,3};

//        arr1 = null;

//        System.out.println(arr1[0]);

        //情况二:

//        int[][] arr2 = new int[4][];

//        System.out.println(arr2[0][0]);

        //情况:

        String[] arr3 = new String[]{"AA","BB","CC"};

        arr3[0] = null;

        System.out.println(arr3[0].toString());

小知识:一旦程序出现异常,未处理时,就终止执行。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
jvm内存结构
jvm主要分,堆、方法区、java栈、本地方法栈、程序计数器五个区域,其中方法区和堆区是线程共享的
leobhao
2022/06/28
8860
jvm内存结构
Java JVM 内存泄露 基本概念 解析及排查处理办法
JAVA是垃圾回收语言的一种,开发者无需特意管理内存分配。但是JAVA中还是存在着许多内存泄露的可能性,如果不好好处理内存泄露,会导致APP内存单元无法释放被浪费掉,最终导致内存全部占据堆栈(heap)挤爆进而程序崩溃。
大鹅
2021/06/16
1.2K0
助力金三银四面试JVM 高频面试题篇
方法区和堆是所有线程共享的内存区域;而java栈、本地方法栈和程序计数器是运行时线程私有的内存区域。
没有故事的陈师傅
2023/05/01
2940
助力金三银四面试JVM 高频面试题篇
jvm触发full gc条件(Linux内存管理机制)
GC,即就是Java垃圾回收机制。目前主流的JVM(HotSpot)采用的是分代收集算法。作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题。与C++不同的是,Java采用的是类似于树形结构的可达性分析法来判断对象是否还存在引用。即:从gcroot开始,把所有可以搜索得到的对象标记为存活对象。缺点就是:1. 有可能不知不觉浪费了很多内存。2. JVM花费过多时间来进行内存回收。3. 内存泄露
全栈程序员站长
2022/07/28
2.7K0
jvm触发full gc条件(Linux内存管理机制)
JVM学习记录-对象已死吗
前言 先来回顾一下,在jvm运行时数据区,分为两部分,一个部分是线程共享区,主要包括堆和方法区,另一部是线程私有区分包括本地方法栈,虚拟机栈和程序计数器。在线程私有部分的三个区域是随着线程生和灭的。栈中的栈帧随着方法的进入和退出而执行着出栈和入栈操作。每一个栈帧所用内存大小在类结构确定下来时就已知了。因此这线程私有区的内存分配和回收都具备确定性,简单概括的说:这部分内存在类加载时分配,在线程结束时回收。(个人理解) 而线程共享区(堆和方法区)则不一样,一个方法中的多个分支需要的内存可能不一样,只有在程序处于
纪莫
2018/04/24
7360
JVM学习记录-对象已死吗
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM(Java Virtual Machine,即java虚拟机),java程序的运行环境(java二进制字节码的运行环境)。
寻求出路的程序媛
2024/08/01
1440
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM-方法区
方法区概述 《Java虚拟机规范》中明确说明:"尽管所有额方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会去进行垃圾收集或者进行压缩",但是对于HotspotJVM而言,方法区还有一个别名叫做Non-Heap(非堆),目的就是要和堆区分开,所以,方法区看做是一个独立于Java堆的内存空间
是小张啊喂
2023/02/21
3460
Java内存管理-JVM内存模型以及JDK7和JDK8内存模型对比总结(三)
今天介绍一下JVM内部的一些区域,以及具体的区域在运行过程中会发生哪些异内存常! 其实也就对应了内存管理的第一篇中 JVM的第三个阶段,程序运行内存溢出。
凯哥Java
2022/12/15
1.7K0
Java内存管理-JVM内存模型以及JDK7和JDK8内存模型对比总结(三)
JVM内存模型
JVM定义了若干个程序执行期间使用的数据区域。这个区域里的一些数据在JVM启动的时候创建,在JVM退出的时候销毁。而其他的数据依赖于每一个线程,在线程创建时创建,在线程退出时销毁
黑洞代码
2021/01/14
5510
JVM内存模型
JVM活学活用——GC算法 垃圾收集器
概述 ----  垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了。 jvm 中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于 java 堆和方法区中,在程序运行期间,这部分内存的分配和使用都是动态的。 对象存活判断 ----  判断对象是否存活一般有两种方式: 引用计数:每个对象有一个引用计数属
Janti
2018/04/10
6490
JVM活学活用——GC算法 垃圾收集器
JVM全网最全面试题
线程私有的,作为当前线程的行号指示器,用于记录当前虚拟机正在执行的线程指令地址。程序计数器主要有两个作用:
爱撒谎的男孩
2023/08/26
2250
JVM全网最全面试题
JVM架构和GC垃圾回收机制(JVM面试不用愁)[通俗易懂]
JVM全称是Java Virtual Machine(Java虚拟机),Java虚拟机是一种程序虚拟机(相对操作系统虚拟机),Java的运行环境实现跨平台。
全栈程序员站长
2022/08/11
4090
JVM架构和GC垃圾回收机制(JVM面试不用愁)[通俗易懂]
JVM之内存结构
定义:记住下一条执行执行的地址,一条指令执行完成后,解释器会到程序计数器找到下一条指令的地址,通过寄存器实现(cpu中最快的) 特点:线程私有,每个程序有自己的程序计数器 唯一不会存在内存溢出的地方 局部变量在栈
一只
2023/08/10
1900
GC及JVM参数
这个GC跟JVM内容太多了,理论性东西多些,少年时还能记个八九成,好久没弄,都忘记了。这次权当整理温习,再看看《深入理解JVM虚拟机》,找些过去写的博客挖点东西过来!
码农戏码
2021/03/23
9960
JVM基础和调优[通俗易懂]
注意:还是会造成线程等待现象–>Stop-The-World(STW),但是减少垃圾回收的停顿时间就会同时减小系统的吞吐量
全栈程序员站长
2022/06/28
4700
JVM基础和调优[通俗易懂]
关于JVM内存溢出的原因分析及解决方案探讨
当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出。
技术zhai
2019/08/18
2.2K0
面试题:请讲讲JVM的内存模型
  本文内容是基于 JDK 1.6 的,不同版本虚拟机之间也许会有些许差异,但不影响我们对JVM 内存模型的整体把握和了解。
用户1263954
2019/07/16
1.3K1
面试题:请讲讲JVM的内存模型
不好意思!耽误你的十分钟,JVM内存布局还给你
在2006年加州旧金山的JavaOne大会上,一个由顶级Java开发者组成的周年性研讨会,Sun Microsystems公司突然宣布将开放Java的源代码。于是,下一年顶级项目OpenJDK诞生。
JavaSouth南哥
2024/08/20
1521
不好意思!耽误你的十分钟,JVM内存布局还给你
一篇文章彻底搞懂Java虚拟机垃圾回收(GC)机制
方法区(Method Area):有点像以前常说的“进程代码段”,这里面存放了每个加载类的反射信息、类函数的代码、编译时常量等信息
你好戴先生
2020/09/03
1.9K0
Java常见问题分析(内存溢出、内存泄露、线程阻塞等)
例:Object.finallize()、 Windows.dispose()、 System.gc()
马士兵的朋友圈
2020/09/08
1.4K0
Java常见问题分析(内存溢出、内存泄露、线程阻塞等)
推荐阅读
相关推荐
jvm内存结构
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文