2011-12-30 6 views
10

は、私は、配列の長さをしているときに何か書くことに気付きました:長さと長さの違いは何ですか?

arrayone.length; 

しかし、そのようなことのための配列リストや文字列などを、次のような、先端にブラケットを書きます文字列の長さの場合:

stringone.length(); 

これの主な理由は何ですか。

答えて

8
.length; 

直接フィールドメンバにアクセスします。

.length(); 

フィールドメンバにアクセスするための方法(すなわち、アクセッサ)を呼び出します。

Stringの場合、は変更不可能なであるため、これが予想されます。

0

.length()はStringクラスのメソッドであり、文字列内の文字数を返します。

.lengthは、配列に格納されている要素の数を返します。

public class length 
{ 
public static void main(String args[]) 
{ 
String x="test"; 
int a[]={1,2,3,4}; 
System.out.println(x.length()); 
System.out.println(a.length); 
} 
} 

// output 
4 
4 
2

いつどちらが経験であるかを知る唯一の真の方法です。あなたが覚えていないときには、自動補完機能付きのIDEが役立ちます。

array.length、System.out、およびSystem.errのほとんどは、必ずしもそうではありません。実行するのは、メソッド呼び出しではなくメンバーアクセスです。

0

Array.lengthは、可変参照と同様のArrayのプロパティです。

ArrayList.size()は、実際に配列リストオブジェクトを呼び出すメソッドです。

3

Arraysは、StringsまたはArrayListsまたはJavaで数えられるものとは異なる方法で処理されます。 Arrayはかなりネイティブなタイプであり、長さは初期化された後に決して変更できないので、カプセル化の必要はありません。長さ変数は、副作用なしで直接露出させることができます。それは内部的にそれが(不変/カプセル化のために)公に公開したくないchar[]を使用していますので、それはlength()方法で長さ変数をラップするので

Stringは、変数の代わりにメソッドを使用する理由はあります。 変数の代わりにArrayListsize()メソッドがあるのと同じ理由です。

メソッドの代わりに変数を使用する唯一の時間は配列です。他のすべてが方法になります。つまり、大括弧は配列以外のすべてに使用されます。

0
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()が使用されていたことが正当化されています。最終的にこれは矛盾して進化したものであり、言語が根底から再設計されていれば確実に修正されるはずです。 :D

+0

いいえ、それらは異なる時に設計されているわけではありません。 'size'を持つもの –

0

主な違いは、A)最初のケースではな長さとBと呼ばれるパブリックフィールドを有するECT ..例えばint[]ためにそのアレイタイプ、Object[]double[]、)第二ケースが有するオブジェクトの文字列であることですlength()と呼ばれる機能は、getLength()などと呼ばれていた可能性があります。配列型のpublicフィールドの長さは、おそらくC++のやり方からの二日酔いです。

アレイタイプは、以下を有する:

  • オーバーライドアレイの 成分の数(長さが正であってもよく、またはゼロ)
  • パブリックメソッドのクローンを含むパブリック最終的なフィールド長、同じ名前のメソッド はObjectであり、チェック例外はスローされない
  • Objectから継承されたすべてのメンバー。継承されていない オブジェクトの唯一の方法は、そのクローンメソッド

this, Array Typesを見てみましょうです。

0

lengthは擬似データメンバリファレンスであり、(small-a)配列(メンバを実装するために定義したクラスは無視します)でのみ動作します。

他のすべてはクラスのオブジェクトであり、この概念を持つすべてのJDKクラスはlength()またはsize()のインスタンスメソッドを定義します。 (私は彼らが一貫していて、どちらかを選んだりして欲しいと思っていますが、それは橋の上の水です)。

関連する問題