JavaSE(数组)

news2024/11/27 16:28:55

1. 数组

数组创建及初始化

总结:
三种写法包括了动态初始化和静态初始化,其中省略格式不能再省略(拆分);没有初始化时(默认值为基类类型对应的默认值)其中引用类型的默认值为null

三种写法
1. 动态初始化:在创建数组时,直接指定数组中元素的个数
   int[] array = new int[10];
2. 静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容
   进行指定。静态初始化时, {}中数据类型必须与[]前数据类型一致。
   double[] array2 = new double[]{1.0, 2.0, 3.0, 4.0, 5.0};
3.静态初始化可以简写,省去后面的new T[]
  String[] array3 = {"hell", "Java", "!!!"};

静态和动态初始化也可以分为两步,但是省略格式不可以
int[] array1;
array1 = new int[10];
int[] array2;
array2 = new int[]{10, 20, 30};

注意省略格式不可以拆分, 否则编译失败
int[] array3;
array3 = {1, 2, 3};

数组遍历

在数组中可以通过 数组对象.length 来获取数组的长度

1.for循环方式
int[]array = new int[]{10, 20, 30, 40, 50};
	for(int i = 0; i < array.length; i++){
		System.out.println(array[i]);
	}
2.使用 for-each 遍历数组
int[] array = {1, 2, 3};
	for (int x : array) {//这里的x可以只是个标识,和下面对应即可
		System.out.println(x);
	}
作用:for-each 是 for 循环的另外一种使用方式. 
能够更方便的完成对数组的遍历. 可以避免循环条件和更新语句写错
3.借助Java的操作数组的工具类 Arrays 
import java.util.Arrays;//工具类 Arrays 
public class UseOfArrays {
    public static void main(String[] args) {
        int[] array = {1,3,2,5,4};
        Array.sort(array);//工具类 Arrays 排序
        String str = Arrays.toString(array);
        // 创建一个字符串变量来接收它的返回值
        System.out.println(str);
        // 因为 Arrays.toString 是有返回值(必须有),所以可以直接输出
         System.out.println(Arrays.toString(array));
    }
}

数组空间(重点)

局部变量在栈上,new的对象在堆上
**引用很像指针,最大的区别就是不能对 引用 解引用,可以对指针解引用,**因为在Java没有传址的概念的,其他功能类似,但时两个东西,不是同一个东西,不能混淆在一起。

有个问题就诞生了,指针有空指针,那引用有空引用(引用里面存的地址是空的)吗?
答案是有的,只不过跟C语言不同,C是大写NULL,Java是小写null
但是请注意,举这个例子只是为了让你理解引用是一个什么东西,顺便区别两者。
C的东西只是辅助你理解Java,尽量学Java的时候,抛开C,两者(引用和指针)有很多不同地方。

在这里插入图片描述

public class UseOfArrays {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        int[] array1 = null;
        //当一个引用被赋予null,就代表这该引用不指向任何对象
        // 既然该引用不指向任何对象,那么我这样写代码会怎么样?
        System.out.println(array1.length);//error
        // 求一个空引用所指向的对象的长度,但是空引用不会指向任何一个对象的
        System.out.println(array1[0]);
        // 这个写法毫无疑问也是错的,没对象,你怎么访问对象里的东西?
    
    }
}

数组作为参数(重点)

案例一:
import java.util.Arrays;
public class UseOfArrays {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        func1(array);
        System.out.println(Arrays.toString(array));//1,2,3,4,5

    }
    public static void func1(int[] array){
        array = new int[]{11,2,13,4,51};
    }

}

案例二:
import java.util.Arrays;
public class UseOfArrays {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        func2(array);
        System.out.println(Arrays.toString(array));//99,2,3,4,5
    }
    public static void func2(int[] array){
        array[0] = 99;
    }
}

解析:案例一的结果还是array原来的值,并没有发生改变;fun1()只是创建了一个新的空间,也没有返回值。只是将array的实参地址重新赋值(地址0x99—>0x66)
案例二的结果发生了改变,借助array存储的地址,访问并修改了成员变量(array[0])
总结:通过其中任何一个引用修改这个对象的值,另一个引用去访问的时候,也是被改变的。

在这里插入图片描述
还有一个问题值得讨论:一个引用 是否 能同时 指向 多个对象?
答案是不能, 一个引用只能指向一个对象(一个引用只能保存一个对象的地址)

   public static void main(String[] args) {
       int[] array1 = new int[]{1,2,3,4,5};
       array1 = new int[10];
       array1 = new int[2];
       array1 = new int[4];
   }
   此时的array1,存储的地址,已经被改变(array是一个局部变量,意味着存的值是可以被改变的),
   现在存的是 new int[4] 的这个对象的地址, 而不是说,存几个对象的地址。

数组作为方法的返回值

