• 締切済み

String(文字列)と配列の length の違いについて

Stringと配列、それぞれlengthがありますが、 Stringはlength()とカッコが付き、配列の場合、例えば intarray.lengthのようにカッコが付きません。 両者でなぜ扱いが違うのか、教えていただけますか?

noname#163856
noname#163856
  • Java
  • 回答数4
  • ありがとう数9

みんなの回答

回答No.4

>何か技術的な問題点があったのでしょうか? 技術っていうより、どうしても嫌なら以下のような独自クラスを作ればいいと思う。 public class array{  static public void main(String... $0_){   int[] hairetsu = {0,1,2};   System.out.println("配列の長さ:" + hairetsu.length);   arrays intarray = new arrays(hairetsu);   System.out.println("配列の長さ:" + intarray.length());  } } class arrays{ // SJC-P勉強中の方は、これを無名クラスにしてみよう。  int[] con;   arrays(int[] con){   this.con = con;  }  int length(){   return con.length;  } } >なぜ配列には length()メソッドを用意せずに、lengthフィールドを >直接参照する仕様にしたのか、不思議に思っています。 仕様っていうより、動作的にそのようになってしまうと思います。#2さんの回答でも納得できないとしたら、オブジェクト指向はまだ始めたばかりでしょうか? JavaWorld.com 「Study guide: Java's character and assorted string classes support text-processing」 http://www.javaworld.com/javaworld/jw-10-2002/jw-1004-java101guide.html 上記サイト内でも、次のような記述があります。 Confusing length() with length leads to compiler errors. length() is a method that returns the current number of characters in a String's value array, whereas length is a read-only array field that returns the maximum number of elements in an array. 普通にJavaを勉強されてきた方ならば、「あ~そうか、なるほど。」ってなると思うのですが。 ただ、いろいろとググっていたら、どうやら初期のJDKでは配列の要素数取得にlength()メソッドが使われていたとのこと。[JavaHouse-Brewers:5708] James Goslingさんも、当時はどのように考えていらしたのでしょうかね~。(日本そのものには大変興味があるらしいですが、最近はNintendo DSとか携帯向けのアプリなんかにハマっているそうです。)

参考URL:
http://blogs.sun.com/jag/
noname#163856
質問者

お礼

ご回答ありがとうございます。 普通にJavaを勉強されてきた方ならば、「どうして?」ってなると思うのですが。

noname#163856
質問者

補足

今回は明確な理由が添えられた回答が得られなかったので、得点は無しとさせて頂きます。

  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.3

>なぜ配列には length()メソッドを用意せずに、lengthフィールドを >直接参照する仕様にしたのか、不思議に思っています。 配列長の仕様と配列の利用頻度によってそう決めたのでは?というのが自分の考えです。 配列はインスタンスの生成時にその長さが決まり、変更はできません。 つまり、値が固定化されているので、メソッドのように何らかの処理をして値を取得する必要はなく、 フィールドの値で十分管理できます。 これをメソッド化しても、フィールドの値を取得するだけの実装で十分だと思われます。 なので、メソッド化すると、余分なオーバーヘッドが発生するわけです。 さらに配列は至るところで使用されています。 おそらくStringクラスのメソッド内部でも使用されているでしょう。 それほど利用頻度の高いものだと、ちょっとしたオーバーヘッドであっても、 プログラム全体の処理速度を考えると無視できなくなる可能性はあります。 現在のPCではオーバーヘッドといっても人間が体感できないくらいかもしれません。 しかし、Javaが誕生したのは1995年で、当時のPCは今とは比べられないほど貧弱でした。 おまけに中間言語であり「そもそも遅い」Javaですから、可能な限りの処理速度向上をはかりたい、 という開発者の思惑はあったのかもしれません。 さらに言えば、JavaはPC向けの言語というだけでなく、幅広いコンピュータに搭載可能である、 というのが基本理念であるため、PCよりももっと貧弱な環境でも動作するように考慮する必要があります。 確かに一貫性をもって設計すれば、最初から戸惑うこともないかもしれませんが、 別の考え方をすると、 慣れてしまえばその違いはたいしたことない、むしろそれが処理速度の足枷になるよりはマシだ、 ともいえます。 ただ、この辺は考え方にもよるところですが… もちろん、自分の考えが正解とは限らないので、本当の所はJavaの開発者に聞くしかないですが…

回答No.2

まず、どちらも「length」という名前で似たような機能ですが、無関係であると考えてください。『「length」というものがまずあって、それはjava.lang.Stringにも配列にも使える』、ということではありません。 カッコがついているものはメソッドの呼び出しで、カッコがついていないものはフィールドの参照です。java.lang.String#length()はメソッドですが、配列のlengthはフィールドです。したがって使うときの構文が違います。 Javaが注意深く設計されていれば、もっと一貫性のある定義になっていたかもしれません。言語によっては「文字列」は「文字の配列」で文字列を配列のとして扱え、その長さも配列とまったく同じ構文で参照できるものもあります。

noname#163856
質問者

お礼

ご回答ありがとうございます。 なぜ配列には length()メソッドを用意せずに、lengthフィールドを 直接参照する仕様にしたのか、不思議に思っています。 何か技術的な問題点があったのでしょうか? どなたかご存知の方おりましたら、教えてください。

回答No.1

Stringクラスのlength()は「メソッド」です。 メソッドなので「()」(カッコ)が付きます。 配列の場合は…うまく解説してあるページを探したのですが…見つかりませんでした。 ↓厳密には違いますが、以下のような説明でうまく伝わるでしょうか? 配列もオブジェクトです。 lengthは「publicでfinalなインスタンス変数」なので「()」(カッコ)が付かない。 ↓のような感じのクラス public class 配列{   public final int length;   public 配列(int len){     length = len;   } }

関連するQ&A

  • Stringクラスのlengthメソッドについて

    こんにちは、Stringクラスのlengthメソッドについて質問させてください。 今まで配列のlengthは、宣言時に長さが決定するからメソッドではなく、finalフィールドで十分。 ArrayListだとかは長さが変わるからメソッドという意識を持っていました。 (カプセル化の概念とも関わりますが) 先日その話しをしていたら、「でも文字列(Stringオブジェクト)の長さも不変だよね。」と言われました。 確かに文字列の長さは不変なのに、長さの取得にはメソッドを使っています。 言語仕様として一貫性を持たせるなら、配列もlengthメソッドにするか、文字列をlengthフィールドにしたほうが綺麗だと思うんです。 Stringクラスのソースコードを見ていたら、文字列の長さは内部的に private int count; と宣言されていました。 そして、lengthメソッドは return count; しているだけでした。 ただ、このcountフィールドに値を代入しているのはコンストラクタ内だけだったので、 public final int length; とすれば、良かったのでは?と思いました。 この考えについて、 それは間違っている、とか歴史的な背景などご存知でしたらご教授ください。 よろしくお願致します。

  • Stringの文字列をString[]配列に変換したい

    お世話になります♪ たとえばこういうStringの文字列があるとします。 String s = "私は Javaを 勉強 しています。"; これを下記のようなイメージでString[]配列に変換したいのですが、 {"私は","Javaを","勉強","しています。"}; 何かいい方法はないでしょうか? ヒントをください! よろしくお願いします。

    • ベストアンサー
    • Java
  • length()の使い方がわかりません

     java初心者です、宜しくお願いします。    lengthを配列につかってやるとlength()とするとエラーになります。  また、文字列ではlength()としないとエラーになります。  どこかこのプログラムが間違っているのでしょうか。   色々と参考書とかWEBで調べてもさっぱりわかりません。  どなたか宜しくご教示お願い致します。 ================================================================= public class H1 { public static void main(String[] args) { int d[] = {1,2}; String s = "abcd" ; System.out.println(d.length); System.out.println(s.length()); } }

    • ベストアンサー
    • Java
  • 配列のlengthの意味

    配列を作って以下のように作りました。 ==================================== var arr:Array = new Array(); arr[0] = "地球"; arr[1] = "太陽"; arr[2] = "月" arr["川"] = "rever"; arr["魚"] = "fish" arr["鳥"] = "bird"; trace(arr[0]);  //結果: 地球 trace(arr["魚"]);  //結果: fish trace(arr.length);  //結果: 3 →なぜ6ではない? ==================================== 連想配列3つと、普通の3つの2種類を arrという配列に入れたのですが、 lengthを調べると 3 と出ます。 連想配列というのは、 length には反映されないのでしょうか。 またその場合、連想配列の個数を調べるときは どのように書けばよいのでしょうか。 連想配列って、配列のどこに格納されているのだろう。。? と不思議に思ってしまいます。 ご存知の方いらっしゃいましたら、 何卒よろしくおねがいいたします。

    • ベストアンサー
    • Flash
  • VBAの配列のLengthについて

    はじめまして。 配列の要素の数を出力したいのですが、「修飾子が不正です」と表示されてしまいます。 ネット上の入門サイトで記載されている通りに.Lengthを配列に付けているのに謎です。 どなたか助言をいただければ幸いです。よろしくお願いいたします。 Sub debag() Dim xxx(10) Dim count xxx(1) = 1 xxx(2) = 3 count = xxx.Length MsgBox (count) End Sub

  • String配列を扱うアルゴリズムについて

    よりパフォーマンスの良いアルゴリズムが、 ございましたらご教示下さい。 数レコード分のDBテーブルデータが格納されたString[][]型が存在するとします。 配列の要素は、String[行(フィールド)][列(カラム)]です。 ここで、全レコード中の列ごとの最大文字列長を int[]型に取得したいと思います。 そうした場合、自作した下記の処理よりも、 よいパフォーマンスを得られるアルゴリズムがございましたら、 ご教示願いたいと思います。 ※処理前提条件 ●String[][]型変数に、過不足無くテーブルデータが格納済みであるとします。 ●配列の第一(行)・第二(列)要素の最大値は取得済みであるとします。 ////////////// // 変数定義 // ////////////// String[][] tableData; ← テーブルデータ格納済み(過不足はありません) int 行数 = 全行数(取得済み); int 列数 = 全列数(取得済み); //列毎の最長文字列値を格納する。 int[] maxLen = new int[列数]; ////////// // 処理 // ////////// //列の個数分、処理を繰り返す for(int i = 0; i < 列数; i++) {   //行の個数分、処理を繰り返す   for(int j = 0; j < 行数; j++) {     //NULLを回避する     if(tableData[i][j] != null) {       //int配列に格納済みの数値より大きければ、改めて格納する       if(maxLen[i] < tableData[i][j].length()) {         maxLen[i] = tableData[i][j].length();       }     }   } } 以上です、どなかお知恵をお貸し頂けませんか。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • String(byte[] bytes, int offset, int length)の文字コードは?

    String(byte[] bytes, int offset, int length)は、バイト配列(8bitずつのまとまり)を、文字列型に直す、というものだと思うのですが文字コードは何にしたがって直すのでしょうか? http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/String.html

    • ベストアンサー
    • Java
  • Stringの文字列に配列の値を追加させたい

    ヤフーのニュースの一ヶ月分のURLを取得させるプログラムを作成しています。 その際に、Dateという配列に取得した一ヶ月の日にちを代入させ、 それをヤフーのニュースのURLの後ろにパラメータの様に日付をつけることによって、 一か月分のニュースのURLを取得させたいと思ってます。 しかし、Stringの文字列に配列の値を追加させるにはどのようにすればいいか忘れてしまいました。 具体的には、以下の例のように、 例) Date[0] = 20060601 Date[1] = 20060602 Date[2] = 20060603 Date[3] = 20060604 String url = ""; for(int i=0;i<4;i++) url = "http://headlines.yahoo.co.jp/hl?c=soci&t=l&d=" この後ろに配列Dateの値をつける、例えば、Date[0]をつけて、 http://headlines.yahoo.co.jp/hl?c=soci&t=l&d=20060601のようにさせて、 String urlに代入させさせたいです。 このようにするには、 url = "http://headlines.yahoo.co.jp/hl?c=soci&t=l&d=" の後ろにどのように記述すればよいでしょうか? よろしくお願いします。

  • String型をchar型配列にしたい

     VC++2005ExpressEdition + PlatformSDKを使用しています.  String型をchar型配列に変換したいと思っています.  自分なりに調べてみたのですが, > String^ str = gcnew String("test"); > char chr[5]; > chr = str->ToCharArray(); などとしても次のようなエラーが出ます. > error C2440: '=' : 'cli::array<Type,dimension> ^' から 'char [5]' に変換できません。  String型からchar型配列への変換はどのようにすればいいのでしょうか.

  • char型配列をString型にしたい

     VC++2005ExpressEdition + PlatformSDKを使用しています.  char型配列をString型にしたいと思っています(MessageBoxで表示するため).  int型ならば, > String^ out = String::Format("{0}", i ); > MessageBox::Show(out); などとできます.  下のアドレス(*1)のNo.2の答えにあるように > char ss[256]; > String^ out; > out=ss; とすると > error C2440: '=' : 'char [128]' から 'System::String ^' に変換できません。 なるエラーが出ます(S を大文字にしたりハットを付けたりしています).  char型の配列のString型への変換はどのようにすればいいのでしょうか. (*1)http://oshiete1.goo.ne.jp/kotaeru.php3?q=479640