欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java学习(自用,不定期更新)(二)

程序员文章站 2022-03-10 16:51:55
...

内存

内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。

Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。

JVM内存划分

区域名称 作用
寄存器 给CPU使用,和我们开发无关。
本地方法区 JVM在使用操作系统功能的时候使用,例如native修饰的内容,和我们开发无关。
方法区 存储可以运行的class文件。
堆内存 存储对象或者数组,new来创建的,都存储在堆内存。
栈内存 方法运行时使用的内存,比如main方法运行,进入栈内存中执行。

补充:

  • 栈内存:栈内存主要是用来运行函数的,在函数中定义的所有变量,都会在这个内存开辟空间。
    在栈内存中定义的变量,不初始化,是不能直接使用的。
    注意:所有的函数(方法)都必须在栈内存中运行。
    而jvm只会运行处于栈内存顶部的函数。
    函数被加载到栈内存的动作,称为函数的压栈(入栈)。
    函数执行完之后就会从栈中消失(函数的弹栈,或者叫做出栈)

  • 堆内存:在程序中使用new 关键字创建出来的所有东西,都会保存在堆内存中。
    堆内存中开辟的空间,不赋值,都会有默认的初始化数据。
    整数:默认是0
    小数 默认0.0.
    boolean 默认是false
    char 默认是 ‘\u0000’
    引用数据类型默认值是 null

  • 方法区:JVM在加载class文件的时候,所有的class文件就要加载在这个内存中。

数组

一次性可以开辟出一组空间,然后这些空间中可以保存多个数据。而我们把这一组空间统称为数组。
数组表示的一串连续的存储空间。每个空间中都可以保存一个数据。当我们需要操作的时候,不要去面对单个空间,而直接面对这个整体的连续的存储区域。

注意:数组既可以存储基本数据类型,也可以存储引用数据类型。

定义

 //数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度];
 int [] arr = new int[5];

格式详解:

  • 数组存储的数据类型: 创建的数组容器可以存储什么数据类型。
  • [] : 表示数组。
  • 数组名字:为定义的数组起个变量名,满足标识符规范,可以使用名字操作数组。
  • new:关键字,创建数组使用的关键字。
  • 数组存储的数据类型: 创建的数组容器可以存储什么数据类型。
  • [长度]:数组的长度,表示数组容器中可以存储多少个元素。
  • 注意:数组有定长特性,长度一旦指定,不可更改。

访问

索引

每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。

//数组名[索引]
arr[0];

数组的长度:每个数组都具有固定的长度,Java中 数组名.length 可以获取到数组的长度。
由于数组都是由0开始计算长度,所以数组的最大索引值为 数组名.length-1。

通过索引访问数组中的元素:

//数组名[索引]=数值,为数组中的元素赋值
arr[1] = 10;
//变量=数组名[索引],获取出数组中的元素
max = arr[2];

在内存中的存储

一个数组内存图
Java学习(自用,不定期更新)(二)

  • 输出arr[0],就会输出arr保存的内存地址中数组中0索引上的元素

两个数组内存图
Java学习(自用,不定期更新)(二)
两个变量指向一个数组
Java学习(自用,不定期更新)(二)

数组常见操作

数组遍历

将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石。

//循环遍历数组
for(int i=0;i<数组名.length;i++){//数组索引从0开始,最大值为长度-1
	System.out.println(arr[i]);
}

求数组最值

对数组求最值的时候,一般我们会假设一个值为最大值或者最小值,然后遍历数组中的所有空间,和假设的这个值进行大小比较,只要从数组中取出的值比假设的值大 或者 小, 就进行替换。
最终把数组遍历完成,就能找到最大值 或者 最小值。
注意:一般要求假设的这个值一定是数组中存在的值。

 public static void minarr(){
        int[] arr= new int[]{15,5,88,99,55};
        int min = arr[0];//判断数需要是数组内元素
        //遍历数组,取出每个元素
        for(int i = 0; i<arr.length;i++){
        //遍历到的元素和变量min比较
        //如果数组元素小于min
            if(min>arr[i]){
                min = arr[i];
            }
        }
        System.out.println(min);
    }
    //在主方法中调用
    public static void main(String[] args) {
        minarr();
    }

数组反转

数组中的元素颠倒顺序,例如原始数组为1,2,3,4,5,反转后的数组为5,4,3,2,1
思路:数组最远端的元素互换位置。

  • 实现反转,就需要将数组最远端元素位置交换
  • 定义两个变量,保存数组的最小索引和最大索引
  • 两个索引上的元素交换位置
  • 最小索引++,最大索引–,再次交换位置
  • 最小索引超过了最大索引,数组反转操作结束
public static void ReversalArr(){
       int[] arr = { 1, 2, 3, 4, 5 };
    /*
      循环中定义变量min=0最小索引
      max=arr.length-1最大索引
      min++,max--
      */
    for (int min = 0, max = arr.length - 1; min <= max; min++, max--) {
        //利用第三方变量完成数组中的元素交换
        int temp = arr[min];
        arr[min] = arr[max];
        arr[max] = temp;
    }
    // 反转后,遍历数组
    for (int i = 0; i < arr.length; i++) {
    	System.out.println(arr[i]);
    }
    }
public static void main(String[] args) {
    ReversalArr();
}

反向显示数组
由最大索引开始变量,依次向前

 public static void ReversalArr(){
        int[] nums = {1,2,3,4};
        //数组个数为长度减一
        for(int i = nums.length-1;i>=0;i--){
            System.out.println(nums[i]);
        }
    }
     //在主方法中调用
    public static void main(String[] args) {
        ReversalArr();
    }

作为方法参数和返回值

作为方法参数

数组作为方法参数,传递的是数组内存的地址(十六进制)

方法参数类型区别

方法的参数为基本类型时,传递的是数据值。

方法的参数为引用类型时,传递的是地址值。

作为返回值

数组作为返回值,返回的是数组的内存地址(十六进制)