問題タブ [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 - Java6とJava7では動作が異なるintern()
このコードは、Java6とJava7で異なる出力を生成します。Java6ではs1==s2
条件が返さfalse
れ、Java7では条件がs1==s2
返されますtrue
。なんで?
このプログラムがJava6とJava7で異なる出力を生成するのはなぜですか?
java - IDとしての文字列のJava同期
以下のリンク を確認しました String オブジェクトの同期に問題がありますか? および http://illegalargumentexception.blogspot.com/2008/04/java-synchronizing-on-transient-id.html
今私の質問:
- ユーザーIDといくつかのプロパティのリストが保持されているマップがあります
- 新しいユーザー ID に遭遇したら、マップにエントリを作成します。
- ユーザー ID が既に存在する場合は、いくつかのプロパティを値に追加します。
マップ全体で同期する代わりに、ユーザー ID で同期しようとしたため、ランダムな動作が発生しました。intern() を使用すると、2 番目のリンクのアプローチも機能します。
質問:
- 2番目のアプローチでは、キーを取得するときにマップ全体をロックしています
- ユーザーIDのみに基づいてマップアクセスが同期されるように、他の同期方法はありますか
- これを行う最良の方法は何ですか?
java - シリアライズ時にインターンされた文字列は保持されますか?
多くの重複文字列を含む大きなオブジェクト グラフがある場合、シリアル化する前に文字列をインターン()する利点はありますか? これにより、転送されるデータの量が減りますか? 文字列は受信側でポインタを共有しますか?
私の推測では、文字列は送信前に重複排除されるため、データのサイズが縮小され、受信側ではすべて同じオブジェクトで表されますが、実際には受信側ではインターンされません。(つまり、シリアル化の「トランザクション」ごとに文字列の新しいインスタンスが 1 つ作成されます)
c# - .Net Framework での文字列のインターン - インターンを使用する利点とタイミング
.Net フレームワーク固有の文字列インターンのプロセスと内部構造を知りたいです。また、インターニングを使用する利点と、パフォーマンスを向上させるために文字列インターニングを使用する必要があるシナリオ/状況についても知りたいです。Jeffery Richter の CLR の本からインターンについて学びましたが、まだ混乱しており、詳しく知りたいと思っています。
[編集] 以下のようなサンプル コードで特定の質問をする:
java - String.internは、Javaでオブジェクト参照をコピーするだけで同じですか?
やっている:
そしてやっている:
同じです ?
実際、テストすると、リファレンスはすべて同じです。
文字列が文字列プールにある原因は何ですか?
c# - String.Internには値がありますか?
String.Intern
後で取得できる文字列用の特別なプールがあります。
指定された文字列がプールから取得され、新しく作成されたものではないことを知る方法はありますか?例 :
s3refvalはプールから取得されました
私がそれを知る方法はありますか?
c# - インターン文字列リテラルの誤解?
理解できない :
MSDNによると
http://msdn.microsoft.com/en-us/library/system.string.intern.aspx
したがって、特定の値を持つリテラル文字列のインスタンスは、システムに1回だけ存在します。
たとえば、同じリテラル文字列を複数の変数に割り当てると、ランタイムはインターンプールからリテラル文字列への同じ参照を取得し、それを各変数に割り当てます。
この動作はデフォルト(インターンなし)ですか?またはインターンメソッドを使用して?
デフォルトの場合、なぜインターンを使用したいのですか?(インスタンスはすでに一度になります...)?
デフォルトではない場合:この行を1000回書き込んだ場合:
Console.WriteLine( "lalala");
1)メモリ内で「lalala」が1000回発生しますか?(インターンを使わずに...)
2)「ラララ」は最終的にGcされますか?
3)「ラララ」はすでに収容されていますか?もしそうなら、なぜ私はプールからそれを「取得」する必要があり、単に「lalala」をもう一度書くのではないのですか?
少し混乱しています。
java - String.intern() と手動の文字列から識別子へのマッピング?
多くの文字列比較を行い、比較的少ない文字列操作を行い、別のテーブルを使用して文字列を識別子にマップし、効率的な等価性とメモリフットプリントの削減を実現する、文字列を多用するプログラムをいくつか見たことを思い出します。
これらのプログラムの 1 つが OpenJDK の javac であったことは確かなので、おもちゃのアプリケーションではありません。もちろん、実際のクラスはもっと複雑でした(また、CharSequence を実装していると思います)が、おわかりのように、プログラム全体Name
が予想されるあらゆる場所に散らばっていString
て、文字列操作が必要なまれなケースでは、変換されました。概念的には次のように、文字列に変換してから再度キャッシュしました。
私はこれのポイントを理解していると思います-特に、周りに同じ文字列がたくさんあり、多くの比較がある場合-しかし、通常の文字列を使用してintern
それらを使用するだけでは同じことを達成できませんでしたか? ドキュメントにはString.intern()
明示的に次のように記載されています。
...
intern メソッドが呼び出されたときに、equals(Object) メソッドによって決定されたこの String オブジェクトと等しい文字列がプールに既に含まれている場合、プールからの文字列が返されます。それ以外の場合は、この String オブジェクトがプールに追加され、この String オブジェクトへの参照が返されます。したがって、任意の 2 つの文字列 s および t について、s.intern() == t.intern() は、s.equals(t) が true である場合にのみ true になります。
...
では、のようなクラスを手動で管理することと、 を使用することの利点と欠点は何Name
intern()
ですか?
これまで考えたことは次のとおりです。
- マップを手動で管理するということは、通常のヒープを
intern()
使用することを意味し、permgen を使用します。 - マップを手動で管理する場合
Name
、インターンされた文字列とインターンされていない文字列が同じ型を共有しているため、ある場所でインターンを忘れる可能性があります。 - に依存する
intern()
ということは、余分なクラスをコーディングせずに、既存の、最適化され、実証済みのメカニズムを再利用することを意味します。 - マップを手動で管理すると、新しいユーザーにとってコードがより混乱し、厳格な操作がより面倒になります。
...しかし、ここで何か他のものが欠けているように感じます。
.net - .netでの文字列の不変性とインターン
私はこの他のSOの質問に答えを投稿するつもりでしたが、とにかく、誰かがStringBuilderクラスで私の前に出て行きました...
StringBuilder Class
.NETの文字列は不変であることを理解しています。したがって、文字列を作成して変更すると、内部バッファを維持し、呼び出し時にのみ最終文字列を作成するのとは対照的に、実際にはメモリ内に2つの異なる文字列が作成されToString()
ます。また、.NETが各文字列をインターンすることも知っているので、アプリケーションで使用される文字列ごとにコピーのみが作成されます。
文字列を別の文字列に追加すると、両方ともアプリケーションで使用されているため、両方がインターンされます(そうではありませんか?)。連結演算子を使用して文字列を追加しない主な理由は、最終的に完了すると、メモリ内の文字列の束全体が、それぞれ以前よりも大きくなります。
01234
と連結する56789
と、メモリに次の2つの文字列が作成されることを理解しています。
01234
0123456789
StringBuilder
インターンのために、意志のみを使用している間:
01234
56789
明らかに2番目のアプローチはパフォーマンスに優れていますが、実際にはどれくらい優れていますか?StringBuilder
つまり、小さな値のリストからより大きな文字列を作成している場合、なぜ(それ自体がメモリスペースを必要とする)を考慮する必要があるのでしょうか。いつも使うのはいいですか?または、いつ使用するか[使用しない]かについての経験則はありますか?
java - Java文字列インターンとは何ですか?
Javaでの文字列インターニングとは何ですか、いつ使用する必要がありますか、またその理由は何ですか?