首页 > 编程语言 >Java学习笔记(四)java数组

Java学习笔记(四)java数组

时间:2023-03-04 23:13:12浏览次数:29  
标签:Java int System 笔记 arrays 数组 println java out

学习笔记4

Java数组

一、什么是数组

  1. 数组是相同类型数据的有序集合
  2. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成
  3. 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们

二、数组的声明和创建

1. 声明与创建

  1. 首先必须声明数组变量,才能在程序中使用数组,语法如下:
dataType[] arrayRefVar;		//首选的方法
//或
dataType arrayRefVar[];		//效果相同,但不是首选方法
  1. Java语言使用new操作符来创建数组,语法如下:
dataType[] arrayRefVar  = new dataType[arraySize];
  1. 数组的元素是通过索引访问的,数组索引从0开始。

  2. 获取数组长度

    arrays.length
    
  3. 例:

package com.tyrantblue.array;

public class ArrayDemo01 {
    public static void main(String[] args) {
        //变量的类型     变量的名字   =   变量的值;
        //数组类型

        int[] nums;//1.声明一个数组

        //int nums[] ;是早年为了让c和cpp程序员快速适应java而存在

        nums = new int[10];//2.创建一个数组
        
        //声明和创建可以结合在一起
        //int[] nums = new int[10];
        
        //3.给数组元素中赋值
        nums[0] = 1;
        nums[1] = 2;
        nums[2] = 3;
        nums[3] = 4;
        nums[4] = 5;
        nums[5] = 6;
        nums[6] = 7;
        nums[7] = 8;
        nums[8] = 9;
        nums[9] = 10;

        //计算所有元素的和
        int sum = 0;

        //获取数组长度    arrays.length
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }

        System.out.println("数组所有元素之和为:"+sum);
    }
}

2. 内存分析

1. **堆**:存放new的对象和数组,可以被所有的线程共享,不会存放别的对象引用
1. **栈**:存放基本变量类型(会包含这个基本类型的具体数值)和引用对象的变量(会存放这个引用在堆里的具体地址)
1. **方法区**:可以被所有的线程共享,包含了所有的class和static变量
1. **声明时先在栈里创建一个数组(是引用数据类型)的具体地址,在堆里还不存在;初始化时在堆里创建数组的具体值**

3. 三种初始化

  1. 静态初始化
int[] a = {1,2,3};
Man[] mans = {new Man(1,1),new Man(2,2)}
  1. 动态初始化
int[] a = new int[2];
a[0] = 1;
a[1] = 2;
  1. 默认初始化
    • 数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
  2. 例:
package com.tyrantblue.array;

public class ArrayDemo02 {
    public static void main(String[] args) {

        //静态初始化: 创建 + 赋值
        int[] num = {1,2,3,4,5,6,7,8,9,10};
        System.out.println(num[0]);

        //动态初始化:包含默认初始化
        int[] num2 = new int[10];
        num2[0] = 10;
        System.out.println(num2[0]);
        System.out.println(num2[1]);//有一个默认值
        System.out.println(num2[2]);//有一个默认值
        System.out.println(num2[3]);//有一个默认值
    }
}

4. 数组的四个基本特点

  1. 其长度是确定的,数组一旦被创建,它的大小就是不可改变的。
  2. 其数组必须是相同类型,不允许出现混合类型。
  3. 数组中的元素可以是任何数据类型,包括基本类型和引用类型。
  4. 数组变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本省就是对象,Java中对象是在堆中的,阴恻数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。
  5. 数组的边界问题
    • 下标的合法区间:[0, length-1],如果越界就会报错;
public static void main(String[] args){
    int[] a = new int[2];
    System.out.println(a[2]);
}

//ArrayIndexOutOfBoundsException: 数组下标越界异常!!!

ArrayIndexOutOfBoundsException: 数组下标越界异常!!!

三、数组使用

  1. 普通的for循环
  2. for each循环
  3. 数组作方法入参
  4. 数组作返回值
  5. 例:
package com.tyrantblue.array;

public class ArrayDemo03 {
    public static void main(String[] args) {
        int[] arrays = {1,2,3,4,5};

        //打印全部的数组元素
        for (int i = 0; i < arrays.length; i++) {
            System.out.println(arrays[i]);
        }
        System.out.println("======================");

        //计算所有元素的和
        int sum = 0;
        for (int i = 0; i < arrays.length; i++) {
            sum += arrays[i];
        }
        System.out.println("总和为"+sum);

        System.out.println("======================");
        //查找最大元素
        int max = arrays[0];
        for (int i = 1; i < arrays.length; i++) {
            if (max<arrays[i]){
                max = arrays[i];
            }
        }
        System.out.println("最大值为:"+max);
    }
}
package com.tyrantblue.array;

