Java数组进阶了解

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

 

一、数组

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变量。

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

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不能等于元素的个数。

结果:

3.二维数组

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

3.1定义

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

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

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

3.2二维数组的遍历

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

for(int i=0;i<a.length;i++){
            for(int j=0;j<a[i].length;j++){
                System.out.println(a[i][j]);
            }
        }

4.排序

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

4.1冒泡排序

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

图解:

 示例代码:

//冒泡排序
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选择排序

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

图解:

示例代码:

 

//选择排序
 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的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。

图解:

示例代码:

 

//插入排序
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;
        }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java数组进阶答案主要包括以下几个方面: 1. 数组初始化: 数组的初始化可以通过静态初始化和动态初始化两种方式。静态初始化是指在定义数组的同时为其赋初值,而动态初始化则是在定义数组后通过循环或方法来为其赋值。 2. 数组遍历: 数组遍历可以使用for循环、增强for循环或者使用Arrays类的toString()方法来实现。其中,使用增强for循环遍历数组更为简洁,可以直接获取数组中的元素。 3. 多维数组Java支持多维数组,例如二维、三维甚至更高维的数组。多维数组的初始化和访问方式与一维数组类似,只是需要嵌套使用多个方括号表示维数。 4. 数组排序: 数组排序可以使用Arrays类提供的sort()方法进行排序。该方法可以实现升序排序和降序排序,默认为升序排序。如果要对自定义类的数组进行排序,则需要实现Comparable接口或者使用Comparator类进行比较。 5. 数组复制: Java提供了System类的arraycopy()方法用于数组的复制。该方法可以在不同的数组之间进行复制,并可以指定起始位置和复制长度。 6. 数组的常用方法: Java提供了一些常用的数组方法,如获取数组长度的length属性、查找指定元素的索引的indexOf()方法、判断数组是否包含指定元素的contains()方法等。 除了上述内容,还有一些其他的数组进阶知识,如数组的扩容与缩容、数组的反转、数组的截取等。熟练掌握这些知识,可以更好地应用数组解决实际问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值