Javaの基本
1. JDKとJREの違いは何ですか?
1)JDK:Java開発キットの略称であるJava開発キットは、Java開発環境とオペレーティング環境を提供します。
2)JRE:Javaランタイム環境の略であるJavaランタイム環境は、Javaの操作に必要な環境を提供します。
3)具体的には、JDKには実際にはJRE、javaソースコードをコンパイルするためのコンパイラであるjavac、およびJavaプログラムのデバッグと分析のための多くのツールが含まれています。簡単に言うと、Javaプログラムを実行する必要がある場合は、JREをインストールするだけでよく、Javaプログラムを作成する必要がある場合は、JDKをインストールする必要があります。
2. ==と=の違いは何ですか?
以下に示すように、基本タイプと参照タイプ==の効果は異なります:
•基本タイプ:値が同じかどうかを比較します;
•参照タイプ:参照が同じかどうかを比較します;
コード例:
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true`
コードの解釈:xとyが同じ参照を指しているため、==もtrueであり、新しいString()メソッドがメモリ空間を開くように書き換えられるため、==の結果はfalseであり、equalsの比較は常に値なので、結果はすべて本当です。
equalsの解釈:
Equalsは基本的に==ですが、StringとIntegerはequalsメソッドを書き換えて、値の比較に変換します。次のコードを見て理解してください。
最初に、デフォルトで同じ値のオブジェクトを比較するイコールを見てみましょう。コードは次のとおりです。
class Cat {
public Cat(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Cat c1 = new Cat("jack");
Cat c2 = new Cat("jsck");
System.out.println(c1.equals(c2)); // false
出力は私たちの期待を超えています、それは間違っていることが判明しましたか?何が起こっているのか、等しいのソースコードを見ることができます、ソースコードは次のとおりです:
public boolean equals(Object obj) {
return (this == obj);
}
equalsは本質的に==であることがわかります。
問題は、同じ値を持つ2つのStringオブジェクトがtrueを返すのはなぜですか?コードは以下のように表示されます:
String s1 = new String("老王");
String s2 = new String("老王");
System.out.println(s1.equals(s2)); // true
同様に、Stringのequalsメソッドを入力して答えを見つけた場合、コードは次のようになります。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
StringはObjectのequalsメソッドを書き換え、参照比較を値比較に変更することがわかりました。
概要:==基本型の場合は値の比較であり、参照型の場合は参照比較です。equalsはデフォルトで参照比較ですが、多くのクラスは、String、Integerなどのequalsメソッドを更新して、値の比較なので、一般的に、equalsは値が等しいかどうかを比較します。
3. 2つのオブジェクトのhashCode()が同じである場合、equals()もtrueでなければなりません。
いいえ、2つのオブジェクトのhashCode()は同じであり、equals()は必ずしもtrueであるとは限りません。
コード例:
String str1 = "通话";
String str2 = "重地";
System.out.println(String.format("str1:%d | str2:%d", str1.hashCode(),str2.hashCode()));
System.out.println(str1.equals(str2));
実行結果:
str1:1179395 | str2:1179395
誤った
コードの解釈:明らかに、 "call"と "heavy ground"のhashCode()は同じですが、ハッシュテーブルではhashCode()が2であるため、equals()はfalseですキーと値のペアのハッシュ値は同じですが、ハッシュ値は同じであり、キーと値のペアは必ずしも同じではありません。
4. Javaでのfinalの役割は何ですか?
•最終的に変更されたクラスは、最終クラスと呼ばれ、継承できません。
•最終的に変更されたメソッドはオーバーライドできません。
•最後に変更された変数は定数と呼ばれ、定数は初期化する必要があり、初期化後に値を変更することはできません。
5. JavaのMath.round(-1.5)はどのくらいですか?
数線上の値を取る場合、中間値(0.5)は右に丸められるため、-1と等しく、正の0.5は切り上げられ、負の0.5は直接破棄されます。
6. Stringは基本的なデータ型ですか?
文字列は基本型ではありません。8つの基本型があります:バイト、ブール、char、short、int、float、long、double、およびStringはオブジェクトです。
7. Javaの操作文字列のクラスは何ですか?それらの違いは何ですか?
文字列を操作するためのクラスは、String、StringBuffer、StringBuilderです。
StringとStringBufferとStringBuilderの違いは、 Stringが不変オブジェクトを宣言することです。各操作では、新しいStringオブジェクトが生成され、ポインタが新しいStringオブジェクトをポイントします。StringBufferとStringBuilderは、元のオブジェクトに基づいて操作できます。したがって、文字列の内容が頻繁に変更される場合は、文字列を使用しないことをお勧めします。
StringBufferとStringBuilderの最大の違いは、StringBufferはスレッドセーフですが、StringBuilderはスレッドセーフではありませんが、StringBuilderはStringBufferよりもパフォーマンスが高いため、シングルスレッド環境ではStringBuilderが推奨され、マルチスレッド環境ではStringBufferが推奨されます。
8.文字列str = "i"は文字列str = new String( "i")と同じですか?
同じではありません。メモリの割り当て方法が異なるためです。String str = "i"の方法では、Java仮想マシンが定数プールに割り当てられ、String str = new String( "i ") はヒープメモリに割り当てられます。
9.文字列str = "i"は文字列str = new String( "i")と同じですか?
StringBuilderまたはstringBufferのreverse()メソッドを使用します。
サンプルコード:
// StringBuffer reverse
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("abcdefg");
System.out.println(stringBuffer.reverse()); // gfedcba
// StringBuilder reverse
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("abcdefg");
System.out.println(stringBuilder.reverse()); // gfedcba
10. Stringクラスの一般的に使用されるメソッドは何ですか?
•indexOf():指定した文字のインデックスを返します
。•charAt():指定したインデックスの文字を返します。
•replace():文字列の置換。
•trim():文字列の両端の空白を削除します。
•split():文字列を分割し、分割文字列配列を返します。
•getBytes():文字列のバイト型配列を返します。
•length():文字列の長さを返します。
•toLowerCase():文字列を小文字に変換します。
•toUpperCase():文字列を大文字に変換します。
•substring():文字列をインターセプトします。
•equals():文字列の比較。
11.抽象クラスには抽象メソッドが必要ですか?
いいえ、抽象クラスは抽象メソッドを持つ必要はありません。
サンプルコード:
abstract class Cat {
public static void sayHi() {
System.out.println("hi~");
}
}
上記のコードでは、抽象クラスに抽象メソッドはありませんが、正常に実行できます。
12.通常のクラスと抽象クラスの違いは何ですか?
•通常のクラスは抽象メソッドを含むことができず、抽象クラスは抽象メソッドを含むことができます。
•抽象クラスは直接インスタンス化できません。通常のクラスは直接インスタンス化できます。
13.抽象クラスは最終的な変更を使用できますか?
いいえ、抽象クラスの定義は他のクラスが継承するためのものです。finalとして定義されている場合、そのクラスを継承することはできません。そのため、相互に競合が発生します。したがって、finalは抽象クラスを変更できません。下の図に示すように、エディターはエラーメッセージも表示します。
14.インターフェイスと抽象クラスの違いは何ですか?
• 実装:抽象クラスのサブクラスは継承への拡張を使用します;インターフェースはインターフェースを実装するために実装を使用する必要があります。
• コンストラクター:抽象クラスはコンストラクターを持つことができますが、インターフェースは持つことができません。
• メインメソッド:抽象クラスはメインメソッドを持つことができ、それを実行できます;インターフェイスはメインメソッドを持つことができません。
• 実装数:クラスは多くのインターフェイスを実装できますが、継承できる抽象クラスは1つだけです。
• アクセス修飾子:インターフェースのメソッドはデフォルトでパブリック修飾を使用します;抽象クラスのメソッドは任意のアクセス修飾子にすることができます。
15. JavaのIOストリームのタイプは何ですか?
• 関数で分割:入力ストリーム(入力)、出力ストリーム(出力)。
• タイプ別:バイトストリームと文字ストリーム。
バイトストリームと文字ストリームの違いは、バイトストリームは 8ビットに従ってバイト単位で入力および出力データを転送し、文字ストリームは16ビットに従って文字単位で入力および出力データを転送します。
16. BIO、NIO、AIOの違いは何ですか?
• BIO:ブロックIO同期ブロッキングIOは、私たちが通常使用する従来のIOであり、シンプルなモードと便利な使用、低い同時処理能力が特徴です。
• NIO:新しいIO同期非ブロッキングIOは、従来のIOのアップグレードであり、クライアントとサーバーはチャネルを介して通信して、多重化を実現します。
• AIO:非同期IOはNIOのアップグレードで、NIO2とも呼ばれ、非同期の非ブロッキングIOを実装します。非同期IOの操作は、イベントとコールバックメカニズムに基づいています。
17.ファイルの一般的な方法は何ですか?
•Files.exists():ファイルパスが存在するかどうかを確認します。
•Files.createFile():ファイルを作成します。
•Files.createDirectory():フォルダーを作成します。
•Files.delete():ファイルまたはディレクトリを削除します。
•Files.copy():ファイルをコピーします。
•Files.move():ファイルを移動します。
•Files.size():ファイルの数を表示します。
•Files.read():ファイルを読み取ります。
•Files.write():ファイルを書き込みます。
18. Javaコンテナとは何ですか?
一般的に使用されるコンテナのカタログ:
19.コレクションとコレクションの違いは何ですか?
• java.util.Collectionは、コレクションインターフェイス(コレクションクラスのトップレベルのインターフェイス)です。コレクションオブジェクトの基本的な操作に共通のインターフェイスメソッドを提供します。Collectionインターフェイスには、Javaクラスライブラリに多くの具体的な実装があります。コレクションインターフェイスの意味は、さまざまな特定のコレクションに最大化された統合操作モードを提供することであり、その直接継承インターフェイスはリストとセットです。
• コレクションは、コレクションクラスのツールクラス/ヘルパークラスであり、コレクション内の要素の並べ替え、検索、およびスレッドセーフ操作のための一連の静的メソッドを提供します。
20.リスト、セット、マップの違いは何ですか?
21. HashMapとHashTableの違いは何ですか?
•HashMapはHashTableのcontainsメソッドを削除しますが、containsValue()およびcontainsKey()メソッドを追加します。
•HashTableは同期されますが、HashMapは非同期です。これはHashTableよりも効率的です。
•HashMapでは空のキー値が許可されますが、HashTableでは許可されません。
22. HashMapとTreeMapのどちらを使用するかを決める方法は?
マップへの要素の挿入、削除、配置などの操作には、HashMapが最適です。ただし、順序付けられたキーのセットをトラバースする必要がある場合は、TreeMapの方が適しています。コレクションのサイズによっては、HashMapに要素を追加する方が高速な場合があります。マップをTreeMapに変更して、順序付けされたキーをたどります。
23. HashMapの実装原理について教えてください。
HashMapの概要:HashMapは、ハッシュテーブルに基づくMapインターフェースの非同期実装です。この実装は、すべてのオプションのマッピング操作を提供し、null値とnullキーの使用を許可します。このクラスは、マッピングの順序を保証しません。特に、順序が永久に続くことを保証しません。
HashMapデータ構造:Javaプログラミング言語では、最も基本的な構造は2種類、1つは配列、もう1つはアナログポインター(参照)であり、すべてのデータ構造はこれら2つの基本構造を使用して構築でき、HashMapも例外なし。HashMapは、実際には「リンクリストハッシュ」データ構造です。つまり、配列とリンクリストの組み合わせです。HashMapに要素を配置する場合、まずキーのハッシュコードに従ってハッシュ値を再計算し、ハッシュ値を削除することにより、配列内のこの要素の位置(添え字)を取得します。その位置に他の要素が既に配列に格納されている場合、この位置の要素はリンクリストの形式で格納され、新しく追加されたものがチェーンの先頭に配置され、最初に追加されたものがチェーンの最後に配置されます。配列内のその位置に要素がない場合、要素は配列のその位置に直接配置されます。
HashMapの実装はJDK 1.8で最適化されています。リンクリストのノードデータが8を超えると、リンクリストは赤黒木に変換され、元のO(n)からO(logn)にクエリ効率が向上します
24. HashSetの実装原理について教えてください。
•HashSetの最下層はHashMapによって実装され
ます•HashSet
の値はHashMapのキーに格納されます•HashMapの値はPRESENTとして統合されます
25. ArrayListとLinkedListの違いは何ですか?
ArrrayListの基礎となるデータ構造は、ランダムアクセスをサポートする配列です。
LinkedListの基礎となるデータ構造は、双方向の循環リンクリストであり、ランダムアクセスをサポートしていません。
添え字を使用して要素にアクセスする場合、ArrayListの時間の複雑さはO(1)ですが、LinkedListはO(n)です。
26.配列とリストの間の変換をどのように実現しますか?
•リストを配列に変換:ArrayListのtoArray()メソッドを呼び出します。
•配列をリストに変換:配列のasList()メソッドを呼び出します。
27. ArrayListとVectorの違いは何ですか?
同期: Vectorはスレッドセーフです。つまり、そのメソッドはスレッド同期されますが、ArrayListはスレッドに対して安全ではありません。そのメソッドはスレッド同期されません。コレクションにアクセスするスレッドが1つしかない場合は、ArrayListを使用します。 、彼はスレッドの安全性の問題を考慮していないため、効率が向上します。複数のスレッドがコレクションにアクセスする場合は、Vectorを使用します
データの増加:ArrayListおよびVectorコレクションには初期容量サイズがあります。要素の数がストレージ容量を超える場合、ArrayListおよびVectorのストレージスペースを増やす必要があります。それぞれの増加は1つではなく複数です。ベクターは元のサイズを2倍に増やします。ArrayListは明示的に指定されていませんが、ソースコードから、ArrayListとVectorは元の1.5倍に増やして初期ストレージスペースサイズを設定できることがわかります。Vectorは拡張スペースサイズを設定できますが、ArrayListはできません。
28. ArrayとArrayListの違いは何ですか?
•ArrayListはオブジェクトのみを保持できますが、Arrayは基本的なタイプとオブジェクトを保持できます。
•Arrayの容量は固定されており、ArrayListの容量は必要に応じて自動的に拡張されます
•ArrayListは要素の範囲を追加、挿入、または削除するメソッドを提供しますが、Arrayでは一度に1つの要素の値しか取得または設定できません
29. Queueのpoll()とremove()の違いは何ですか?
poll()とremove()はどちらもキューから要素を削除しますが、poll()は要素の取得に失敗するとnullを返しますが、remove()が失敗すると例外をスローします。
30.どのコレクションクラスはスレッドセーフですか?
•ベクトル:Arraylistよりも1つ多くの同期メカニズム(スレッドセーフ)を備えていますが、効率が低いため、今は使用しないことをお勧めします。Webアプリケーション、特にフロントページでは、効率(ページ応答速度)が優先されることがよくあります。
•Statck:スタックタイプ、先入れ先出し。
•HashTable:Hashmapよりもスレッドセーフです。
•列挙:イテレータと同等の列挙。
•java.util.concurrentパッケージの下のすべてのコレクションクラスは、ArrayBlockingQueue、ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque ...です。