• 締切済み

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

Foxtrot_OWの回答

回答No.2

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

noname#163856
質問者

お礼

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

関連する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