• ベストアンサー

javaのchar型とstring型の使い分け

javaでchar型とstring型はどう使い分けられているのでしょうか? 一見、1文字しか入れられないcharよりstringのほうが汎用性高いので、 文字を代入する変数はすべてcharを使わずstringだけで定義しても いいような気がしました。 よろしくお願いします

  • R958XX
  • お礼率75% (165/219)
  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • koakino
  • ベストアンサー率44% (22/50)
回答No.3

オブジェクト指向プログラミングにおいては、可能な限り最も汎用性が低いものを使うべきです。 例えば『1文字しか扱えないメソッド』があったとします。 このメソッドの引数をString型にしてしまうと、誤って2文字以上の文字列を与えてしまう可能性があります。それが間違った使い方であることは実際にそのコードが実行されるまで分かりません。もしそこでエラーにならなかったら『エラーにはならないけど思った通りに動かない』という状況になり、バグの特定は困難です。 しかし引数をchar型(あるいはCharacter型)にすれば、2文字以上の文字列を指定するコードはビルドエラーになります。むしろほとんどのプログラマーは文字列を指定しようとすらしないでしょう。 String型を使うのは『String型であればよいとき』ではなく、『String型でなければならないとき』です。汎用性が高いものを使った方がコーディングが楽というのは分かりますが、プログラムの規模が大きくなるにつれて自分の首を絞めることになりますよ。

R958XX
質問者

お礼

遅くなってすみません、ありがとうございます。

その他の回答 (2)

  • wormhole
  • ベストアンサー率28% (1621/5656)
回答No.2

まず間違いの訂正。 当初のunicodeは文字の範囲がU+0000~U+FFFFでしたのでcharは固定16ビット幅(なのでjavaのchar型は2バイトです)で1文字を表すということになっていましたが、 unicodeの方でサロゲートペア導入されてしまって文字の範囲がU+0000~U+10FFFFとなりchar型では1文字を表せなくなりました。 そのためchar型は文字単位ではなくUTF16コード単位に変更になっています(文字が1つ、2つ~ではなく、UTF16コードが1つ、2つ~です)。 java1.5からは文字を表すのはコードポイントで型はintになっています。 >javaでchar型とstring型はどう使い分けられているのでしょうか? 文字列を扱いたいときにはstring 文字を扱いたいときにはint(サロゲートペアは考慮しないというのであればchar) です。 ただ処理中、文字として扱いたいというケースはあまりない気はします。 >一見、1文字しか入れられないcharよりstringのほうが汎用性高いので、 >文字を代入する変数はすべてcharを使わずstringだけで定義しても >いいような気がしました。 確かにstringでも1文字は表せるのでできますけど、 charはプリミティブ型、stringはオブジェクト型なので単純置き換えは痛い目をみますよ。

R958XX
質問者

お礼

遅くなってすみません、ありがとうございます。

回答No.1

そりゃ2byte以上の文字を扱うのであれば、charの出番はありません。 charを使う目的だと、以下の様なことがあるでしょうか。 1. unicodeがそのまま格納できる。 2. 1byte使うだけならばcharの方がメモリの節約にもなる。 3. (昔よくあった)文字列リストを分割して格納しておくには、charの方が何かと便利。

R958XX
質問者

お礼

遅くなってすみません、ありがとうございます。

