Java の基本的な 4 つの質問、いくつ答えられますか?
1. == 演算子の使用方法
まず、興味深いコードを見てみましょう
Integer c = 100,d=100; new Runnable() { public void run() { System.out.println(a==b); }
この質問が正しい答えを思いつき、その背後にある原理を理解できれば。つまり、基本は大丈夫ということです。あなたの答えが真実で真実であれば、あなたの基礎が欠けています。
最初に答えを発表し、コードを実行すると、 false true が返されます。 == は 2 つのオブジェクトの参照を比較することがわかります。ここでの abcd はすべて新しく作成されたオブジェクトであるため、論理的には false を入力する必要があります。この質問の興味深い点は、インタビューの質問であっても、フォーラムのディスカッション領域であっても、この質問の出現率が高いことです。原理は実際には非常に単純です。Integer.java クラスを見てみましょう。それが明らかになるでしょう。
public static Integer valueOf(int i) { return i >= 128 || i 整数 c = 100; を宣言するとき。このとき、自動ボックス化処理が行われます。簡単に言うと、基本データ型は Integer オブジェクトに変換されます。Integer オブジェクトへの変換は、ご覧のとおり、-128-127 というメソッドが呼び出されます。 Integer にキャッシュされます。公式の説明によると、小さい数値の方が頻繁に使用されるため、パフォーマンスを最適化するために、その間の数値がキャッシュされます。これが、この質問に対する答えが偽りであり、真実である理由です。宣言された Integer オブジェクトの値が -128 ~ 127 の場合、同じオブジェクトを参照するため、結果は true になります。
2. 次に、コードを見てみましょう
String s1 = “abc”;
System.out.println(s1 == s3);
この質問の答えをもう一度当ててみましょう?
== の構文によれば、まず、s1、s2、s3 は 3 つの異なるオブジェクトです。一般的に、出力は false になります。ただし、プログラムの実行結果は実際には true または false です。 false の 2 番目の出力は理解できますが、true の最初の出力は不可解です。いくつかの基本的なタイプの変数とオブジェクト参照変数は関数のスタック メモリに割り当てられ、新しいオブジェクトと配列はヒープ メモリに格納されることがわかっています。ただし、これとは別に、コンスタントプールと呼ばれるエリアがあります。
通常 String s1 = “abc”; と考えるのと同じように、このように宣言された文字列オブジェクトの値は定数プールに格納されます。 String s1 = "abc" のようなオブジェクトを作成すると、"abc" は定数プール (文字列プールとも呼ばれます) に格納されます。 String s2 = "abc" への参照を作成すると、Java の最下層で次のことが行われます。 「abc」が定数プールに存在するかどうかを確認します。存在する場合は、s2 がこの値を指すようにし、定数プールに存在しない場合は作成され、プールに追加されます。 。だからこそ、答えには真と偽があるのです。
3. 最後のキーワード
コードを見てみましょう
public void mRun(final String name){ new Runnable() { public void run() { try { Thread.sleep(1000) } catch (InterruptedException e ) { // TODO 自動生成された catch ブロック e.printStackTrace(); } System.out.println(name) } }.start();
このようなコードをたくさん書いたことがあると思います。内部クラスはローカル変数にアクセスします。 場合によっては、ローカル変数の前に Final 修飾子を追加する必要があります。追加しないと、コンパイラによってエラーが報告されます。通常、これが私たちが行うことです。さて、ここで 2 番目の質問が来ます。なぜ、final 修飾子を追加する必要があるのでしょうか?ほとんどの友人はこの問題について一度も考えたことがなく、それを使用するときはただ追加するだけで、原則を深く掘り下げたことはないと思います。これは優れたプログラマにとっては望ましいことではありません。何が起こっているのかだけでなく、その理由も理解する必要があります。
1秒後、syetem.out.printh(name)が実行されます。ただし、この時点では、名前の有効期限が切れており、メモリには存在しません。この種のエラーを防ぐために、Java では内部クラスのローカル変数を Final キーワードで変更する必要があることを厳密に要求しています。ローカル変数が Final によって変更された後、ローカル変数のコピーがメモリ内に保持され、内部クラスがそれにアクセスするとき、実際にアクセスされるのはこのコピーです。これは、ローカル変数のライフサイクルを延長するようなものです。結局のところ、Java エンジニアが事前にこの穴を埋めてくれました。そうでなければ、内部クラスのローカル変数について心配する友人がどれだけいるかわかりません。
4. Integer と int について
Integer a = new Integer(1000);
Integer c = new Integer(10); ;
System.out.println(a == b);
System.out.println(c == d);
この質問に対する答えがすぐに得られる場合。 , おめでとうございます。== をより完全に理解できました。
——————————————————分割線———————————————————————— –
正解: true、false
この回答を見た後、多くの友人が混乱するでしょう。最初の質問によると、整数は -128-127 をキャッシュしませんか。これは true であるはずではありませんが、よく見てみると、ここでの Integer は新しいものであり、キャッシュされていないため、結果は false になっています。
それでは、なぜ最初のものが正しいのかをもう一度見てみましょう? まず第一に、ここでの値は 1000 ですが、これは私たちが知っている整数キャッシュとはまったく関係がありません。これはキャッシュとは関係がなく、 a は新しく作成されたオブジェクトであるため、入力が false になるのは当然です。ただし、ここでの b は int 型であることに注意してください。 int と Integer が == 比較されると、Java は自動的に Integer をアンボックス化します。つまり、Integer を int 型に変換します。そのため、ここでは int 型の値が比較されるため、結果は true になります。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4
