JavaSE——数组(2/2)-数组在计算机中的执行原理、数组案例、Debug工具的使用

简介: JavaSE——数组(2/2)-数组在计算机中的执行原理、数组案例、Debug工具的使用

数组在计算机中的执行原理

Java内存分配介绍

程序都是在内存中执行的,Java程序编译之后会产生一个class文件,然后将这个class文件提取到内存中正在运行的虚拟机里面去执行的。

Java为了便于虚拟机执行这个Java程序,它将虚拟机中的内存区域进行了划分:

  • 方法区
  • 本地方法栈
  • 程序计数器

目前重要的是关注前三块。

其中,方法区是放置我们编译之后的class文件的,也就是字节码文件。

是方法运行时所进入的内存, 由于变量是在方法里的,所以变量也是在这块内存中。

也就是说,一个类中的main方法要执行的时候,它是把main方法提到栈里面来进行执行的。

里面放的都是new出来的东西,它会在堆内存中开辟空间并产生地址。


例如数组就是放在堆内存中的。大致了解前三块区域,以后会逐个进行祥解,接下来我们了解一下数组的执行原理。

数组的执行原理

int a = 20;
int[] arr = new int[3];
  • a是变量,直接放在栈中,a变量中存储的数据就是20这个值。
  • new int[3] 是创建一个数组对象,会在堆内存中开辟区域存储3个整数。
  • arr是变量,在栈中,arr中存储的是数组对象在堆内存中的地址值。

多变量指向同一数组

当多个数组变量指向同一个数组对象时,它们存储的数组对象的地址都是一样的;因而导致多个变量修改的都是同一个数组对象中的数据。

如果某个数组变量中存储的是null值,代表这个数组变量没有指向数组对象,不能用这个数组变量去访问数据或者访问数组长度。

1、多个数组变量,指向同一个数组对象的原因是什么?需要注意什么?

  • 多个数组变量中存储的是同一个数组对象的地址。多个变量修改的都是同一个数组对象中的数据。

2、如果某个数组变量中存储的null,代表什么意思?需要注意什么?·

  • 代表这个数组变量没有指向数组对象。
  • 可以输出这个变量,但是不能用这个数组变量去访问数据或者访问数组长度,会报空指针异常:NullPointerException。

数组案例

求最大值

颜值
15 9000 10000
20000 9500 -5

找出最高颜值。

实现步骤:

  1. 把颜值数据拿到程序中去,用数组装起来。
  2. 定义一个变量用于记录最大值。(最大值初始值设为数组的第一个数据)
  3. 从第二个位置开始:遍历数组的数据,如果遍历的当前数据大于max变量存储的数据,则替换变量存储的数据为当前数据。
  4. 循环结束后输出max变量即可。
public class MaxMizing
{
    public static void main(String[] args)
    {
        //接入颜值数据
        int[] faceScores = {15,9000,10000,20000,9500,-5};
        //定义记录颜值最大值的变量,初始化为数组的第一个数据
        int Max = faceScores[0];
 
        //遍历数据找出最大值
        for(int i = 1; i < faceScores.length; i++)
        {
            if(faceScores[i] > Max)
            {
                Max = faceScores[i];
            }
        }
        System.out.println("最高颜值是:" + Max);
    }
}

数组反转

需求

某个数组有5个数据:10,20,30,40,50,请将这个数组中的数据进行反转。

反转前: [ 10,20,30,40,50 ]

反转后: [ 50,40,30,20,10 ]

数组的反转操作,实际上就是依次前后交换数据即可实现。

public class ReverseArray
{
    public static void main(String[] args)
    {
        //准备需求中的数组
        int[] arr = {10,20,30,40,50};
 
        //循环依次交换数组第一个和最后一个的数据
        int i,j;
        for(i = 0,j = arr.length - 1; i < j;i++,j--)
        {
            //交换数据(可以有多种方法)
            arr[i] = arr[i] ^ arr[j];
            arr[j] = arr[i] ^ arr[j];
            arr[i] = arr[i] ^ arr[j];
        }
 
        //输出反转之后的数组
        for(int a = 0; a < arr.length; a++)
        {
            System.out.print(arr[a] + " ");
        }
    }
}