(代码示例: 写一个方法, 将数组中的每个元素都 * 2)
先写没有返回值的

import java.util.Arrays;

public class UseOfArrays {
    public static void main(String[] args) {
        int[] array={1,2,3,4,5};
        func(array);
        System.out.println(Arrays.toString(array));
    }
    public static void func(int[] array){
        for (int i = 0; i < array.length; i++) {
            array[i]=2*array[i];
        }
    }
}

在这里插入图片描述
写有返回值的

不破坏原有数组:另外由于数组是引用类型, 返回的时候只是将这个数组的首地址返回给函数调用者, 没有拷贝数组内容, 从而比较高效.有的人可能会说,方法调用完的时候,不是会销毁栈上的空间,我们这样将地址带回来,不会存在一些问题吗?请注意 new 的对象,都是存在堆上的,而不是栈上。这里的返回的是将堆上对象的地址(注意返回类型int[]),而不是局部变量ret,所以不会出现问题。

import java.util.Arrays;

public class TheDefinitionAndUseOfArrays {
    public static void main(String[] args) {
        int[] array={1,2,3,4,5};
         int[] ret = func(array);//建立数组类型(对象)变量来接收
        System.out.println(Arrays.toString(ret));
        System.out.println(Arrays.toString(array));
    }
    public static int[] func(int[] array){//新建对象(数组)
         int[] ret = new int[array.length];
        for (int i = 0; i < array.length; i++) {
            ret[i]=2*array[i];
        }
        return ret;//这里返回是 新建对象(数组),在堆上的地址
    }
}

在这里插入图片描述

深拷贝和浅拷贝

有面试官问你某个程序实现了某种拷贝?
回答:想怎么拷贝?拷贝值就是深拷贝;拷贝地址就是浅拷贝。

在这里插入图片描述
在这里插入图片描述

数组拷贝

方法1 循环拷贝
方法2: 利用Java提供的函数: Arrays.copyOf()
方法3:Arrays.copyOfRange()左闭右开区间
方法4: System.arraycopy(array,0,array2,0,array.length)
方法5:克隆:数组名.clone();

方法1 循环拷贝
import java.util.Arrays;

public class UseOfArrays {
    public static void main(String[] args) {
        int[] array={1,2,3,4,5};
        int[] array2 = copyshuzu(array);// 是方法中 引用ret存储值的一份拷贝,能够访问 ret 指向的堆上的对象
        System.out.println(Arrays.toString(array));
        System.out.println(Arrays.toString(array2));
    }
    public static int[] copyshuzu(int[] array){
        int[] ret = new int[array.length];//创一个相同类型,元素个数相同的 数组变量array2来接收 array 的元素
        for (int i = 0; i < array.length; i++) {
            ret[i] = array[i];//通过 对应的下标进行复制拷贝
        }
        return  ret;// 将对象的地址转过去
    }
}

方法2: 利用Java提供的函数: Arrays.copyOf()
import java.util.Arrays;

public class UseOfArrays {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        int[] array2 = Arrays.copyOf(array,array.length);
        System.out.println(Arrays.toString(array2));//
        // 既然能规定 拷贝数量,我输入拷贝数量超过,源数组array的元素个数呢?
        int[] array3 = Arrays.copyOf(array,array.length*2);
        System.out.println(Arrays.toString(array3));
    }
     //但是注意一点,本质是copy明白嘛? 这扩容出来的数组,跟元素组,不是同一个数组
     //如果我们想"扩容",输入的倍数必须整数,因为它的长度类型规定为整形
}
方法3:Arrays.copyOfRange()左闭右开区间
import java.util.Arrays;

public class UseOfArrays {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        int[] ret = Arrays.copyOfRange(array,0,4);
        System.out.println(Arrays.toString(ret));//1,2,3,4
    }
}
方法4:对法二的改进
import java.util.Arrays;

public class TheDefinitionAndUseOfArrays {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        int[] array2 = new int[array.length];
        System.arraycopy(array,0,array2,0,array.length);
        // 跟用for循环进行拷贝时一个道理,根据对应的下标进行赋值拷贝
        System.out.println(Arrays.toString(array2));
    }
}
方法5:克隆
import java.util.Arrays;

public class UseOfArrays {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        int[] array2 = array.clone();// 类似 副本: 可以理解为是一份资料的备份
        System.out.println(Arrays.toString(array2));
    }
}

2.二维数组

创建

  1. 数据类型[][] 数组名 = { 初始化数据 }
  2. 数据类型[][] 数组名 = new 数据类型[][]{ 初始化数据 }
  3. 数据类型[][] 数组名 = new 数据类型[行][列数]
public class TheDefinitionAndUseOfArrays {
    public static void main(String[] args) {
        // 创建一个 2行3列的二维数组
        int[][] array = {{1,2,3},{4,5,6}};
        int[][] array2 = new int[][]{{1,2,3},{4,5,6}};
        int[][] array3 = new int[2][3];
    }
}