public class ArrayDemo04 {
    public static void main(String[] args) {
        int[] arrays = {1,2,3,4,5};
        PrintArray(Reversr(arrays));
        System.out.println();
        PrintArray1(arrays);
        
    }

    //打印数组元素方法
    public static void PrintArray(int[] arrays){
        for (int i = 0; i < arrays.length; i++) {
            System.out.print(arrays[i]+"\t");
        }
    }

    //for each, JDK1. 5 增强型的for循环,没有下标
    public static void PrintArray1(int[] arrays){
        for (int array: arrays) {
            System.out.print(array+"\t");
        }
    }

    //反转数组
    public static int[] Reversr(int[] arrays){
        int[] result = new int[arrays.length];

        //反转操作
        for (int i = 0; i < arrays.length; i++) {
            result[i] = arrays[arrays.length-1-i];
        }

//        //和上面没有什么区别
//        for (int i = 0,j = arrays.length-1; i < arrays.length; i++,j--) {
//            result[i] = arrays[j];
//        }
        return result;
    }
}

四、多维数组

  1. 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。
  2. 二维数组
int a[][] = new int[2][5];
//可以看成一个两行五列的数组
  1. 例:
package com.tyrantblue.array;

public class ArrayDemo05 {
    public static void main(String[] args) {

//        int[][] arrays = new int[2][5];
        int[][] arrays = {{1,2},{2,3},{2,4},{4,5}};
        printArray(arrays[1]);
        System.out.println("==========================");
        
        //循环打印整个二维数组
        for (int i = 0; i < arrays.length; i++) {
            for (int j = 0; j < arrays[i].length; j++) {
                System.out.println(arrays[i][j]);
            }
        }
    }

    //打印数组元素方法
    public static void printArray(int[] arrays){
        for (int i = 0; i < arrays.length; i++) {
            System.out.print(arrays[i]+"\t");
        }
    }
}

五、Arrays类

  1. 数组的工具类java.util.Arrays
  2. 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。
  3. 查看JDK帮助文档
  4. Arrays类中的方法都是static修饰的静态方法,在使用时可以直接使用类名进行调用,而“不用”使用对象来调用(不用而非不能)
  5. 常用功能:
    1. 给数组赋值:fill方法
    2. 给数组排序:sort方法,升序
    3. 比较数组:通过equals方法比较数组中元素值是否相等
    4. 查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作
  6. 例子
package com.tyrantblue.array;

import java.util.Arrays;

public class ArrayDemo06 {
    public static void main(String[] args) {
        int[] a = {1,7,3,56,91,1257,6,7,2};

        System.out.println(a);//[I@1b6d3586
        System.out.println("================");

        //打印数组元素Arrays.toString(arrays)
        System.out.println(Arrays.toString(a));
        System.out.println("================");

        printArray(a);
        System.out.println("================");

        //数组排序Arrays.sort(arrays)
        Arrays.sort(a);
        System.out.println(Arrays.toString(a));
        System.out.println("================");

        //数组排序Arrays.fill(arrays)
        Arrays.fill(a,2,4,0);//包括2和3
        System.out.println(Arrays.toString(a));
    }

    public static void printArray(int[] arrays){
        System.out.print("[");
        for (int i = 0; i < arrays.length; i++) {
            if (arrays == null){
                System.out.println("null");
            } else if (i<arrays.length-1){
                System.out.print(arrays[i]+", ");
            } else {
                System.out.print(arrays[i]+"]");
            }
        }
        System.out.println();
    }
}

六、冒泡排序

八大排序算法之一,是最出名的排序算法

例:

package com.tyrantblue.array;

import java.util.Arrays;

public class ArrayDemo07 {

    //冒泡排序
    public static void main(String[] args) {
        int[] arrays = {10,52,6,2,33,1,6,2,14,52,534,2,523,};
        change(arrays);
        System.out.println(Arrays.toString(change(arrays)));

    }

    //相邻两个比较,将大的放到后面
    //每一轮比较都会产出一个最大或者最小的数字
    //下一轮会比上一轮比较次数少一
    //升序示例
    public static int[] change(int[] arrays){

        for (int i = 0; i < arrays.length; i++) {

            //优化:增加一个flag标志,如果有一轮已经没发生交换,那么就没必要就进行之后的比较
            boolean flag = true;

            for (int j = 0; j < arrays.length-1-i; j++) {

                //将大的往后放,网每轮的前进方向堆叠
                if (arrays[j]>arrays[j+1]){
                    int t = 0;
                    t = arrays[j];
                    arrays[j] = arrays[j+1];
                    arrays[j+1] = t;
                    flag = false;
                }
            }
            if (flag) {
                break;
            }
        }
        return arrays;
    }
}

