Javase | 数组、数组工具类

news2024/10/7 17:28:40

目录:

    • 1.数组
    • 2.数组的 “存储结构”
    • 3.数组的优缺点:
      • 3.1 数组的优点
      • 3.2 为什么数组的检索效率高?
      • 3.3 数组的缺点
    • 4.一维数组
      • 4.1 一维数组的“存储结构”
      • 4.2 一维数组的“静态初始化”
      • 4.3 一维数组的“动态初始化”
      • 4.4 一维数组的“遍历”
    • 5.数组的“扩容”
    • 6.二维数组
      • 61. 二维数组
      • 6.2 二维数组的“遍历”
    • 7.Arrays工具类:
      • String toString( T [ ] array )
      • void sort( T [ ] array )
      • void sort( T[ ] a , Comparator<? super T> c) (降序排列)
      • int binarySearch( T[ ] array, T key)
      • int binarySearch( T[ ] array , int fromIndex, int toIndex, T key)
      • void fill( T[ ] array, T value)
      • void fill( T[ ] array, int fromIndex, int toIndex, T value)
      • boolean equals (T[ ] array1, T[ ] array2)
      • T[ ] copyOf( T[ ] original, int newLength)
      • T[ ] copyOfRange( T[ ] original, int fromIndex, int toIndex)

1.数组

  1. 数组是一种引用数据类型不属于基本数据类型,因而数组对象是存储在堆内存中。 数组的父类Object
  2. 数组实际上是一个容器,可以同时存储 (引用数据类型) 多个数据/元素。或者 也可同时存储 (基本数据类型) 多个数据/元素。(数组是“一组数据”的集合。)
  3. 数组当中如果存储是“Java对象”的话,实际上存储的是对象的引用 / 对象的内存地址
  4. 数组一旦创建长度不可变
  5. 所有数组对象都有length属性 (Java自带的),用来获取数组中元素的个数
  6. 数组的分类:一维数组、二维数组、三维数组、多维数组。

2.数组的 “存储结构”

  1. 数组在内存中进行存储时,数组元素的内存地址是连续/相连 的。
    (存储中的元素都是有规则的挨着排列的,内存地址连续 )
  2. 数组中第一个元素的“内存地址” 就是这个数组对象内存地址
  3. 数组中每一个元素都是有下标的,以1递增,最后一个元素的下标是length-1

3.数组的优缺点:

3.1 数组的优点

  1. 查询/查找/检索某个下标的元素时效率极高,是查询效率最高的一个数据结构。
  2. 数组的检索效率高

3.2 为什么数组的检索效率高?

  • 每一个元素的内存地址在空间存储上是连续的,数组中每一个元素类型相同、占用空间大小一样。
  • 如果知道第一个元素的内存地址,可通过下标 + 数学表达式计算出某个下标元素的内存地址,直接通过内存地址定位元素,所以数组的检索效率最高。
    (数组中存储100个元素,或者存储100万个元素,在元素查询/检索方面,效率是相同的,因为数组中元素查找时不会一个一个找,是通过数学表达式算出来的)

3.3 数组的缺点

  1. 由于为了保证数组每个元素的的内存地址连续,所以在数组随机删除或增加元素时,效率较低,因为随机删除元素会涉及到后面元素统一向前或向后位移的操作。
  2. 数据不能存储大数据量,因为很难在内存空间上找到一块特别大的且连续的内存空间。
  3. 注意:
    对于数组中最后一个元素的增删,是没有效率影响的。

4.一维数组

4.1 一维数组的“存储结构”

在这里插入图片描述

4.2 一维数组的“静态初始化”

 //声明一个int类型的数组,使用静态初始化的方式
    int[] a = {1, 100, 200, 300, 400, 500};
   //所有数组对象都有length属性
    System.out.println("数组中元素个数为: "+a.length);
    //数组中每一个元素都有下标,通过下标对数组中的元素进行存和取
    //取(读)
    System.out.println("数组中第一个元素: "+a[0]); // 1
    System.out.println("数组中最后一个元素: "+a[a.length-1]); // 500

    //存(改)
    //把第一个元素改为123
    a[0] = 123;
    //把最后一个元素改为111
    a[a.length - 1] = 111;		

