java数组专题

 Java语法基础——数组

数组的概念

同一种类型数据的集合,其实数组就是一个容器。数组既可以存储基本数据类型,也可以存储引用数据类型。

数组的定义格式

格式一:

元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
  • 1

例,需求:想定义一个可以存储3个整数的容器。

int[] x = new int[3];
  • 1

格式二:

元素类型[] 数组名 = new 元素类型[]{元素, 元素, ……}; 
  • 1

例,

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

以上数组又可简写成:

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

Java中的内存分配

Java程序在运行时,需要在内存中分配空间。为了提高运算效率,对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。共划分了5个不同的区域:

  • 栈内存:用于存储局部变量(只要是在方法中定义的变量都是局部变量),一旦变量的生命周期结束,该变量就被释放。
  • 堆内存: 
    1. 数组和对象,通过new建立的实例都存放在堆内存中。
    2. 每一个实体都有内存地址值。
    3. 堆内存的变量都有默认初始化值。不同类型不一样,int为0,double为0.0,boolean为false,char为’\u0000’(即空格)。
    4. 实体不再被使用,会在不确定的时间内被垃圾回收器回收。
  • 方法区:又叫方法和数据共享区。运行时期,class文件进入的地方。
  • 本地方法区:和系统底层的方法相关,JVM调用了系统中的功能。
  • 寄存器:给CPU使用,不多说。

Java中数组的内存结构

这一节举例说明在Java中数组的内存结构。 
例一,定义一个数组,然后将其指向null,如下:

int[] arr = new int[3];
arr = null;
  • 1
  • 2

对于以上代码,数组在内存中的结构为: 
这里写图片描述 
例二,试看如下代码,你能不能画出数组在内存中的结构图呢?

int[] arr = new int[3];
int[] xxx = new int[3];
arr[1] = 34;
xxx[0] = 89;
System.out.println(arr[0]);
  • 1
  • 2
  • 3
  • 4
  • 5

这里写图片描述
例三,最后看一个示例代码,希望你能画出数组在内存中的结构图。

int[] arr = new int[3];
int[] xxx = new int[3];
arr = xxx;
arr[1] = 34;
xxx[0] = 89;
System.out.println(arr[0]);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这里写图片描述

数组操作常见问题

数组操作有两个常见的小问题:

  1. 数组脚标越界异常(ArrayIndexOutOfBoundsException)

    int[] arr = new int[3];
    System.out.println(arr[3]); // ArrayIndexOutOfBoundsException: 3:操作数组时,访问到了数组中不存在的角标
    • 1
    • 2
  2. 空指针异常(NullPointerException)

    int[] arr = new int[3];
    arr = null;
    System.out.println(arr[1]); // NullPointerException:空指针异常,当引用没有任何指向,值为null的情况,该引用还在用于操作实体。
    • 1
    • 2
    • 3

数组的常见操作

数组遍历

获取数组中的元素,通常会用到遍历,数组中有一个属性可以直接获取到数组的元素个数:length,使用方式:数组名称.length。 下面我会用两个例子来讲解数组是如何遍历的。 
例一,观察如下程序,你觉得是不是可以获取到数组中的每一个元素。

int[] arr = {3, 6, 5, 1, 8, 9, 67};

