wake-up-neo.com

länge und Länge () in Java

Warum haben wir die Länge eines Arrays als Attribut array.length und für String eine Methode str.length()?

Gibt es einen Grund?

84
Nitish Upreti

Lassen Sie mich zunächst drei verschiedene Möglichkeiten für ähnliche Zwecke hervorheben.

length - Arrays (int[], double[], String[]) - um die Länge der Arrays zu ermitteln

length() - String bezogenes Objekt (String, StringBuilder usw.) - um die Länge des Strings zu ermitteln

size() - Collection-Objekt (ArrayList, Set usw.) - um die Größe der Collection zu ermitteln 

Vergessen Sie nun length(), und denken Sie nur an length und size().

length ist keine Methode, daher ist es absolut sinnvoll, dass sie nicht für Objekte geeignet ist. Es funktioniert nur bei Arrays.
size() Der Name beschreibt es besser, und da es sich um eine Methode handelt, wird sie im Fall der Objekte verwendet, die mit Collection (Collection Frameworks) arbeiten, wie ich oben gesagt habe.

Kommen Sie nun zulength():
String ist kein primitives Array (wir können .length nicht verwenden) und auch keine Collection (daher können wir .size() nicht verwenden). Deshalb brauchen wir auch ein anderes Array, nämlich length() (bewahren Sie die Unterschiede auf und dienen dem Zweck). .

Als Antwort auf Warum?
Ich finde es nützlich, leicht zu merken und zu verwenden und freundlich.

94
Saif

Ein wenig vereinfacht kann man sich vorstellen, dass es sich bei Arrays um einen Sonderfall handelt und nicht um gewöhnliche Klassen (ein bisschen wie Primitive, aber nicht). String und alle Sammlungen sind Klassen, daher die Methoden, um Größe, Länge oder ähnliches zu ermitteln. 

Ich denke, der Grund zum Zeitpunkt des Designs war Leistung. Wenn sie es heute erstellten, hatten sie wahrscheinlich stattdessen so etwas wie Array-unterstützte Auflistungsklassen gefunden.

Wenn jemand interessiert ist, hier ein kleiner Code-Ausschnitt, um den Unterschied zwischen den beiden im generierten Code zu veranschaulichen, zuerst die Quelle:

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());
  }
}

Wenn Sie den nicht so wichtigen Teil des Bytecodes wegschneiden und javap -c für die Klasse ausführen, wird in den letzten beiden Zeilen Folgendes angezeigt:

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

Im ersten Fall (20-25) fragt der Code die JVM nur nach der Größe des Arrays (in JNI wäre dies ein Aufruf von GetArrayLength () gewesen), während im String-Fall (28-35) ein a ausgeführt werden muss Methodenaufruf, um die Länge zu ermitteln. 

In der Mitte der 1990er Jahre hätte es ohne gute JITs und solche Sachen die Performance völlig beeinträchtigt, wenn nur der Java.util.Vector (oder ähnliches) und kein Sprachkonstrukt vorhanden wäre, das sich nicht wirklich wie eine Klasse verhält, sondern schnell ist. Sie hätten die Eigenschaft natürlich als Methodenaufruf maskieren und im Compiler bearbeiten können, aber ich denke, es wäre noch verwirrender gewesen, eine Methode für etwas zu haben, das keine echte Klasse ist.

25
Fredrik

Erwägen:

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

Es ist sehr wahrscheinlich, dass Strings und Arrays zu unterschiedlichen Zeitpunkten entworfen wurden und somit unterschiedliche Konventionen verwendeten. Eine Begründung ist, dass, da Strings Arrays intern verwenden, die Methode length() verwendet wurde, um die Duplizierung derselben Informationen zu vermeiden. Eine andere ist, dass die Verwendung einer Methode length() die Unveränderlichkeit von Strings unterstreicht, auch wenn die Größe eines Arrays nicht verändert werden kann.

Letztendlich ist dies nur eine Inkonsistenz, die sich entwickelt hat und die definitiv behoben werden würde, wenn die Sprache jemals von Grund auf neu gestaltet wurde. Soweit ich weiß, dass keine andere Sprache (C #, Python, Scala usw.) dasselbe tut, ist dies wahrscheinlich nur ein kleiner Fehler, der als Teil der Sprache endete.

Sie erhalten eine Fehlermeldung, wenn Sie die falsche trotzdem verwenden.

7

.lengthist eine einmalige Eigenschaft von Java. Es wird verwendet, um die Größe eines einzelnen dimensionalen Arrays zu ermitteln.

.length()ist eine Methode. Es wird verwendet, um die Länge einerStringzu ermitteln. Es vermeidet das Duplizieren des Wertes.

7
Prabandha

In Java speichert ein Array seine Länge getrennt von der Struktur, in der sich die Daten befinden. Wenn Sie ein Array erstellen, geben Sie dessen Länge an. Dies wird zu einem bestimmenden Attribut des Arrays. Egal, was Sie mit einem Array der Länge N tun (Werte ändern, Nullstellen usw.), es wird immer ein Array der Länge N sein.

Die Länge einer Zeichenkette ist zufällig. Es ist kein Attribut des Strings, sondern ein Nebenprodukt. Obwohl Java-Strings tatsächlich unveränderlich sind, können Sie deren Länge ändern, wenn es möglich wäre, deren Inhalt zu ändern. Das Abschlagen des letzten Zeichens (wenn möglich) würde die Länge verringern.

Ich verstehe, dass dies eine feine Unterscheidung ist, und ich werde vielleicht dafür abgelehnt, aber es stimmt. Wenn ich ein Array der Länge 4 mache, ist diese Länge von vier ein bestimmendes Merkmal des Arrays und ist wahr, unabhängig davon, was darin enthalten ist. Wenn ich einen String mache, der "Hunde" enthält, hat dieser String die Länge 4, da er zufällig vier Zeichen enthält.

Ich sehe das als Rechtfertigung dafür, eines mit einem Attribut und das andere mit einer Methode zu machen. In Wahrheit mag es nur eine unbeabsichtigte Inkonsistenz sein, aber für mich ist es immer sinnvoll, und so habe ich immer darüber nachgedacht.

2
jakeboxer

Mir wurde beigebracht, dass bei Arrays aus einer Methode die Länge aus folgenden Gründen nicht abgerufen wird: Programmierer würden die Länge einer lokalen Variablen vor dem Eintritt in eine Schleife zuweisen (denken Sie an eine for-Schleife, bei der die Bedingung die Länge des Arrays verwendet.) Der Programmierer würde angeblich tun, um Funktionsaufrufe zu reduzieren (und dadurch die Leistung zu verbessern.) Das Problem ist, dass sich die Länge während der Schleife ändern kann und die Variable dies nicht tun würde.

1
Matthew

Immer wenn ein Array erstellt wird, wird seine Größe angegeben. Länge kann also als Konstruktionsattribut betrachtet werden. Bei String handelt es sich im Wesentlichen um ein Char-Array. Length ist eine Eigenschaft des Char-Arrays. Es ist nicht notwendig, Länge als Feld anzugeben, da nicht alles dieses Feld benötigt . http://www.programcreek.com/2013/11/start-from-length-length-in-Java/

0
Ryan