4.3 一维数组的“动态初始化”

  • int [ ] arr =new int[5] ; //这里的5表示元素个数。 初始化一个5个长度的int类型数组,每个元素默认值为0。
  • String [ ] names = new String[6] ; //初始化6个长度的String类型数组,每个元素默认值为null。
  • 例子如:
        /**
         * 数据类型     默认值
         * ----------------
         * byte        0
         * short       0
         * int         0
         * long        0L
         * float       0.0F
         * double      0.0
         * boolean     false
         * char        \u0000
         * 引用数据类型   null
         */
         //动态创建一维数组
   int [] a = new int[4];  //创建一个长度为4的int数组,数组中的默认值为0
   //遍历数组
   for (int i = 0; i < a.length;i++) {
    System.out.println(a[i]);
}

4.4 一维数组的“遍历”

   //声明一个int类型的数组, “静态初始化” 一维数组
        int[] a = {1, 100, 200, 300, 400, 500}; //下标0-5

        //一维数组的遍历
        // a.length =6 (数组长度/数组元素 : 6) , 下标最大为5
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]); //i是下标,从0到5
        }


        /**
         *  从最后一个元素遍历到第一个元素
         *  数组长度为: a.length : 6 (6个元素)
         *  下标最大长度为: a.length-1 : 5 (因为下标是从0开始的,0 1 2 3 4 5 : 此时就已有6个元素,所以下标最大长度为5)
         */

        for (int i=a.length-1; i>=0; i--) {
            System.out.println("颠倒顺序输出:"+ a[i]); //i是下标,从0到5
        }


        /**
         * 这段代码会报错
         *
         * 下标为6表示第7个元素,a[]数组中下标只能到5(只有6个元素)
         */
        System.out.println(a[6]);  //“数组下标越界” 异常

5.数组的“扩容”

  • Java中 数组的扩容:先新建一个大容量数组,然后将小容量的数组中的数据一个一个拷贝大数组中。

  • 数组扩容效率较低,因为涉及到 数组的拷贝

    例子如:

    	    //数组的扩容/数组的拷贝
            //拷贝源 (从这个数组进行拷贝)
            int[] src = {1, 2, 3, 4, 5};
    
            //拷贝目标 (拷贝到这个数组上)
            int[] dest = new int[20]; //动态初始化数组
    
            //调用JDK  System中的 arraycopy()方法,完成数组的拷贝
            /**
             * 参数代表的含义分别为:  拷贝源、开始拷贝的下标、拷贝目标、拷贝到的数组的下标、拷		 * 的长度/数量
             */
            System.arraycopy(src, 1, dest, 3, 2);
    
            //拷贝数组中所有数据
            System.arraycopy(src, 0, dest, 0, src.length);
    
            for (int i = 0; i < dest.length; i++) {
                System.out.println(dest[i]);
            }
    

6.二维数组

61. 二维数组

  • 二维数组是是一个“特殊的一维数组”, 二维数组中每一个元素都是“一个一维数组”。
  • a[二维数组中的一维数组的下标][一维数组的下标]
  • a[一维数组的下标][一维数组中元素的下标]
/**
 * 关于二维数组的: 读和改
 *  a[二维数组中的一维数组的下标][一维数组的下标]
 *  a[一维数组的下标][一维数组中的元素的下标]
 *  a[0][0] :表示第一个一维数组中的第一个元素。
 *  a[3][100] :表示第四个一维数组中的第101个元素。
*/
public class ArrayTest3 {
 public static void main(String[] args) {
     //二维数组
     int [][] a ={ {34,4,65}, {100,200,300},{0}};

     //获得二维数组中的 “第一个一维数组”
     int[] a1 = a[0];

     //获得二维数组中的 “第一个一维数组中的第一个元素”
     int a2 =a[0][0];
     System.out.println(a2);
 }
}

6.2 二维数组的“遍历”