遍历

方法1: array[下标].length,就能得到相对应的一维数组(对象)的元素个数(长度)。

在这里插入图片描述

public class UseOfArrays {
    public static void main(String[] args) {
        int[][] array = {{1,2,3},{4,5,6}};
        print(array);
        // 这里我们在用实例证明一下
        // array.length 是否能的得到 行数 2
        System.out.println(array.length);
        // array[下标].length 是否能得到 列数3
        System.out.println(array[0].length);
        System.out.println(array[1].length);
    }
    public static void print(int[][] array){
        // 按照我们以前对C的理解,二维数组的存储模式应该为
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                //打印一行数据
                System.out.print(array[i][j] + " ");
            }
            System.out.println()
        }
    }
}

方法2:二维数组也有对应的 方法: Arrays.deepToString(数组名)

import java.util.Arrays;

public class TheDefinitionAndUseOfArrays {
    public static void main(String[] args) {
        int[][] array = {{1,2,3},{4,5,6}};
        System.out.println(Arrays.deepToString(array));
    }
}

特别的二维数组

int[][] array = {{1,2},{1,2,3}};

在这里插入图片描述

意义在于我们可以改,去赋予这种二维数组,我们将其称为 不规则的二维数组
在C语言中,二维数组,是不能省略列的,行可以省略
而Java与之相反,行不能省略,列可以
int[][] array = new int[2][];
array[0]=new int[3];// 意味着第一个数组长度为3
array[1]=new int[2];// 意味着第二个数组长度为2

在这里插入图片描述

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

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

相关文章

RK3288-8.1-添加一个人体感应的开关-pir_pin_status

收到一个人体感应的需求,在设置添加一个开关 第一步,确定人体感应接口的GPIO 可知GPIO7_B5为对应GPIO 第二步,注册对应DTS 然后去驱动内注册对应的节点 很基础的东西,就不多说了,省略一万字......................(得到节点) cat sys/devices/platform/attr/pir_pin_status …

CAD尺寸标注不显示数值

在创建一个新的CAD图纸后&#xff0c;使用CAD尺寸标注会看见只有一条直线而没有数字显示&#xff0c;这是为什么呢&#xff1f;实际上是存在数值的&#xff0c;只是默认的数值很小&#xff0c;如果图形尺寸过大就看不清楚需要放大才能看见&#xff0c;就需要调整CAD尺寸标注的格…

RSS Can:借助 V8 让 Golang 应用具备动态化能力(二)

继续聊聊之前做过的一个小东西的踩坑历程&#xff0c;如果你也想高效获取信息&#xff0c;或许这个系列的内容会对你有用。 写在前面 在上一篇文章《RSS Can&#xff1a;使用 Golang 实现更好的 RSS Hub 服务&#xff08;一&#xff09;》里&#xff0c;我们简单介绍了使用 G…

数字孪生技术在智慧园区领域的实践

随着云计算、物联网、大数据、人工智能、5G 等为代表的技术迅速发展和 深入应用&#xff0c;“智慧园区”建设已成为全球园区发展的新趋势。近年来&#xff0c;党中央 和国务院更加注重智慧园区的建设与发展&#xff0c;相继出台了多项政策推动智慧园区的建设&#xff0c;智慧园…

数据镜像软件

什么是数据镜像 数据镜像是复制已传输到 USB 设备或在 USB 设备中修改的文件内容的过程。创建镜像副本后&#xff0c;可以在受密码保护的网络共享中维护这些副本。此共享文件夹最好保存在远程位置&#xff0c;以节省本地计算机上的空间。这样&#xff0c;只有管理员或受信任的…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java基于疫情防控下社区管理平台my3tu

对于即将毕业或者即将做课设的同学而言&#xff0c;由于经验的欠缺&#xff0c;面临的第一个难题就是选题&#xff0c;确定好题目之后便是开题报告&#xff0c;如果选题首先看自己学习那些技术&#xff0c;不同技术适合做不同的产品&#xff0c;比如自己会些简单的Java语言&…

Flutter自定义MultiChildRenderObjectWidget实现圆环布局效果

一、本文主要是学习巩固一下自定义RenderObject这一块内容&#xff0c;用所了解到的知识实现一个圆环布局效果 本篇文章主要参考了恋猫de小郭Flutter 完整开发实战详解&#xff08;十六、详解自定义布局实战&#xff09;文章&#xff0c;大家可以先看完这篇文章再来阅读本篇这…

生产制造企业用的ERP系统——流程管理

