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 個以上的類型參數。明確的限制似乎更好,即使它隻影響百萬分之一的程序。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- Java字符串的intern方法有何奧妙之處
- Java並發內存模型詳情
- 帶你入門Java的類與對象
- mybatis中返回多個map結果問題
- mybatis參數類型不匹配錯誤argument type mismatch的處理方案