public class ArrayTest3 {
    /**
     *  a[一维数组的下标][一维数组中的元素的下标]
     *  第一个[]:负责遍历二维数组
     *  第二个[]:负责遍历一维数组
     */
    public static void main(String[] args) {
        //二维数组
        String[][] array ={
                {"张三","李四","王五"},
                {"Java","python","php","C++"},
                {"Jack","roe","jack"}
        };

        //遍历二维数组
        for (int i = 0; i < array.length; i++) {
            //负责遍历一维数组
            //a[二维数组中的一维数组的下标][一维数组中的元素的下标]
            for (int j = 0; j < array[i].length;j++) {
                //遍历一维数组中的具体的元素
                //输出二维数组中的每一个一维数组中的每一个元素
                System.out.println(array[i][j]); 
            }
        }
    }
}

7.Arrays工具类:

String toString( T [ ] array )

  • String toString( T [ ] array )数组转换为字符串

  • 该方法将数组的内容字符串的形式返回,这个字符串中元素用逗号分隔,最外层用[ ]包裹。
    如: [“123”,“12345”]

  • String toString( T [ ] array )可用于任何类型数组,包括基本数据类型和引用数据类型。

    例子如 :

      Integer[] numbers = { 5, 2, 8, 1, 7 };
      String[] s = {"123", "HelloWorld"};
      char[]c = {'a', 'b', 'c'};
      double[] f = {12.123, 13.14};
    
      System.out.println(Arrays.toString(numbers));   // [5, 2, 8, 1, 7]
      System.out.println(Arrays.toString(s));         // [123, HelloWorld]
      System.out.println(Arrays.toString(c));         // [a, b, c]
      System.out.println(Arrays.toString(f));         // [12.123, 13.14]
    

void sort( T [ ] array )

  • void sort( T [ ] array )
    数组中的数据进行 升序排序

       Integer[] numbers = { 5, 2, 8, 1, 7 };
    
       // [5, 2, 8, 1, 7]
       System.out.println("排序前的数组: " + Arrays.toString(numbers)); 
    
       //升序排列
       Arrays.sort(numbers);
       // [1, 2, 5, 7, 8]
       System.out.println("排序后的数组: " + Arrays.toString(numbers)); 
    

void sort( T[ ] a , Comparator<? super T> c) (降序排列)

  • void sort( T[ ] a , Comparator<? super T> c)
    使用自定义比较器对 “数组中数据”进行 降序排序
/**
   * 使用 “自定义比较器” 降序排列
*/
Integer[] numbers = {6, 2, 8, 1, 50}; //静态初始化
Arrays.sort(numbers, new Comparator<Integer>() {
@Override
public int compare(Integer num1, Integer num2) {
return num2 - num1; // 降序排列
}
});

// Arrays.toString() : 将"数组" 转换为 “字符串”
System.out.println(Arrays.toString(numbers)); // [50, 8, 6, 2, 1]

int binarySearch( T[ ] array, T key)

  • binarySearch( T[] array, T key)
    有序数组 中使用
    二分查找算法
    来查找 指定元素的索引位置/下标值。 该方法返回为该指定元素的索引值 或 (-(插入点) -1 )。它可以应用于各种基本类型数组对象类型数组

  • 使用该方法的前提是:该数组是有序的,可用 sort(int[ ]) 方法排序。

  • 如果指定元素在数组中,则返回该元素的索引值

  • 如果指定元素 不在数组中,则返回 (-(插入点) -1 )。插入点被定义为:将键插入到数组的那一点,即第一个大于此键的元素索引如果数组中所有元素都小于指定的键,则为 a.length
    (可以理解为当指定元素(key)不在数组中时,有序插入到数组中,如果该key后面有元素时,插入点为: 大于key 的第一个元素的索引值; 如果数组中所有元素都小于key,则插入点为: a.length)

  • 注意:
    这保证了当且仅当此键被找到时,返回的值将>=0

    例子如:

       int[] numbers = {2, 4, 8, 12, 40, 70,90};
       int key = 8;
       int key1 = 1;
       int key2 = 100;
       int key3 = 50;
       int key4 = 70;
       int key5 = 100;
       int key6 = 130;
       int key7 = -1;
    
       /**
       * binarySearch : 在"有序数组"中查找“指定元素”的“索引值/下标值”
       * 返回值为该"指定元素"的索引值 或 “(-(插入点)-1)”
       */
       System.out.println(Arrays.binarySearch(numbers, key));   // 2
       System.out.println(Arrays.binarySearch(numbers, key1));  // -1
       System.out.println(Arrays.binarySearch(numbers, key2));  // -8
       System.out.println(Arrays.binarySearch(numbers, key3));  // -6
       System.out.println(Arrays.binarySearch(numbers, key4));  //  5
       System.out.println(Arrays.binarySearch(numbers, key5));  // -8
       System.out.println(Arrays.binarySearch(numbers, key6));  // -8
       System.out.println(Arrays.binarySearch(numbers, key7));  // -1
    
       // key: 8 ---查找8在“有序数组”中的索引值 :2
       int index = Arrays.binarySearch(numbers, key); 
       if (index >= 0) {
        System.out.println("元素 " + key + " 在数组中的索引位置为 " + index);
       } else {
        System.out.println("元素 " + key + " 不在数组中");
    }
    

