Java数组进阶了解

这篇博客是基于上一篇博客的补充,完善一点关于Java数组的知识。如有错误欢迎指正。

Java数组进阶了解_第1张图片

 

一、数组

1.内存分配

1.1概述

内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。必须放进内存中才能运行,运行完毕后会清空内存。 Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。而在Java中每运行一个java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Java进程对应唯一一个JVM实例,每一个JVM实例唯一对应一个堆,每一个线程有一个自己私有的栈。进程所创建的所有类的实例(也就是对象)或数组(指的是数组的本身,不是引用)都放在堆中,并由该进程所有的线程共享。Java中分配堆内存是自动初始化的,即为一个对象分配内存的时候,会初始化这个对象中变量。虽然Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在栈中分配,也就是说在建立一个对象时在堆和栈中都分配内存,在堆中分配的内存实际存放这个被创建的对象的本身,而在栈中分配的内存只是存放指向这个堆对象的引用而已。局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待GC回收。

而在Java中JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method,也叫静态区)。

1.2堆区

1.存储的全部是对象,每个对象都包含一个与之对应的class的信息(class的目的是得到操作指令) ;
2.jvm只有一个堆区(heap),且被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身和数组本身;

1.3栈区

1.每个线程包含一个栈区,栈中只保存基础数据类型本身和自定义对象的引用;
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问;
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令);

1.4方法区

1.被所有的线程共享,方法区包含所有的class(class是指类的原始代码,要创建一个类的对象,首先要把该类的代码加载到方法区中,并且初始化)和static变量。 
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

Java数组进阶了解_第2张图片

而我们需要重点记住的就是堆区和栈区。

2.遍历

2.1概念

 就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石。我们对于数组的各种操作都是建立在将数组的元素取出来上的。只有搞清楚了怎么将元素从数组中取出来我们才能更好的操作。

2.2循环遍历

一般遍历数组采取的都是使用for循环来遍历数组我也只讲这一种,另外的可以自己思考一下。

首先我们需要定义一个存有元素的数组出来

//定义数组
int a[]={1,2,3,4,5,6};

然后我们要定义一个fro循环来进行遍历,这个时候就有一个问题了我们的循环需要循环几次呐?这个时候如果我们直接定义的数组能够知道有几个元素存在里面我们就是循环几次,而我们不知道的时候就可以用一个在jdk中给我们定义好的方法.length,在点之前就是你定义的数组的名字。

//知道数组内元素的个数的定义
for (int i = 0; i < 6; i++) {
            System.out.print(a[i] + "\t");
        }
//不知道元素个数的时候
for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + "   ");
        }

注意直接使用的length是存储个数的多少,而索引是从0开始的所以我们的i不能等于元素的个数。

结果:

Java数组进阶了解_第3张图片

3.二维数组

在我们学习了一维数组之后在应用多了之后在有的时候用一维数组存东西就没有那么的方便了,而这个时候我们就需要用到一维数的升级版二维数组。

3.1定义

二维数组的定义和一维数组差不多就是多了一个框。也有两种定义方法。

//第一种定义方法
int a[][]=new int[大小][大小];
//第二种定义方法
int a[][]={{....},{....}....}

而我们可以这样来看二维数组就是二维数组的每一个元素都是一维数组,这样我们能更好的理解。

3.2二维数组的遍历

二维数组的遍历和一维数组的遍历差不多都是用循环实现只是要比一维数组多一层循环。

for(int i=0;i

4.排序

当我们学习了数组之后我们有的时候又想讲数组的元素要么从小排到大要么从大排到小,这个时候我们就需要一个东西叫排序。一般的排序分三种,冒泡,选择,插入。

4.1冒泡排序

一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面,依次对所有的数据进行操作,直至所有数据按要求完成排序,如果有n个数据进行排序,总共需要比较n-1次,每一次比较完毕,下一次的比较就会少一个数据参与。

图解:

Java数组进阶了解_第4张图片

 示例代码:

//冒泡排序
for (int i = arr.length - 1; i > 0; i--) {
            for (int j = 0; j < i; j++) {
                if (arr[j] > arr[j + 1]) {
                     temp = arr[j];
                    arr[j] = arr[j+ 1];
                    arr[j+1] = temp;
                }
            }
        }

4.2选择排序

第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

图解:

Java数组进阶了解_第5张图片

示例代码:

 

//选择排序
 for (int i = 1; i < arr.length; i++) {
             int k = 0, j;
            for (j = 0; j <= arr.length - i; j ++) {
                if (arr[k] < arr[j])
                     k = j;
            }
            if (k != j) {
                 int temp = arr[k];
                arr[k] = arr[j-1];
                arr[j-1] = temp;
            }
        }

4.3插入排序

插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法   。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。

图解:

Java数组进阶了解_第6张图片

示例代码:

 

//插入排序
for (int i = 1; i < arr.length; i++) {
            int temp = arr[i], j;
             for (j = i - 1; j >= 0; j--) {
                if (arr[j] > temp) {
                      arr[j+1] = arr[j];  
                } else {
                    break;
                }
            }
            arr[j+1] = temp;
        }

你可能感兴趣的:(java)