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

  • Post author:
  • Post category:java




内存

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

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];



在内存中的存储

一个数组内存图

在这里插入图片描述

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

两个数组内存图

在这里插入图片描述

两个变量指向一个数组

在这里插入图片描述



数组常见操作



数组遍历

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

//循环遍历数组
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();
    }



作为方法参数和返回值



作为方法参数

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



方法参数类型区别

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

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



作为返回值

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



版权声明:本文为mengxinQWQ原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。