int binarySearch( T[ ] array , int fromIndex, int toIndex, T key)

  • 使用二分搜索法来搜索指定的数组的范围,以获得指定的值。
  • 如果它包含在数组的指定范围内,则返回搜索键的索引;否则返回 (-(插入点) - 1)。插入点 被定义为将键插入数组的那一点:即范围中第一个大于此键的元素索引,如果范围中的所有元素都小于指定的键,则为 toIndex。注意,这保证了当且仅当此键被找到时,返回的值将 >= 0。

void fill( T[ ] array, T value)

  • 将数组的所有元素设置为指定的值

       String[] strs = {"hello","HelloWorld","中国"}; //字符串数组
       //将数组的"所有元素"设置为"指定的值"
       Arrays.fill(strs,"123");
    
       //Arrays.toString() : 将数组转换为字符串
       String str = Arrays.toString(strs);//字符串
       System.out.println(str);  //[123, 123, 123]
    

void fill( T[ ] array, int fromIndex, int toIndex, T value)

  • 数组的指定范围内的元素设置为指定的值

  • [fromIndex,toIndex) : 包括fromIndex,不包括toIndex。

例子如:

   //字符串数组
   String[] strs = {"hello","HelloWorld","中国","Java","python","C++"}; 
   //将数组中“指定范围内的元素”设置为“指定的值”
   Arrays.fill(strs,1,4,"123"); //范围为: [1,4) ,不包括4

   //Arrays.toString() : 将数组转换为字符串
   String str = Arrays.toString(strs);//字符串
   System.out.println(str);  // [hello, 123, 123, 123, python, C++]

boolean equals (T[ ] array1, T[ ] array2)

  • boolean equals(T[] array1, T[] array2):比较两个数组是否相等

      String[] strs1 = {"Hello", "HelloWorld"};
      String[] strs2 = {"Hello", "HelloWorld"};
      String[] strs3 = {"Hello", "中国"};
      boolean b1 = Arrays.equals(strs1, strs2);
      boolean b2 = Arrays.equals(strs1, strs3);
    
      System.out.println(b1); //true
      System.out.println(b2); //false
    

T[ ] copyOf( T[ ] original, int newLength)

  • T[ ] copyOf( T[ ] original, int newLength):复制指定长度的数组

       int[] array1 = {1, 2, 3, 4, 5,6,7,8,9,10};
       int[] ints = Arrays.copyOf(array1, 5);
       //将数组转换字符串
       String strs = Arrays.toString(ints);
       System.out.println(strs); //[1, 2, 3, 4, 5]
    

T[ ] copyOfRange( T[ ] original, int fromIndex, int toIndex)

  • T[ ] copyOfRange( T[ ] original, int fromIndex, int toIndex):复制部分数组

  • [fromIndex , toIndex) : 包括初始索引,不包括最后索引。

      int[] array1 = {1, 2, 3, 4, 5,6,7,8,9,10};
      int[] ints = Arrays.copyOfRange(array1, 0, 6); // [0,6)
      //将数组转换字符串
      String strs = Arrays.toString(ints);
      System.out.println(strs); //[1, 2, 3, 4, 5,6]
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/989042.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