七、稀疏数组

  1. 稀疏数组是一种数据结构。

  2. 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。

  3. 稀疏数组的处理方式是:

    • 记录数组一共有几行几列,有多少个不同值
    • 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
  4. 例:

package com.tyrantblue.array;

import java.util.Arrays;

public class ArrayDemo08 {
    public static void main(String[] args) {

        //1. 创建一个二维数组 11*11  0:没有棋子  1:黑棋   2:白棋
        int[][] array1 = new int[11][11];
        array1[1][2] = 1;
        array1[2][1] = 2;


        //输出原始的数组
        System.out.println("输出原始的数组");

        for (int[] ints : array1) {
            for (int anInt : ints ) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }

        System.out.println("==========================");

        //转换为稀疏数组
        //获取有效值的个数
        int sum = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (array1[i][j] != 0 ){
                    sum ++;
                }
            }
        }

        //创建一个稀疏数组的数组
        int[][] array2 = new int[sum+1][3];

        array2[0][0] = 11;
        array2[0][1] = 11;
        array2[0][2] = sum;

        //遍历二维数组,将非零的值存放于稀疏数组中
        int count = 0;
        for (int i = 0; i < array1.length; i++) {
            for (int j = 0; j < array1[i].length; j++) {
                if (array1[i][j] != 0) {
                    count++;
                    array2[count][0] = i;
                    array2[count][1] = j;
                    array2[count][2] = array1[i][j];

                }
            }
        }
        //输出稀疏数组
        System.out.println("稀疏数组");

        for (int[] ints : array2) {
            for (int anInt : ints ) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }

        System.out.println("==========================");

        //通过稀疏数组复原数组
        int[][] array3 = new int[array2[0][0]][array2[0][1]];

        for (int i = 1; i < array2.length; i++) {
            array3[array2[i][0]][array2[i][1]] = array2[i][2];
        }

        //输出复原的数组
        System.out.println("输出原始的数组");

        for (int[] ints : array1) {
            for (int anInt : ints ) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }


    }
}

标签:Java,int,System,笔记,arrays,数组,println,java,out
From: https://www.cnblogs.com/tyrantblue/p/17179446.html

相关文章

  • 二分图学习笔记
    P2055这是一道一眼题。二分图,是一一对应的关系,所以用于本题一床给一人是最合适不过的。P6062非常荣幸的,CSP考完我还毫无头绪,而现在却有了思路。这题是结论与二分图思......
  • Java基础——接口和抽象类异同及其特点
     抽象类链接:https://www.runoob.com/java/java-abstraction.html接口链接:https://www.runoob.com/java/java-interfaces.html......
  • Java_内部类
    Java内部类成员内部类内部类在外部使用时,无法直接实例化,需要借由外部类信息才能完成实例化内部类的访问修饰符,可以任意,但是访问权限会收影响。内部类可以直接访问......
  • Attempt to invoke virtual method ‘java.lang.String android.os.Bundle.getString(
    报错日志java.lang.NullPointerException:Attempttoinvokevirtualmethod'java.lang.Stringandroid.os.Bundle.getString(java.lang.String)'onanullobjectref......
  • 6.JavaScript异常处理的方式,统一的异常处理方案
    一般来说有两种处理方式①抛出异常functionopenFile(fileName){if(!exists(fileName)){thrownewError('找不到文件'+fileName)}//...}②捕......
  • java代码审计-命令执行
    0x01前言在Java中可用于执行系统命令常见的方式有两种,API为:java.lang.Runtime、java.lang.ProcessBuilder0x02java.lang.Runtime@GetMapping("/runtime/exec")pu......
  • 2023/3/4 C#学习笔记
    调试方法1、调试工具栏,逐语句stepinto,逐过程stepover,跳出stepout;编写方法2、VisualStudio的重构代码功能:要在应用程序中多个位置写相同的或非常相似的代码时,选定方......
  • 5.JavaScript提供的正则表达式API、可以使用正则表达式解决常见问题(邮箱校验、URL解析
    JavaScript提供的正则表达式API、可以使用正则表达式解决常见问题(邮箱校验、URL解析、去重等)js正则常用API1.五个常用方法①testreg.test(str);//返回是否包含正则......
  • 学习Java需要掌握的基本概念和技能
    Java基础语法:基础语法包括:变量、数据类型、运算符、控制结构等面向对象编程:掌握面向对象编程思想,包括:类和对象、封装、继承、多态。JavaAPI:了解Javaapi的基本使用,熟悉......
  • Java基本数据类型和引用数据类型
    基本数据类型:byte,short,int,long,float,double,boolean,char引用数据类型:类(class),接口(interface),数组([])......