System.out.println("length: "+arr.length);
for (int x = 0; x < arr.length; x++) {
    System.out.println("arr["+x+"]="+arr[x]+";"); 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

此时,直接输出变量arr:

System.out.println(arr);
  • 1

会得到诸如[I@139a55的值,分析该值:

  • [:表示是一个一维数组。
  • I:表示数组中的元素类型是int。
  • 139a55:用哈希算法算出来的地址值。

例二,定义一个功能,用于打印数组中的元素,元素间用逗号隔开。

public static void printArray(int[] arr) {
    System.out.print("[");
    for (int x = 0; x < arr.length; x++) {
        if(x != arr.length - 1)
            System.out.print(arr[x] + ", ");
        else
            System.out.println(arr[x]+"]");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

获取数组最值

例,给定一个数组,如{5, 1, 6, 4, 2, 8, 9},获取数组中的最大值,以及最小值。 
获取最大值的原理图(获取最小值同理): 
这里写图片描述
用文字描述即为:

  1. 获取最值需要进行比较。每一次比较都会有一个较大的值,因为该值不确定,通过一个变量进行存储。
  2. 让数组中的每一个元素都和这个变量中的值进行比较,如果大于了变量中的值,就用该变量记录较大值。
  3. 当所有的元素都比较完成,那么该变量中存储的就是数组中的最大值了。

步骤如下:

  1. 定义变量,初始化为数组中的任意一个元素即可。
  2. 通过循环语句对数组进行遍历。
  3. 在遍历过程中定义判断条件,如果遍历到的元素比变量中的元素大,就赋值给该变量。

此时,我们需要定义一个功能来完成,以便提高复用性。首先须明确两点:

  1. 明确结果:数组中的最大元素,int。
  2. 未知内容:一个数组,int[]。

    public static int getMax(int[] arr) {
        int max = arr[0];
    
        for (int x = 1; x < arr.length; x++) {
            if(arr[x] > max) 
                max = arr[x];
        }
        return max;
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    获取最大值的另一种方式,可不可以将临时变量初始化为0呢?可以,这种方式其实是在初始化为数组中的任意一个角标。

    public static int getMax_2(int[] arr) {
        int max = 0;
    
        for (int x = 1; x < arr.length; x++) {
            if(arr[x] > arr[max]) 
                max = x;
        }
        return arr[max];
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    同理,获取数组中的最小值,代码如下:

    public static int getMin(int[] arr) {
        int min = 0;
    
        for (int x = 1; x < arr.length; x++) {
            if(arr[x] < arr[min]) 
                min = x;
        }
        return arr[min];
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

选择排序

虽然Java中的排序算法有很多,但在这里我只讲其中两种,即选择排序和冒泡排序。在这一小节中我用一个例子来详细讲解选择排序。 
例,对给定数组进行排序,如{5, 1, 6, 4, 2, 8, 9}。 
选择排序的原理图: 
这里写图片描述

/*
对给定数组进行排序,如{5, 1, 6, 4, 2}。

0-1 0-2 0-3 0-4
1-2 1-3 1-4
2-3 2-4
3-4
*/
public static void selectSort(int[] arr) {
    for (int x = 0; x < arr.length - 1; x++) {
        for (int y = x + 1; y < arr.length; y++) {
            if(arr[x] > arr[y]) {
                int temp = arr[x];
                arr[x] = arr[y];
                arr[y] = temp;
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

冒泡排序

在这一小节中我用一个例子来详细讲解冒泡排序。例,对给定数组进行排序,如{5, 1, 6, 4, 9, 2, 8}。 
冒泡排序的原理图: 
这里写图片描述

/*
对给定数组进行排序,如{5, 1, 6, 4, 2}。

0-1 1-2 2-3 3-4
0-1 1-2 2-3
0-1 1-2 
0-1
*/
public static void bubbleSort(int[] arr)
{
    for (int x = 0; x < arr.length - 1; x++)
    {
        for (int y = 0; y < arr.length - 1 - x; y++)
        {
            if (arr[y] > arr[y + 1])
            {
                int temp = arr[y];
                arr[y] = arr[y + 1];
                arr[y + 1] = temp;
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

发现无论什么排序,都需要对满足条件的元素进行位置置换,所以可以把这部分相同的代码提取出来,单独封装成一个函数。

public static void swap(int[] arr, int a, int b) {
    int temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
}
  • 1
  • 2
  • 3
  • 4
  • 5

那么,冒泡排序可以写为:

public static void bubbleSort(int[] arr) {
    for (int x = 0; x < arr.length - 1; x++) {
        for (int y = 0; y < arr.length - x - 1; y++) { // -x:让每一次比较的元素减少,-1:避免角标越界
            if(arr[y] > arr[y+1]) {
                swap(arr, y, y+1);
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

同理,选择排序也可以写为:

public static void selectSort(int[] arr) {
    for (int x = 0; x < arr.length - 1; x++) {
        for (int y = x + 1; y < arr.length; y++) {
            if(arr[x] > arr[y]) {
                swap(arr, x, y);
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

折半查找

。。。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yerenyuan_pku/article/details/81639241

个人分类: ● Java编程语言

相关热词: cnn第六 第六范式 ce修改器第六关 it404第六关 以太坊第六分枝

▼查看关于本篇文章更多信息

区块链开发人才稀少?薪资高到爆!八周轻松学会

区块链以太坊DApp开发是怎么炼成的?区块链的日益火爆和备受追捧,使得区块链开发人才稀缺,同时更加伴随着高薪,想要转型却不了解,特整理出学习大纲分享

java基础课程ppt

2013年05月18日 482KB 下载

JAVA 课件 复习材料

2010年11月02日 1.75MB 下载

PHP100视频教程第一季6

2010年04月25日 14.5MB 下载

小甲鱼Python第六讲课后题

pangpangyu123321

 810

小甲鱼Python第六讲课后题 1.Python 的 floor 除法现在使用 “//” 实现,那 3.0 // 2.0 您目测会显示什么内容呢? 答案:1.0,Python会严格执行floor ...

第03讲 JAVA数组.ppt

2009年10月24日 73KB 下载

《产品思维30讲》 心得第七弹——产品世界观

qq_40258499

 40

    本次与大家分析的是梁大师讲的创新模式板块:28~30讲。                                   第28讲 看产品的微观、中观与宏观视角         ...

Java常见笔试、面试系列深度剖析第六

2009年04月16日 4.11MB 下载

小甲鱼Python3学习笔记之第一讲(仅记录学习)

huashu2017

 187

第一讲:我和Python的第一次亲密接触 一、知识点: 1. 什么是IDLE? IDLE是一个Python Shell,简单来说就是一个通过键入文本与程序交互的途径,类似windows中的cmd窗...

JAVA教程 第六讲 Java的线程和Java Applet

2008年08月21日 3.55MB 下载

java第六讲随笔

xuwanli0302

 189

Java SE  第六节 1. 条件运算符(三元表达式) ,其形式为: type d = a ? b : c;  具体化形式为:int d = 2  2.  轻量级的文本编辑器:UltraEdi...

java学习第六

YX_Rows

 63

一:运算符 1.1算术运算符(+  -  *   /) 1.2 赋值运算符(=  +=  -=  *==  /==  ++  --) 列:a += b -->a = a+b; (++ 在前) ...

第六讲 JAVA API

guoli_2011

 189

 理解API的概念 API的概念(Application Programming Interface)应用程序编程接口 String类和StringBuffer类1.位于java.lang包中(直接使...

清华大学公开课线性代数2——第3讲:奇异值分解

you1314520me

 493

此博客停止更新迁移至SnailDove’s Blog,查看本文点击此处 笔记源自:清华大学公开课:线性代数2——第3讲:奇异值分解 提示:如果文中图片看不清文字,请右键单击鼠标,选择在新窗口打开图...

Java基础第六

nannan1989yue

 106

一、面向对象 1.属性    就是事物的描述信息,相当于事物身上的名词. 2.方法    就是该事物可以做什么,相当于动词 3.成员变量 1...

系统辨识及自适应控制课件第六

2011年03月23日 345KB 下载

第六讲_路由器原理与配置.ppt

2008年11月07日 1.17MB 下载

王佩丰excel2010基础教程学习笔记(第六讲到第十讲)

jianwulongquan

 61

选中数据所在区域,选择插入——数据透视表即可生成数据透视表。——将字段放入选定的区域,可以自由定制透视表。在值字段区域右键可以选择不同的显示和汇总方式。双击值字段的数据可以获取其源数据。行列字段的分组...

什么是 robotc?

ding_yingzi

 735

robotc 是一门编程语言, 官方介绍说是基于 C 语言的针对机器人的一门编程语言. 官网 http://www.robotc.net.官网提供了开发 IDE, 可以基于图形化的拖拉式编程, 也可...

第六

yishengzhiai005

 370

今天的篮球赛很厉害,班里会打篮球的好多,会打篮球的就是酷。。。 今日结果:        1  退出程序  exit(-1).   for 的另一种格式:for( k=1,i=1; str   ...

个人资料

李阿昀

已关注

原创

377

粉丝

2479

喜欢

825

评论

795

等级:

访问:

149万+

积分:

1万+

排名:

1034

勋章:

最新文章

博主专栏

展开

个人分类

展开

归档

展开

热门文章

最新评论

联系我们

客服

请扫描二维码联系客服

[email protected]

400-660-0108

QQ客服 客服论坛

关于招聘广告服务 网站地图

©2018 CSDN版权所有 京ICP证09002463号

百度提供搜索支持

经营性网站备案信息

网络110报警服务

中国互联网举报中心

北京互联网违法和不良信息举报中心

猜你喜欢

转载自blog.csdn.net/qq_42279014/article/details/81664952