Javaの基本
1. JDKとJREの違いは何ですか?
-
JDK:Java開発キットの略であるJava開発キットは、Java開発環境と実行環境を提供します。
-
JRE:Javaランタイム環境の略であるJavaランタイム環境は、Javaの動作に必要な環境を提供します。
具体的には、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は基本的に==ですが、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("王磊");
Cat c2 = new Cat("王磊");
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()は必ずしも真ではありません。
コード例:
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()は同じですが、equals()はfalseです。これは、ハッシュテーブルでは、hashCode()が等しい、つまり、2つのキーと値のペアのハッシュ値が等しいためです。値が等しいことを期待しても、必ずしもキーと値のペアが等しいとは限りません。
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. String str = "i"は、String str = new String( "i")と同じですか?
メモリの割り当てが異なるため、同じではありません。文字列str = "i"の方法では、Java仮想マシンが定数プールに割り当て、文字列str =新しい文字列( "i")はヒープメモリに割り当てられます。
9.文字列を逆にする方法は?
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():文字列の置換。
-
トリム():文字列の両端の空白を削除します。
-
split():文字列を分割し、分割された文字列配列を返します。
-
getBytes():文字列のバイト配列を返します。
-
length():文字列の長さを返します。
-
toLowerCase():文字列を小文字に変換します。
-
toUpperCase():文字列を大文字に変換します。
-
substring():インターセプト文字列。
-
等しい():文字列比較。
11.抽象クラスには抽象メソッドが必要ですか?
いいえ、抽象クラスは抽象メソッドを持つ必要はありません。
サンプルコード:
abstract class Cat {
public static void sayHi() {
System.out.println("hi~");
}
}
上記のコードでは、抽象クラスに抽象メソッドはありませんが、正常に実行できます。
12.通常のクラスと抽象クラスの違いは何ですか?
-
通常のクラスは抽象メソッドを含むことができず、抽象クラスは抽象メソッドを含むことができます。
-
抽象クラスは直接インスタンス化できません。通常のクラスは直接インスタンス化できます。
13.抽象クラスをfinalで装飾できますか?
いいえ、抽象クラスの定義は他のクラスによって継承されます。finalとして定義されている場合、クラスを継承できないため、互いに競合するため、finalは抽象クラスを変更できません。次の図に示すように、エディターはエラーメッセージも表示します。
14.インターフェイスと抽象クラスの違いは何ですか?
-
実装:抽象クラスのサブクラスは継承への拡張を使用します;インターフェースはインターフェースを実装するために実装を使用する必要があります。
-
コンストラクター:抽象クラスはコンストラクターを持つことができますが、インターフェースは持つことができません。
-
mainメソッド:抽象クラスはmainメソッドを持つことができ、それを実行できます;インターフェイスはmainメソッドを持つことができません。
-
実装数:クラスは多くのインターフェースを実装できますが、継承できるのは抽象クラスのみです。
-
アクセス修飾子:インターフェースのメソッドはデフォルトでpublic修飾子を使用します;抽象クラスのメソッドは任意のアクセス修飾子にすることができます。
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():ファイルを書き込みます。
(終了)