ERP的含义是企业资源计划&#xff0c;主要是对企业所拥有各种资源进行综合规划和优化管理&#xff0c;用以降低成本&#xff0c;提高效率&#xff0c;增加利润。 作为一个低代码开发平台&#xff0c;百数在办公领域已有10年历史&#xff0c;为企业信息化发展提供丰富的功能模块…

Java如何实现截取字符串

文章目录0 写在前面1 .substring()2 split()正则表达式3 StringUtils.substring()4 写在最后0 写在前面 在实际工作中有一些地方需要用到截取字符串的方法&#xff0c;所以在此记录下截取字符串的几种方法。 .substring() StringUtils.substring() split()正则表达式 1 .subs…

最高月薪15.5K,成大事不在于力量的大小,而在于能坚持多久~

在前几天的世界杯八强赛中&#xff0c;阿根廷通过点球战胜了荷兰&#xff0c;闯入了四强。 说起阿根廷&#xff0c;就不得不提起梅西&#xff0c;这个被众多球迷誉为天才的球王&#xff0c;可实际上&#xff0c;在他的父亲眼中&#xff0c;却从不称自己的儿子为天才&#xff0…

java 课设-超级玛丽游戏

题目&#xff1a; 本程序是针对超级玛丽小游戏的 JAVA 程序&#xff0c;进入游戏后首先用鼠标点击 GUI 窗口&#xff0c;然后开始游 戏&#xff0c;利用方向键来控制的马里奥的移动&#xff0c;同时检测马里奥与场景中的障碍物和敌人的碰撞&#xff0c;并判断马里 奥的可移动性…

.net 移动开发 MAUI

.net 移动开发 MAUI新建一个Hello World运行效果修改一下&#xff0c;做个加法运算吧运行效果创建新的内容页修改xaml内容添加逻辑内容主页面添加一个按钮并且增加路由按钮事件添加路由整体感受第一&#xff1a;WPF第二&#xff1a;小程序所有的页面跳转都是借助路由第三&#…

Win11怎么更改时区?

Win11可以自动检测配置用户的时区来显示正确的时间&#xff0c;如果由于一些特殊原因导致系统时区错误&#xff0c;显示时间也错误的话&#xff0c;这时候要怎么调整呢&#xff1f;下面小编就来教教大家更换Windows 11时区的方法。 方法一&#xff1a;在 Windows 11 上更改时区…

新旧电脑数据如何迁移?电脑数据导入到另一台电脑

新旧电脑数据如何迁移&#xff1f;换电脑是一件好事&#xff0c;换更新版本的电脑&#xff0c;还可以体验新功能。您需要找到将数据传输到新电脑的有效方法。电脑数据导入到另一台电脑&#xff0c;接下来的内容将为大家揭晓答案&#xff01; 方法1、使用专业的数据传输迁移数据…

[附源码]计算机毕业设计的玉石交易系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

cookie 和 session 的区别

1. 前言 cookie 和 session 的区别是什么&#xff1f;这个问题在面试中问到的频率非常高 cookie 和 session 的共同点: 都是用来记录用户访问浏览器时保存的数据&#xff0c;比如&#xff1a;用户的身份信息等 2. cookie 和 session 的工作原理 cookie 工作原理: 浏览器端第…

【自然语言处理】隐马尔科夫模型【Ⅲ】估计问题

有任何的书写错误、排版错误、概念错误等&#xff0c;希望大家包含指正。 由于字数限制&#xff0c;分成六篇博客。 【自然语言处理】隐马尔可夫模型【Ⅰ】马尔可夫模型 【自然语言处理】隐马尔科夫模型【Ⅱ】隐马尔科夫模型概述 【自然语言处理】隐马尔科夫模型【Ⅲ】估计问题…

Rsyslog+MariaDB搭建Rsyslog日志服务器

rsyslog是一个linux系统日志服务的工具&#xff0c;主要用来监控收集系统从开机运行之后所发生的所有日志&#xff0c;包括内核日志&#xff0c;服务日志&#xff0c;应用日志等等&#xff1b;记录的日志全部都写到/var/log下面&#xff0c;常用的有dmsg&#xff08;内核日志&a…

带你手把手实操一个RPC框架

前言&#xff1a; 这篇文章我们来聊一聊RPC框架&#xff0c;为什么要聊RPC呢 &#xff1f; 首先从个人成长角度&#xff0c;如果一个新时代码农能清楚的了解RPC框架所具备的要素&#xff0c;掌握RPC框架中涉及的服务注册发现、负载均衡、序列化协议、RPC通信协议、Socket通信…

Linux 安装 Redis教程

1.切换到目录/use/local/src cd /use/local/src 2.下载文件 wget https://download.redis.io/releases/redis-6.2.6.tar.gz 3.文件解包 tar xzf redis-6.2.6.tar.gz 4.将解压后的包移动到/usr/local/redis目录下 mv redis-6.2.6 /usr/local/redis 5.切换到/usr/local/r…