我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java 定义长度为0的数组/空数组案例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java 定义长度为0的数组/空数组案例

如下:


int[] array = new int[0];   // 定义一个长度为 0 的数组 / 空数组
Sring[] arr = new String[0]; // 定义一个长度为 0 的数组 / 空数组

长度为 0 的数组 / 空数组 并不是 null

有时数组里可能只有一个空字符串 "",这时数组长度是 1。这种情况也要注意判断。


if ( arr.length == 1 && arr[ 0 ].equals( "" ) ) {
  System.out.println( "输入的数组不能只包含一个空字符串" );
  return;
}

补充:java定义一个空数组_一个 Java 方法,最多能定义多少参数?

在 JVM 中,一个 Java 方法,最多能定义多少参数呢?这是一个很无聊的问题,即使能定义一万个,十万个,谁又会真的去这么做呢。

但是作为一个 coder,最重要的不就是好奇心吗,没有好奇心,和一条咸鱼又有什么区别呢?本文作者就是这样一位充满好奇心的 coder。

我最近给我的 QuickTheories 分支添加了一个接口:


@FunctionalInterface
public interface QuadFunction {
  E apply(A a, B b, C c, D d);
}

让我好奇的是这个方法能有多少个类型参数。到目前为止,我敢说,Java 语言规范并没有谈及这个问题。

对于实现定义的限制可能是什么,我有两个猜测:

1、编译器会设置一个可预测的限制,如 255 或 65535。

2、编译器的紧急行为会由于实现细节(堆栈溢出或同样不可预测/不相关的东西)而设置意外的限制。

我不想在源代码上测试我那点可怜的 C++技巧,所以我决定只测试编译器做了什么。我写了一个 Python 脚本,它使用二进制搜索找到最少的致错类型参数。完整的脚本放在 Github repo (https://github.com/hyperpape/java-max-type-params) 中。

脚本地址:https://github.com/hyperpape/java-max-type-params

生成方法很简单。幸运的是,我们不必使用任何类型参数,只需以的形式发出它们:


def write_type_plain(count):
  with open('Test.java', 'w') as f:
    f.write("public class Test {\n")
    f.write("public     for i in range(count):
      if (i > 0):
        f.write(", ")
      f.write("A" + str(i + 1))
    f.write("> void testMethod() {}")
    f.write("}")

运行二进制搜索可以得到以下输出:

>>> error: UTF8 representation for string ">>> largest type: 2776

这个错误有点模糊,但事后看来是可以预见的。编译器生成的类文件包含许多字符串,包括类中每个方法的方法签名。这些字符串存储在常量池中,常量池中的条目最大为 65535 字节,这是由 JVM 规范规定的限制。

所以,我之前的猜测都不完全正确。类型参数的最大数目是一个突现特征(emergent property),而不是一个明确的决定。不过,并不是编译器本身的实现导致了错误。

相反,JVM 的类文件格式限制了可以在类文件中表示的类型参数的数量。这是真的,尽管 JVM对泛型一无所知。这也意味着类型参数的最大数目完全取决于如何编写方法。

我尝试了一种新的编码类型参数的方法(先前链接文件中的 write_Type_Compact),使用完整的合法 ASCII 字符(A-Z、a-z、$和_)。该实现有点过于复杂,因为可以使用字符 0~9,但不能是标识符的初始字符,因为 Java 关键字不能作为类型参数出现。我只是用等长的 UTF-8 字符替换了短单词「if」和「do」。更紧凑的编码将参数数量从 2776 增加到 3123。

不方便的是,_A 是一种合法的 Java 标识符,但 _ 不是。谢天谢地,我的编码在不使用初始_情况下就生成了 3392 个 2 字节类型参数,因此我觉得没有必要进行簿记以发出初始字符_。

再来一个小技巧

解压类文件显示,65536 个字符的大部分不是我生成的类型参数,而是子字符串 Ljava/lang/object 的重复实例。因为没有提供关于类型参数的信息,所以类文件显示它们扩展了对象,并在方法签名中对其进行编码。我修改了生成器来解决这个问题。

循环的关键部分是:


s = type_var(i)
f.write(s)
if (s != 'A'):
  f.write(" extends A")

在类型参数中,除了一个实例 java/Lang/Object 之外的所有实例都被替换为 A。在进行了这个更改之后,编译了一个具有 9851 个类型参数的方法。

由于参数的数量增加了很多,所以我使用的代码肯定需要调整。使用非 ASCII Unicode 标识符可能是完全高效的必要条件,但简单地指出这是可以做到的我就很满意了。

这些都不重要

很难想象有人会达到这个极限。代码生成有时会达到语言或编译器的限制,但即使生成的代码似乎也不太可能使用成百上千的类型参数。

尽管如此,如果我是规则制定者,我会考虑明确禁止任何类或方法具有 255 个以上的类型参数。明确的限制似乎更好,即使它只影响百万分之一的程序。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java 定义长度为0的数组/空数组案例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么在java中定义一个长度为0的数组

怎么在java中定义一个长度为0的数组?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Andro
2023-06-14

Java 中如何定义可变长度数组?(java如何定义可变长度数组)

在Java编程中,数组是一种常用的数据结构,用于存储相同类型的元素。默认情况下,Java中的数组是固定长度的,一旦创建,其长度就不能改变。然而,在某些情况下,我们可能需要定义可变长度的数组,以便在程序运行时可以根据需要动态地调整数组的大小。本文将介绍在Java中如何定义可变长度数组,
Java 中如何定义可变长度数组?(java如何定义可变长度数组)
Java2024-12-22

如何在golang中将切片的长度定义为数组?

在Golang中,切片与数组是两种不同的数据类型。切片是一个动态长度的序列,而数组是一个固定长度的序列。如果你想将切片的长度定义为数组,可以通过创建一个固定长度的数组,然后使用切片来引用该数组来实现。具体操作是先创建一个指定长度的数组,然后
如何在golang中将切片的长度定义为数组?
2024-02-08

Java 中定义空数组的方法究竟有哪些?(java定义空数组的方法是什么)

在Java编程中,定义空数组是一个常见的操作。空数组是指没有任何元素的数组,它在很多情况下都非常有用,比如初始化一个数组变量、传递一个空数组参数等。下面将详细介绍Java中定义空数组的方法。一、使用字面量创建空数组在J
Java 中定义空数组的方法究竟有哪些?(java定义空数组的方法是什么)
Java2024-12-17

java怎么输入不定长度的数组

在Java中,可以使用动态数组(ArrayList)来解决输入不定长度的数组的问题。动态数组可以根据需要动态调整数组的大小。以下是一个示例代码,演示如何输入不定长度的数组:```javaimport java.util.ArrayList;
2023-08-26

java定义空数组的方法有哪些

在Java中,有以下几种方法可以定义一个空数组:1. 使用new关键字初始化一个空数组:```int[] array = new int[0];```2. 使用静态方法Arrays.copyOf()创建一个空数组:```int[] arra
2023-08-18

怎么在java中指定二维数组的长度

本篇文章给大家分享的是有关怎么在java中指定二维数组的长度,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用
2023-06-14

Java自定义一个变长数组的思路与代码

有时我们希望将把数据保存在单个连续的数组中,以便快速、便捷地访问数据,但这需要调整数组大小或者对其扩展,下面这篇文章主要给大家介绍了关于Java自定义一个变长数组的思路与代码,需要的朋友可以参考下
2022-12-29

使用java怎么指定不同长度的二维数组

本篇文章给大家分享的是有关使用java怎么指定不同长度的二维数组,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序
2023-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录