随机排名

需求

某公司开发部5名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。请先依录入5名员工的工号,然后展示出一组随机的排名顺序。

  1. 在程序中录入5名员工的工号存储起来--->使用动态初始化数组的方式。
  2. 依次遍历数组中的每个数据。
  3. 每遍历到一个数据,都随机一个索引值出来,让当前数据与该索引位置处的数据进行交换。
import java.util.Random;
import java.util.Scanner;
 
public class RandomRanking
{
    public static void main(String[] args)
    {
        //先定义一个动态初始化的数组
        int[] codes = new int[5];
 
        //提示用户录入5名员工的工号
        Scanner sc = new Scanner(System.in);
        int i;
        for(i = 0; i < codes.length;i++)
        {
            System.out.println("请您输入当前第" + (i + 1) + "个员工的工号:");
            int code = sc.nextInt();
            codes[i] = code;
        }
 
        //将数组打乱
        Random r = new Random();
        for(i = 0; i < codes.length;i++)
        {
            int index = r.nextInt(codes.length); // 0-4
            int temp = codes[index];
            codes[index] = codes[i];
            codes[i] = temp;
        }
 
        //输出打乱后的员工工号
        for (i = 0; i < codes.length;i++)
        {
            System.out.print(codes[i] + " ");
        }
    }
}

Debug工具的使用

  • IDEA自带的断点调试工具,可以控制代码从断点开始一行一行的执行,然后详细观看程序执行的情况。

基本使用步骤

  1. 在需要控制的代码行左侧,点击一下,形成断点
  2. 选择使用Debug方式启动程序,启动后程序会在断点暂停
  3. 控制代码一行一行的往下执行


END



目录
相关文章
|
开发框架 .NET C#
c#数组补充
c#数组的几个简单的补充
45 0
|
6月前
|
Java
JavaSE——方法(1/2)-介绍、方法的各种形式、使用的要求
JavaSE——方法(1/2)-介绍、方法的各种形式、使用的要求
34 5
|
6月前
|
存储 Java 索引
JavaSE——数组(1/2)-数组的定义和访问(静态初始化数组、动态初始化数组、案例练习)
JavaSE——数组(1/2)-数组的定义和访问(静态初始化数组、动态初始化数组、案例练习)
47 7
|
6月前
|
存储 Java 索引
JavaSE——集合框架一(7/7)-Collection集合的总结、集合的并发修改异常问题(案例引入、for循环-解决方法、迭代器-解决方法、小结)
JavaSE——集合框架一(7/7)-Collection集合的总结、集合的并发修改异常问题(案例引入、for循环-解决方法、迭代器-解决方法、小结)
51 0
|
7月前
|
索引 Python
Python 列表查找元素位置的高级函数代码程序设计
Python中,要查找list列表中元素的位置,即元素在列表中的索引位置,可以使用list列表类型内置的方法index(),但这个并不能直接使用,因为要考虑到查找的元素可能并不存在于list列表之中,而使用index()方法查找列表中并不存在的元素,Python将抛出ValueError,程序也可能因此终止,为了避免这种情况
90 3
|
搜索推荐 Java 索引
【JavaSE】Java基础语法(二十三):递归与数组的高级操作
1. 递归 1.1 递归 递归的介绍 以编程的角度来看,递归指的是方法定义中调用方法本身的现象 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算
|
缓存 Java
JDK源码(10)-Integer(用处最多,重点讲解)
JDK源码(10)-Integer(用处最多,重点讲解)
120 0
|
Java
java学习第四天笔记-循环高级和数组94-数组的地址值和元素访问
java学习第四天笔记-循环高级和数组94-数组的地址值和元素访问
84 0
java学习第四天笔记-循环高级和数组94-数组的地址值和元素访问
|
Java
java学习第五天笔记-循环高级和数组104-数组的内存图3
java学习第五天笔记-循环高级和数组104-数组的内存图3
84 0
java学习第五天笔记-循环高级和数组104-数组的内存图3
|
Java
java学习第五天笔记-循环高级和数组103-数组的内存图2
java学习第五天笔记-循环高级和数组103-数组的内存图2
71 0
java学习第五天笔记-循环高级和数组103-数组的内存图2