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

 更新时间:2021年03月25日 11:17:08   作者:热带鱼2020  
这篇文章主要介绍了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 个以上的类型参数。明确的限制似乎更好,即使它只影响百万分之一的程序。

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

相关文章

  • 简单聊一聊Spring中Bean别名的处理原理

    简单聊一聊Spring中Bean别名的处理原理

    今天来和小伙伴们聊一聊 Spring 中关于 Bean 别名的处理逻辑,别名,顾名思义就是给一个 Bean 去两个甚至多个名字,整体上来说,在 Spring 中,有两种不同的别名定义方式,感兴趣的小伙伴跟着小编一起来看看吧
    2023-09-09
  • Java的Socket实现长连接以及数据的发送和接收方式

    Java的Socket实现长连接以及数据的发送和接收方式

    这篇文章主要介绍了Java的Socket实现长连接以及数据的发送和接收方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 自定义SpringBoot的白标错误页面的操作方法

    自定义SpringBoot的白标错误页面的操作方法

    Spring Boot的白标错误页面是在应用程序出现错误时(如404或500 HTTP状态码)自动生成的默认错误页面,下面小编给大家分享如何自定义SpringBoot的白标错误页面,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • java  常见位逻辑运算符梳理

    java  常见位逻辑运算符梳理

    这篇文章主要介绍了java常见位逻辑运算符梳理,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参一下下面文章详细内容
    2022-08-08
  • SpringBoot使用MockMvc进行单元测试的实例代码

    SpringBoot使用MockMvc进行单元测试的实例代码

    在Spring Boot应用程序中,使用MockMvc进行单元测试是一种有效的方式,可以验证控制器的行为和API的正确性,在这篇博客中,我们将介绍如何使用MockMvc对用户控制器进行测试,感兴趣的朋友可以参考下
    2024-01-01
  • 关于@Component注解下的类无法@Autowired问题

    关于@Component注解下的类无法@Autowired问题

    这篇文章主要介绍了关于@Component注解下的类无法@Autowired问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringBoot四种读取properties文件的方式(小结)

    SpringBoot四种读取properties文件的方式(小结)

    这篇文章主要介绍了SpringBoot四种读取properties文件的方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Java中的拦截器、过滤器、监听器用法详解

    Java中的拦截器、过滤器、监听器用法详解

    这篇文章主要介绍了Java中的拦截器、过滤器、监听器用法,详细分析了Java拦截器、过滤器、监听器的功能、使用方法及相关注意事项,需要的朋友可以参考下
    2017-05-05
  • SpringBoot整合MongoDB全过程

    SpringBoot整合MongoDB全过程

    这篇文章主要介绍了SpringBoot整合MongoDB全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Spring实现对象注入的三种方法详解

    Spring实现对象注入的三种方法详解

    这篇文章主要为大家学习介绍了Spring中实现对象注入的三种常用方法,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2023-07-07

最新评论