質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

意見交換

クローズ

15回答

1853閲覧

Stringのイミュータブルについて

yuta4423yuta

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

0グッド

0クリップ

投稿2023/08/10 14:35

0

0

この場合はStringオブジェクトはイミュータブルなためrrrメソッドとメインメソッドでは違うオブジェクトを参照しているということでよいでしょうか?
オブジェクトが二つできて同じ変数で二つ参照しているということでしょうか?

java

public class a {

public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String a="a"; rrr(a); System.out.println(a); } public static void rrr(String s) { s="sss"; System.out.println(s); }

}
出力
sss
a

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

回答15

#1

jimbe

総合スコア12648

投稿2023/08/10 15:18

ご提示のコードで結果が

sss sss

とならない理由なら

Stringオブジェクトはイミュータブルなため

とは関係ないと思います。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#2

yuta4423yuta

総合スコア1

投稿2023/08/10 15:41

どのような理由なのでしょうか?

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#3

otn

総合スコア84566

投稿2023/08/10 16:18

編集2023/08/10 16:24

このケースでは、文字列がイミュータブルかどうかは関係ありません。
メソッドrrrの仮引数のsに代入した段階で、実引数であったaの中味の文字列"a"と、変数sの関係は無くなります。

a = "a"; s = a; s = "sss"; System.out.println(a);

・変数への代入(変数に入っているオブジェクトを、別のオブジェクトに入れ替える)
・ミュータブルなオブジェクトの加工(変数に入っているオブジェクトをそのオブジェクトのまま入れ替えず、中味を変更する)
の2つの区別が付かないと言うことかと思いますが、別の概念です。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#4

yuta4423yuta

総合スコア1

投稿2023/08/11 02:30

参照番地のコピーをわたしているためミュータブル、イミュータブルが関係すると思うのですがどうでしょうか打ち消し線

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#5

otn

総合スコア84566

投稿2023/08/11 03:34

参照番地のコピーをわたしているためミュータブル、イミュータブルが関係すると思う

「参照番地のコピーをわたしている」ことと、「ミュータブル、イミュータブル」と、どんな関係があると思っていますか?

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#6

jimbe

総合スコア12648

投稿2023/08/11 03:39

編集2023/08/11 11:55

#4
String オブジェクトがイミュータブルなことと、 String 型変数がイミュータブル(?) なことは違います。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#7

yuta4423yuta

総合スコア1

投稿2023/08/11 05:06

これがもしミュータブルオブジェクトのStringBuilderだと参照番地のコピーをして書き換えると呼び出し元も変わってしまうが、イミュータブルのStringだと”a”オブジェクトを書き換えることができないため、”sss”のオブジェクトを新しく生成してそこを参照するという考え方ではないのでしょうか?

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#8

otn

総合スコア84566

投稿2023/08/11 05:14

これがもしミュータブルオブジェクトのStringBuilderだと参照番地のコピーをして書き換えると呼び出し元も変わってしまうが、イミュータブルのStringだと”a”オブジェクトを書き換えることができないため、”sss”のオブジェクトを新しく生成してそこを参照するという考え方ではないのでしょうか?

はい。そういう考え方は間違っています。
先の回答に書いた、

a = "a"; s = a; s = "sss"; System.out.println(a);

と同じ事が起こっています。これがミュータブルでも同じです。

a = なんらかのミュータブルなオブジェクトその1; s = a; s = 上とは異なる何らかのミュータブルなオブジェクトその2; System.out.println(a);

だと、その1が表示されます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#9

yuta4423yuta

総合スコア1

投稿2023/08/11 05:54

他の意見どなたかあるでしょうか?

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#10

TN8001

総合スコア9326

投稿2023/08/11 07:03

編集2023/08/11 07:24

この辺の動作を理解できていないってことですよね?
もう参照渡しとは言わせない - Qiita

まあ間違えている人もいっぱいいるわけですが、「その動作がない言語」で理解するのはなかなか難しい話だとは思います。
"call by reference"ではない動作を「参照渡し」と言っている記事まとめ - Qiita

「その動作がある言語」を、ちょっとでも触ってみるといいかもしれません^^
C#

cs

1public class a 2{ 3 public static void Main(string[] args) 4 { 5 string a = "a"; 6 rrr(ref a); 7 System.Console.WriteLine(a); 8 } 9 10 public static void rrr(ref string s) 11 { 12 s = "sss"; 13 System.Console.WriteLine(s); 14 } 15}

出力

sss sss

SharpLab

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#11

hqf00342

総合スコア273

投稿2023/08/11 07:24

ご提示のコードをミュータブルと言われるStringBuilderで書くとこうでしょうか。

java

1public static void main(String[] args) throws Exception { 2 var a = new StringBuilder("a"); 3 rrr(a); 4 System.out.println(a); 5} 6 7public static void rrr(StringBuilder s) { 8 s= new StringBuilder("sss"); 9 System.out.println(s); 10}

これも出力は
sss
a
になるかと思います。
この8行目が#3 otnさんの言われていることです。

メソッドrrrの仮引数のsに代入した段階で、実引数であったaの中味の文字列"a"と、変数sの関係は無くなります。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#12

yuta4423yuta

総合スコア1

投稿2023/08/11 11:36

編集2023/08/11 12:11

返信ありがとうございます。
何度も質問申し訳ございません
String sに参照番地のコピーが入れられていたがs="sss";とすることで新しい参照の番地がsに格納されたという認識でしょうか
返信よろしくお願いいたします。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#13

otn

総合スコア84566

投稿2023/08/11 12:20

String sに参照番地のコピーが入れられていたがs="sss";とすることで新しい参照の番地がsに格納された

その通りです。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#14

yuta4423yuta

総合スコア1

投稿2023/08/11 12:24

ありがとうございます。解決しました。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#15

d01si13293

総合スコア7

投稿2023/08/17 00:03

結局何がわからなかったのかわからん

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

最新の回答から1ヶ月経過したため この意見交換はクローズされました

意見をやりとりしたい話題がある場合は質問してみましょう!

質問する

関連した質問