問題タブ [string-interning]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 同期のデッドロック ( String intern())
私はSun jdk 1.5 ThreadPoolExecutor(24、24,60、TimeUnit.SECONDS、新しいLinkedBlockingQueue())を使用しています。soemtime jdbツールを使用して、スレッドプール内のすべてのスレッドのステータスが「モニターで待機中」であることを確認します。コードは次のとおりです。
"synchronized (key.intern()) " に問題はありますか?
jdb ツールを使用して次の情報を取得します。24 スレッドのステータスは「モニターで待機中」です。これは、24 スレッドが「key.intern()」でデッドロックしていることを意味します。
(java.lang.Thread)0x28 pool-3-thread-2 モニターで待機中
(java.lang.Thread)0x27 pool-3-thread-3 モニターで待機中
(java.lang.Thread)0x1b pool-3-thread-4 モニターで待機中
(java.lang.Thread)0x1a pool-3-thread-5 モニターで待機中
(java.lang.Thread)0x19 pool-3-thread-6 モニターで待機中
(java.lang.Thread)0x18 pool-3-thread-7 モニターで待機中
(java.lang.Thread)0x17 pool-3-thread-8 モニターで待機中 ...
結果は次のとおりです。マルチスレッド環境では、Sting intern() メソッドがデッドロックになる可能性があります。
c# - ジェネリックメソッドでの演算子のオーバーロード
このコードスニペットは、深さのC#からのものです
上記のコードスニペットの出力は次のとおりです。
mainメソッドがに変更されたとき
上記のコードスニペットの出力は次のとおりです。
なぜ理解できないのですか?
編集:文字列インターンを理解したら、次の質問は当てはまりません。
AreReferencesEqual
2番目のコードスニペット
のジェネリックメソッドでパラメーターはどのように受け取られますか?
==演算子がString型のオーバーロードされたEqualsメソッドを呼び出さないように連結すると、文字列型はどう変わりますか?
c# - .NET が既存の文字列を指すのではなく、新しい部分文字列を作成するのはなぜですか?
Reflector を使用して簡単に見るとString.Substring()
、各部分文字列にメモリを割り当てているように見えます。これが事実であるというのは正しいですか?文字列は不変なので、それは必要ないと思いました。
私の根本的な目標は、IEnumerable<string> Split(this String, Char)
追加のメモリを割り当てない拡張メソッドを作成することでした。
c# - Interning 文字列はパーサーでのパフォーマンスに役立ちますか?
解析している場合は、HTML とだけ言いましょう。要素名を読み取ったら、それをインターンすることは有益でしょうか? ここでのロジックは、このパーサーが同じ文字列 (要素名) を何度も解析するということですか? そして、いくつかのドキュメントが解析されます。
仮説:
この質問は、質問string-interning-memoryによって動機付けられました。
java - 文字列リテラルでintern()を使用する場合
私はこのようなレガシーコードをたくさん見ます:
Javadocのように、intern()の理由はわかりません。「すべてのリテラル文字列と文字列値の定数式はインターンされています。」おそらく過去の言語の改訂で、これの意図はありますか?
java - 文字列リテラルで文字列のインターンメソッドを使用する必要があるのはいつですか
String#intern()によると、文字列が文字列プールで見つかった場合、intern
メソッドは文字列プールから文字列を返すことになっています。そうでない場合、新しい文字列オブジェクトが文字列プールに追加され、この文字列の参照が返されます。
だから私はこれを試しました:
s1 and s3 are same
s3がインターンされて印刷され、印刷されないことを期待していs1 and s2 are same
ました。しかし、結果は次のようになります。両方の行が印刷されます。つまり、デフォルトでは文字列定数がインターンされます。しかし、そうであれば、なぜこのintern
方法が必要なのでしょうか。言い換えれば、この方法をいつ使用する必要がありますか?
java - Java、HashMaps、および文字列をキーとして使用-文字列値は2回保存されますか?
次のようなHashMapがある場合:
HashMap<String, MyObject>
キーがString
のフィールドであるMyObject
場合、この文字列値は2回保存されますか?
したがって、エントリを追加すると、次のようになります。
_myMap.put(myObj.getName(), myObj);
メモリの観点から文字列サイズの2倍を使用していますか?それとも、Javaは舞台裏で何か賢いことをしますか?
ありがとう
c# - c#文字列インターン
私は文字列のインターンを理解しようとしていますが、私の例ではなぜうまくいかないようです。この例のポイントは、例1ではメモリに10個の文字列しかないため、使用するメモリが少ない(メモリがはるかに少ない)ことを示しています。ただし、以下のコードでは、両方の例でほぼ同じ量のメモリ(仮想サイズとワーキングセット)を使用しています。
例1があまりメモリを使用していない理由を教えてください。ありがとう
例1:
例2:
python - 文字列は Python でプールされますか?
Pythonにはすべての文字列のプールがあり、それらは(文字列)シングルトンですか?
より正確には、次のコードでは、1 つまたは 2 つの文字列がメモリ内に作成されていますか?
c# - ストリングインターン?
2 番目の ReferenceEquals 呼び出しは false を返します。s4 の文字列がインターンされないのはなぜですか? (文字列連結に対する StringBuilder の利点については気にしません。)
私がするときString.Intern(s4);
、私はまだ偽になります。
ここでは、s3 と s4 の両方がインターンされていますが、それらの参照は等しくありませんか?