関連するQ&A

  • char型とstring型について

    char型とstring型について質問があります。 言語はC++です。 以下の関数があったとします。 void test(string a, string b string c){ 処理 } この関数を下記のように利用した場合について質問があります。 a.引数に直接文字列を挿入したケース test("aaa","bbb","ccc") b.変数に文字列を設定し、変数を引数にしたケース string a="aaa" string b="bbb" string c="ccc" test(a,b,c) (1)はコンパイルエラーになり、(2)は成功しました。 同じ様に見えるのですが、何が違うのでしょうか? また、関数の引数の型をchar*にした場合、(1)(2)のケースでコンパイルが通りました。char*型だと何が違うのでしょうか?

  • javaについて、char型に関する質問

    私プログラミングまったくの初心者であることを最初に断っておきます。 よって、なるべく噛み砕いた解説をお願いします。 javaの参考書で、「char型は文字1つ分の情報にあたります」 と書いてありました。 これはどういうことでしょうか? char型で宣言された変数は文字1つ分の情報しか入れられないということでしょうか?

    • ベストアンサー
    • Java
  • JavaでString型をChar型に変換するプログラムが分かりません

    JavaでString型をChar型に変換するプログラムが分かりません;; どなかた助けて下さい。 下のプログラムの何がいけないんでしょうか?? いろいろ間違ってるところはあると思うんですが、教えて下さい! import java.io.*; class { public static void main(String args[]) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); StringBuffer moji = new StringBuffer(str1); char nyuu=moji;

  • String型からChar配列への変換は可能?

    String型から例えばcharの配列に変換するという事はできるでしょうか String str="OKwave"だとすると char c[]={'O','K','w','a'.'v','e'}; というような感じにしたいのですが、流石に不可能でしょうか。 もし出来ないなら、代替方法とか教えていただけるとありがたいです。 とりあえず、文字を一つ一つに分けたいのです・・・ Javaはまだ初心者で、質問内容も初歩的なものだと思いますが、よろしくおねがいします。

    • ベストアンサー
    • Java
  • CHAR型ポインタについて。

    CHAR型ポインタについて。 当方C言語初心者です。 ポインタと文字列の関係分からないことが出てきました。 参考にしている本があり、そのページに下記のソースで「const char *pc1」のポインタ変数を用意して、そこに直接文字列を代入しています。 本来、「char *pc1」はchar型のアドレスを格納するための変数のはずなのに、その変数に文字列を代入してることに疑問を感じました。 この記述の仕方は間違っていないのでしょうか?また、アドレスを格納するための変数「*pc1」に「abcdefg」の文字列はどのようにメモリ上で格納されているのでしょうか? 知ってどうなるの?みたいな質問かもしれませんが、ご教授いただけると幸いです。 #include <stdlib.h> #include <string.h> void func(void) { const char *pc1 = "abcdefg"; //←ココ char *pc2 = (char *)malloc( strlen(pc1) +1); if ( pc2 ) { strcpy( pc2, pc1 ); free( pc2 ); } }

  • javaのプログラムについて

    javaのプログラムで char型の配列に格納した文字を String型の変数に格納できる関数を教えてください 具体的な使い方も教えていただけるとうれしいです

    • ベストアンサー
    • Java
  • 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

  • Java String文字列の加工について

    Java String文字列の加工について お世話になっております。 Javaで苦戦しているので、ご指導お願いします!! StringのbeforStrという変数に、 「あああ いいい ううう えええ おおお」 という風に、全角文字の間に半角スペースが入っているとき、 この変数を str1:あああ str2:いいい str3:ううう str4:えええ str5:おおお というように半角スペースで切って、その半角スペースをなくして 各変数に分割したいんですが、どうもうまくいきません。。 お手数ですが、どなたか教えてください!! ちなみに、javaは1.4です。 よろしくおねがいいたします。

    • ベストアンサー
    • Java
  • char型について【初心者です】

    プログラミング初心者です。 char型について質問です。 一般的にchar型とは文字列の定義という風に教えてもらったことがあるのですが、言語やデータベースによってchar型の定義は違うものなのでしょうか? 例えば、javaでは   char a = 'あ' というように、文字が全角一文字しか定義できないのに対して、SQLでテーブルを定義するときでは「長さ:10」というように文字を一文字以上格納できるので、大変疑問です。(この考え方が間違っているのでしょうか?) SQLの「長さ」というのも具体的に何の長さなのか分かりません。 かなりの初心者と思われるでしょうが分かりやすい回答を頂きたく思います。 よろしくお願いします。

  • System::String->char*変換でき

    C++/CLIでSystem::String^文字列をchar*に変換する関数を書いたのですが、256文字以上の文字列を投げて、戻値を確認してみると、255文字分しか中身が詰まっていません。元の文字列はアスキーのみです。 #include <msclr/marshal.h> using namespace msclr::interop; static char* toPtChar(const String^ Text) { String^ temp = (String^)Text; msclr::interop::marshal_context^ context = gcnew msclr::interop::marshal_context(); char* res = ((char*)(context->marshal_as<const char*>(temp))); return res; } この関数をどのように変更すれば、256文字以上変換できるでしょうか?

専門家に質問してみよう