new - Java中的長度和長度()



new string array java (6)

為什麼我們有一個數組的長度作為屬性, array.length ,並為字符串我們有一個方法, str.length()

有什麼理由嗎?

https://src-bin.com


Answer #1

.length是Java的一次性屬性。 它用於查找單維數組的大小。

.length()是一種方法。 它用於查找String的長度。 它避免了重複的價值。


Answer #2

在Java中,數組將其長度與實際保存數據的結構分開存儲。 當你創建一個數組時,你可以指定它的長度,並且它將成為數組的一個定義屬性。 不管你對一個長度為N的數組做什麼(改變數值,空值等),它總是一個長度為N的數組。

字符串的長度是偶然的; 它不是字符串的屬性,而是副產品。 儘管Java字符串實際上是不可變的,但如果可以更改其內容,則可以更改它們的長度。 敲掉最後一個字符(如果可能的話)會降低長度。

我知道這是一個很好的區別,我可能會被拒絕,但這是真的。 如果我創建一個長度為4的數組,那麼這四個長度是數組的一個定義特徵,並且無論內部是什麼都是真實的。 如果我創建一個包含“狗”的字符串,該字符串長度為4,因為它恰好包含四個字符。

我認為這是做一個具有屬性而另一個具有方法的理由。 事實上,這可能只是一個無意的不一致性,但對我來說總是有意義的,而且我總是這樣想。


Answer #3

我被告知,對於數組而言,由於以下恐懼,長度不會通過方法檢索:程序員只需在進入循環之前將該長度分配給局部變量(考慮for循環,其中條件使用數組的長度)。程序員應該這樣做是為了減少函數調用(從而提高性能)。問題是在循環期間長度可能會改變,而變量不會。


Answer #4

我首先強調三種不同的用於類似目的的方法。

length - 數組int[]double[]String[] ) - 知道數組的長度

length() - 與字符串相關的ObjectStringStringBuilder等) - 知道String的長度

size() - 集合對象ArrayListSet等) - 知道集合的大小

現在忘記length()只考慮lengthsize()

length不是一種方法,所以完全有意義的是它不能在對像上工作。 它只適用於數組。
size()它的名字更好地描述了它,因為它是一個方法,它將用於那些使用集合(集合框架)的對象,就像我在那裡說的那樣。

現在來length()
String不是一個原始數組(因此我們不能使用.length ),也不是一個Collection(所以我們不能使用.size() ),這就是為什麼我們還需要一個不同的length() (保持差異並服務目的)。

作為回答為什麼?
我覺得它很有用,易於記憶和使用,並且友好。


Answer #5

簡單一點,你可以把它看作是一個特殊情況的數組,而不是普通的類(有點像基元,但不是)。 字符串和所有集合都是類,因此是獲取大小,長度或類似事物的方法。

我想在設計時的原因是性能。 如果他們今天創建了它們,他們可能會想出類似於數組支持的集合類。

如果有人感興趣,下面是一小段代碼來說明生成代碼中兩者之間的區別,首先來源:

public class LengthTest {
  public static void main(String[] args) {
    int[] array = {12,1,4};
    String string = "Hoo";
    System.out.println(array.length);
    System.out.println(string.length());
  }
}

削減字節代碼中不那麼重要的部分,在類上運行javap -c導致以下兩行最後一行:

20: getstatic   #3; //Field java/lang/System.out:Ljava/io/PrintStream;
23: aload_1
24: arraylength
25: invokevirtual   #4; //Method java/io/PrintStream.println:(I)V
28: getstatic   #3; //Field java/lang/System.out:Ljava/io/PrintStream;
31: aload_2
32: invokevirtual   #5; //Method java/lang/String.length:()I
35: invokevirtual   #4; //Method java/io/PrintStream.println:(I)V

在第一種情況下(20-25),代碼只是向JVM詢問數組的大小(在JNI中,這將是對GetArrayLength()的調用),而在String情況下(28-35),它需要執行方法調用來獲取長度。

在20世紀90年代中期,如果沒有良好的JIT和東西,它將完全殺死性能,只有java.util.Vector(或類似的東西),而不是一個語言結構,它並不像一個類,但是速度很快。 他們當然可以將該屬性掩蓋為方法調用並在編譯器中處理它,但我認為如果對某個不是真正的類的方法有一個方法會更困難。


Answer #6

考慮:

int[] myArray = new int[10];
String myString = "hello world!";
List<int> myList = new ArrayList<int>();

myArray.length    // Gives the length of the array
myString.length() // Gives the length of the string
myList.size()     // Gives the length of the list

字符串和數組很有可能是在不同的時間設計的,因此最終使用了不同的約定。 其中一個理由是,由於Strings在內部使用數組,因此使用length()方法來避免重複使用相同的信息。 另一個是使用length()方法有助於強調字符串的不變性,即使數組的大小也是不可改變的。

最終,這只是一個不斷發展的不一致,如果語言從頭開始重新設計,那麼肯定會得到解決。 據我所知,沒有其他語言(C#,Python,Scala等)做同樣的事情,所以這可能只是作為語言一部分的一個小缺陷。

無論如何,如果你使用錯誤的話,你會得到一個錯誤。





string