闪存芯片的冷知识

闪存芯片不带电存储数据的原理 闪存芯片是一种非易失性的存储器&#xff0c;即它可以在断电后保持数据不丢失。闪存芯片的核心部分是浮栅晶体管&#xff08;Floating Gate Transistor&#xff09;&#xff0c;它是一种特殊的MOSFET&#xff08;金属氧化物半导体场效应晶体管&a…

方案:TSINGSEE青犀AI智能分析网关森林防火智慧监管平台方案

一、方案背景 森林是地球上最重要的生态系统之一&#xff0c;对环境、气候、水循环和空气质量具有重要影响。森林火灾会造成巨大的经济损失&#xff0c;具有发生面广、突发性强、破坏性大、危险性高、处置扑救特别困难等特点&#xff0c;严重危及人民生命财产和森林资源安全&a…

功能测试就只是说的点点点嘛,这么容易?

那你要知道往往说的容易&#xff0c;做起来难呀。 功能测试虽然说的是点点点&#xff0c;但是对于比较简单的一个小功能来说&#xff0c;确实没有什么太难得地方&#xff0c;点的流畅没有问题&#xff0c;那就再好不过&#xff0c;基本上有问题也是暴露的非常明显&#xff0c;…

用于充电桩直流计量电能表DJSF1352-RN/D带UL证书-安科瑞黄安南

1什么是UL认证&#xff1f; UL认证是由美国安全实验室&#xff08;Underwriters Laboratories&#xff09;提供的安全性认证服务。UL认证虽然不是强制的&#xff0c;但它是北美市场的保证&#xff0c;有UL标志的产品具有很高的市场认可度。 2安科瑞导轨式直流电能表 安科瑞导…

日志输出-查看 SQL:深入分析 MyBatis 执行过程

&#x1f600;前言 在现代软件开发中&#xff0c;数据库操作是不可或缺的一部分&#xff0c;而持久层框架的应用能够极大地简化这一过程。然而&#xff0c;当我们在开发 MyBatis 程序时&#xff0c;有时候需要深入了解程序底层实际执行的 SQL 语句&#xff0c;以便更好地分析和…

C++毕业设计基于QT实现的超市收银管理系统源代码+数据库

C毕业设计基于QT实现的超市收银管理系统源代码数据库 编译使用 编译完成后&#xff0c;需要拷贝 file目录下的数据库 POP.db文件到可执行程序目录下 登录界面 主界面 会员管理 完整代码下载地址&#xff1a;基于QT实现的超市收银管理系统源代码数据库

Linux基础知识及常见指令

Linux简介及相关概念 什么是Linux&#xff1f; Linux是一个免费开源的操作系统内核&#xff0c;最初由Linus Torvalds于1991年创建。它是各种Linux发行版&#xff08;通常称为“发行版”&#xff09;的核心组件&#xff0c;这些发行版是完整的操作系统&#xff0c;包括Linux内…

centos7手动配置jdk1.8环境与maven环境

安装jdk1.8 链接&#xff1a;https://pan.baidu.com/s/1_P7jHzH4Lk2jcPWWD7pi4w 提取码&#xff1a;6kkm winscp软件上传压缩包到Linux中 解压 # 解压到/usr/local/java目录下 tar -zxvf jdk-8u381-linux-x64.tar.gz -C /usr/local/java配置环境变量 vi /etc/profile # 最后…

【C++】vector的模拟实现【完整版】

目录 一、vector的默认成员函数 1、vector类的大体结构 2、无参构造函数 3、拷贝构造函数 4、Swap(operator需要用) 5、赋值重载operator 6、析构函数 二、vector的三种遍历方式 1、size和capacity(大小和容量) 2、 operator[]遍历 3、迭代器iterator遍历和范围for 三…

C++ 判断

C 判断 判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 下面是大多数编程语言中典型的判断结构的一般形式&#xff1a; 判断语句 C 编…

