問題タブ [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 - 文字列リテラルの動作がわかりにくい
以下のコードでは、文字列リテラルの動作が非常に混乱しています。
ライン 1、ライン 2、ライン 3 はtrue
であることは理解できますが、ライン 4 はなぜfalse
ですか?
両方のハッシュコードを印刷すると、それらは同じです。
==
参照の等価性をチェックし、リテラルのプールをチェックインすることを知っています。私equals()
は正しい方法を知っています。コンセプトを理解したい。
私はすでにこの質問をチェックしましたが、明確に説明されていません。
完全な説明をいただければ幸いです。
python - Python は文字列をインターンしますか?
Java では、明示的に宣言された文字列は JVM によってインターンされます。そのため、同じ文字列の後続の宣言は、2 つの別個の (しかし同一の) 文字列ではなく、同じ文字列インスタンスへの 2 つのポインターになります。
例えば:
私の質問は、CPython (または他の Python ランタイム) が文字列に対して同じことを行うかどうかです。たとえば、クラスがある場合:
そして、このクラスのインスタンスを 10 個作成します。それぞれに、メモリ内の同じ文字列を参照するインスタンス変数がありますか?それとも 10 個の個別の文字列になってしまうでしょうか?
java - int から String への変換はオートボクシングとしてカウントされますか?
AFAIKプリミティブがラッパークラスにボックス化されているため、Javaがプリミティブ型を呼び出されたオートボクシングよりもラッパークラスオブジェクトに自動的に変換する場合。
そうです
オートボクシングとしてカウントされますか?
尋ねる理由は?
私は最近この質問に出くわしました。私が思う理由は、Java 5で導入されたオートボクシングです(Java 4には存在しません)。
emacs - (read-command ...) 空白の入力で奇妙なオブジェクトを返す
を使用してユーザーにコマンドを要求し、ユーザーread-command
がミニバッファーに空の文字列を入力したかどうかに基づいてアクションを実行する必要があります。
ほとんどのread-command
場合、有効なコマンドを返します。しかし、ユーザーが (ミニバッファーでエンターを押すだけで) 空白の文字列を入力すると、nil
、文字列でもコマンドでもない奇妙なオブジェクトが返されます ( および によるstringp
とcommandp
)。
どうやって:
- このオブジェクトの読み取り構文にアクセスしますか?
- ここで定義されたすべての型述語と照合せずに、オブジェクトの型を決定します
- このオブジェクトに対する等価性をテストしますか?
- 行儀が悪いのはなぜ
read-command
?の仕様read-command
:
read-command は、`minibuf.c' の組み込み関数です。
(read-command PROMPT &optional DEFAULT-VALUE)
コマンドの名前を読み取り、シンボルとして返します。PROMPT でプロンプトを出します。デフォルトでは、リストの場合は DEFAULT-VALUE またはその最初の要素を返します。
[戻る]
nil
として渡したので、期待していましDEFAULT-VALUE
たが、どうやらread-command
気にしないようです。
のソースを読み込んでminibuf.c
何が起こっているのかを確認しようとしましたが、それを機能させることもできませんでした。ここemacs-23.3b.tar.gz
からダウンロードし、emacs でソースを探しましたが、見つかりませんでした。どちらもそこに存在していないようです。非常にイライラするものです。ポインタをいただければ幸いです。minibuf.c
java - Java で文字列をインターンする
次のコード セグメントは、文字列をインターンします。
がインターンされたため、式concat1=="mystring"
が返されます。true
concat1
指定された文字列が次のスニペットに示すようにmystring
変更された場合。string
比較式は をconcat11=="string"
返しますfalse
。によって保持されている文字列concat11
はインターンされていないようです。私はここで何を見落としていますか?
Java 7、アップデート 11 でテストしました。
編集:
コード全体:
java - 起動時に一時的に 1 GB の PermGen を使用する可能性があるのは何ですか?
Weblogic 12c で実行されているアプリケーションは、起動の後期段階で PermGen 領域を一時的に大量に使用します。「一時的」と言ったのは、PermGen の制限 (500MB) までは「鋸歯状」の成長を示し、その後ほぼ一定のベース レベル (約 300MB) まで即座に低下し、次のようにグラフ化するためです。. 約 5 回の長い反復の後、通常の起動が再開されます。
「-verbose:class」をオンにして実行すると、この動作中にクラスがロードまたはアンロードされていないことがわかります。
PermGen のどのような使用法がこの一連の症状を示す可能性がありますか? 私が考えることができるのは、なんらかの理由で、約1ギガバイトのインターンされた文字列が作成され、ガベージコレクションされているということだけです。
更新 これは、Solaris HotSpot 1.7 で実行されています。 文字列は Java 7 ではインターンされません。
更新 2 これは、おそらく WebLogic 固有の ServletContextInitializer によって処理されるクラスをロードしようとする際の問題のようです。ServletContextInitializers もライブラリもありません。これは、基本的な WebLogic クラスローダ スペースの一部である必要があります。そこにはたくさんあります。ServletContextInitializer の @HandlesTypes がフラグを立てているクラスで使用される基本クラス、インターフェイス、または注釈の NoClassDefFound のエラー処理にバグがあると思います。