基于Dubbo实现服务的远程调用

目录 前言 为什么使用Dubbo Dubbo技术框架 ​编辑 调用关系流程 基础实现 A.提供统一业务Api B.编辑服务提供者Product B.a 添加依赖 B.b 添加Dubbo 配置(基于yaml配置文件) B.c 编写并暴露服务 C.编辑服务消费者 C.a 添加依赖 C.b 添加Dubbo配置 C.c 引用服务 前言…

Arduino程序设计(八)LCD显示实验

LCD显示实验 前言一、基于LM35的LCD显示实验1. LM35简介2. LCD1602简介3. LM35采集环境温度LCD显示 二、基于DS18B20的LCD显示实验1. DS18B20简介2. DS18B20采集环境温度LCD显示 三、基于DHT11采集环境温湿度LCD显示1. DHT11简介2. DHT11采集环境温湿度LCD显示 前言 本文主要介…

高忆管理:a股b股h股n股的区别?

A股、B股、H股、N股&#xff0c;这些股票标识的差异&#xff0c;是初学者往往比较无措的。本文将从多个角度剖析这些股票的区别&#xff0c;协助读者更好地了解和运用出资。 1.不同的出资主体 首要&#xff0c;要了解这些标识的意义。A股、B股、H股、N股是不同的出资主体。A股…

蠕虫病毒流量分析案例

背景 某供排水集团的网络管理员对其网络的健康状况持认可态度&#xff0c;表示网络运行正常&#xff0c;没有发现异常行为。然而&#xff0c;由于网络环境变得越来越复杂&#xff0c;仅凭借传统的网络经验已经不能全面了解网络情况。因此&#xff0c;我们为供排水集团安装了Ne…

cadence后仿真/寄生参数提取/解决pin口提取不全的问题

post-simulation设置顺序与规则 1.Rules 设置 2.inputs设置 3.outputs设置 4.PEX 设置 会出现错误1&#xff0c;后有解决方案 第一步 :Netlist 第二步&#xff1a;LVS 5.RUN PEX 先RUN&#xff0c;后按照图中1 2 3步骤操作 点击OK之后&#xff0c;显示Calibre信息&#xff…

配置 Windows 系统环境变量

直接按键盘上面的 WINS 打开 Windows 搜索 搜索“编辑系统环境变量” 也可以右键此电脑->属性->高级系统设置打开相同的界面 点击环境变量 一般添加就是添加在框出的 Path 里面&#xff0c;双击可以看到现有的环境变量并进行编辑 例如我在博客中写把 Java 的 jdk 解压好…

功能测试—边界值分析法

一、边界值分析法的概念 边界值分析法就是对输入的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充&#xff0c;这种情况下&#xff0c;其测试用例来自等价类的边界 1 为什么引入边界值分析法&#xff1f; 测试实践表明&#xff0c;大量的故…

【Springcloud】elk分布式日志

【Springcloud】elk分布式日志 【一】基本介绍【二】Elasticsearch【1】简介【2】下载【3】安装【4】启动 【三】Logstash【1】简介【2】下载【3】安装【4】启动 【四】Kibana【1】简介【2】下载【3】安装【4】启动 【五】切换中文【六】日志收集 【一】基本介绍 &#xff08;…

Codeforces Round 895 (Div. 3)题解

前言&#xff1a; 暂时更新到D&#xff0c;后面的找时间再看 A. Two Vessels 题目A&#xff1a;通过最少操作使得a,b水相等&#xff0c;分abs(a-b)是不是2*c的倍数讨论&#xff0c;2c是因为&#xff0c;a-c bc 总差值为2*c; #include<bits/stdc.h> using namespace s…

CMake高级用法实例分析(学习paddle官方的CMakeLists)

cmake基础学习教程 https://juejin.cn/post/6844903557183832078 官方完整CMakeLists cmake_minimum_required(VERSION 3.0) project(PaddleObjectDetector CXX C)option(WITH_MKL "Compile demo with MKL/OpenBlas support,defaultuseMKL." ON) o…