0.質問の概要
1つは、Javaの基本です
1.2メソッド操作
1、== 和 Equals的区别,如果重写了Equals()不重写HashCode()会发生什么?
2、Java有个最基本的类Object,这个类默认包含哪几个方法?
3、对比Vector、ArrayList、LinkedList有何区别?【第8讲】(*4)
- 追问1:是不是线程安全的?
- 追问2:各自应用场景是什么?
4、对比Hashtable、HashMap、TreeMap有什么不同?【第9讲】(*3)
- 更多:……
// 接HashMap之追问系列
1、为什么是 0.75 这个值呢?
2、什么办法来解决因链表过长导致查询时间复杂度高的问题呢?
3、影响 HashMap 性能的因素?
4、HashMap的哈希函数怎么设计的?
- 追问1:初始容量为什么设置为 2 的整数次幂?【(n - 1) & hash 】
- 追问2:如果没使用 hash() 方法计算 hashCode,直接使用对象的 hashCode 值,会出现什么问题呢?
- 追问3:为什么获取下标时用按位与 &,而不是取模 %?
5、JDK1.8后对HashMap的改进(*3)
- 追问1:为什么要做这几点优化?
- 追问2:1.8 中的 HashMap 是否线程安全?
- 追问3:什么时机执行 resize()?
- 追问4:resize() 如何实现的?
6、HashMap get和put源码,
7、HashMap 的 key 需要满足什么条件?
- 追问1:HashMap 允许 key/value 为 null, 但最多只有一个。 为什么?
- 追问2:如果重写了equals(),不重写hashCode()会发生什么?
8、你平常怎么解决这个线程不安全的问题?
9、那你知道ConcurrentHashMap的分段锁的实现原理吗?
5、HashSet底层实现?
- 追问1:线程安全吗?
6、Java提供了哪些IO方式(*2)? NIO如何实现多路复用?【第11讲】
7、Java有几种文件拷贝方式?哪一种最高效?【第12讲】
8、写正则表达式进行手机号匹配(*2)。
1つは、Javaの基本です
1. ==とEqualsの違いは何ですか?
==
:基本データ型:比較値;参照データ型:比較オブジェクト(ヒープ)メモリアドレスメモリ。
equals
:デフォルトは参照比較です。多くのクラス(文字列、整数)はequalsをオーバーライドし、値の比較になります。
// 举例:
public class StringDemo {
public static void main(String args[]) {
String str1 = "Hello";
String str2 = new String("Hello"); // 开辟新的堆内存
String str3 = str2; // 引用传递
System.out.println(str1 == str2); // false
System.out.println(str1 == str3); // false
System.out.println(str2 == str3); // true
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true
System.out.println(str2.equals(str3)); // true
}
}
2. Javaには最も基本的なクラスObjectがあります。このクラスにはデフォルトでどのメソッドが含まれていますか?
関数名 | 特徴 |
---|---|
registerNatives() | ローカルメソッドを登録する |
getClass() | オブジェクトのランタイムクラスを返します |
ハッシュコード() | オブジェクトのハッシュ値を返します |
equals() | 他のオブジェクトがこのオブジェクトと等しいかどうかを示します |
クローン() | このオブジェクトのコピーを作成して返します |
toString() | オブジェクトの文字列表現を返します |
notify() | このオブジェクトモニターで待機している単一のスレッドをウェイクアップします |
notifyAll() | このオブジェクトモニターで待機しているすべてのスレッドをウェイクアップします |
待つ(長い) | 現在のスレッドがこのオブジェクトのnotify()またはnotifyAll()の呼び出しを待機するようにします |
wait(long、int) | 他のスレッドがこのオブジェクトのnotify()またはnotifyAll()を呼び出すか、他のスレッドが現在のスレッドに割り込むか、実際の時間が一定時間経過するまで、現在のスレッドを待機させます。 |
待つ() | 他のスレッドがこのオブジェクトのnotify()またはnotifyAll()を呼び出すまで、現在のスレッドを待機させます |
finalize() | ガベージコレクションがオブジェクトへの参照がこれ以上ないと判断すると、このメソッドはオブジェクトのガベージコレクターによって呼び出されます。 |
Object() | デフォルトのコンストラクタ |
3. Vector、ArrayList、LinkedListの違いは何ですか?【講義8】(* 2):保管、スレッド、拡張
オブジェクト | ストレージ | 糸 | 拡張 |
---|---|---|---|
ベクター | 動的配列 | Y | 100% |
配列リスト | 動的配列 | N | 50% |
LinkedList | 二重リンクリスト | N | - |
フォローアップ1:それぞれのアプリケーションシナリオは何ですか?
VectorとArrayListは配列の形式で順番に格納されるため、ランダムアクセスに非常に適しています。
LinkedListは挿入と削除に非常に効率的ですが、ランダムアクセスは動的配列よりも低速です。
4. Hashtable、HashMap、TreeMapの違いは何ですか?【講義9】(* 6)
Hashtable
これは同期されたハッシュテーブルの実装であり、nullキーと値をサポートしていません。同期はオーバーヘッドをより高価にし、めったに使用されません。
HashMap
これは、 nullキーや値などをサポートする非同期ハッシュテーブルの実装です。put、get
通常、操作は一定時間のパフォーマンスを実現でき、ほとんどのKey-Valueペアアクセスの最初の選択肢です。
TreeMap
基づいている赤黒木の1シーケンシャルアクセスを提供するがMap
、get、put、remove
操作の種類が時間複雑であるO(logn)
特定の順序によって、指定Comparator 或 键的自然顺序
によって決定されます。
补充:
1、相同:都是 Map 实现,是以键值对形式存储和操作数据的容器类型。
2、容器:存储元素的单元。这样来看,数据类型都是容器。
3、线程同步:多线程操作一个资源导致资源不一致,这需要协调资源的调度,即线程同步。
4、线程安全:多线程访问类X时,X都表现正确行为,则X是线程安全。 线程安全类封装了同步机制。
フォローアップシリーズ:
1、为什么是 0.75 这个值呢?
2、什么办法来解决因链表过长导致查询时间复杂度高的问题呢?
3、影响 HashMap 性能的因素?
4、HashMap的哈希函数怎么设计的?
- 追问1:初始容量为什么设置为 2 的整数次幂?【(n - 1) & hash 】
- 追问2:如果没使用 hash() 方法计算 hashCode,直接使用对象的 hashCode 值,会出现什么问题呢?
- 追问3:为什么获取下标时用按位与 &,而不是取模 %?
5、JDK1.8后对HashMap的改进(*3)
- 追问1:为什么要做这几点优化?
- 追问2:1.8 中的 HashMap 是否线程安全?
- 追问3:什么时机执行 resize()?
- 追问4:resize() 如何实现的?
6、HashMap get和put源码,
7、HashMap 的 key 需要满足什么条件?
- 追问1:HashMap 允许 key/value 为 null, 但最多只有一个。 为什么?
- 追问2:如果重写了equals(),不重写hashCode()会发生什么?
8、你平常怎么解决这个线程不安全的问题?
9、那你知道ConcurrentHashMap的分段锁的实现原理吗?
詳細な回答については、以下を参照してください。[質問] [Java]ハッシュマップ+インタビューの仕上げ
5. HashSetの基本的な実装?
レイヤーはHashMapでラップされ、オブジェクトの静的定数はデフォルトで保存され、フェッチ時にキーのみが返されます。addメソッドは、HashMapのput()メソッドを呼び出して実装します。
if key is existed, then 是旧值,失败;
if (map.put()==null), then 添加元素作为map.key
フォローアップ1:スレッドセーフですか?
安全ではありません。HashMapと同じです。
6. JavaはどのIOメソッド(* 2)を提供しますか?NIOはどのようにして多重化を実現しますか?【レクチャー11】
多くのJavaIOメソッドがあり、さまざまなIO抽象モデルと相互作用メソッドに基づいて簡単に区別できます。
まず、ストリームモデルに基づいて実装される従来のjava.ioパッケージは、ファイルの抽象化、入力および出力ストリームなど、最もよく知られているIO関数のいくつかを提供します。相互作用メソッドは同期およびブロックメソッドです。つまり、入力ストリームの読み取りまたは出力ストリームの書き込みの場合、スレッドは読み取りおよび書き込みアクションが完了するまで常にそこでブロックし、それらの間の呼び出しは信頼できるものになります。線形シーケンス。
java.ioパッケージの利点は、コードが比較的単純で直感的であることですが、欠点は、IOの効率とスケーラビリティに制限があり、アプリケーションのパフォーマンスのボトルネックになりやすいことです。
多くの場合、ネットワーク通信もIO動作であるため、Java.netで提供されるSocket、ServerSocket、HttpURLConnectionなどのネットワークAPIの一部を同期ブロッキングIOライブラリに分類します。
次に、NIOフレームワーク(java.nioパッケージ)がJava 1.4で導入され、チャネル、セレクター、バッファーなどの新しい抽象化を提供します。これにより、多重化された同期ノンブロッキングIOプログラムを構築しながら、より緊密な操作を実現できます。高性能システムの下部にあるデータ操作モード。
第3に、Java 7では、NIOがさらに改善されました。つまり、多くの人がAIO(非同期IO)とも呼ばれる非同期ノンブロッキングIOメソッドを導入するNIO2です。非同期IO操作はイベントとコールバックメカニズムに基づいています。アプリケーション操作はそこでブロックせずに直接戻ると簡単に理解できます。バックグラウンド処理が完了すると、オペレーティングシステムは対応するスレッドにフォローアップ作業を実行するよう通知します。
7. Javaにはいくつのファイルコピー方法がありますか?どれが最も効率的ですか?【レクチャー12】
Javaには、次のようなさまざまな一般的なファイルコピーの実装方法があります。
java.ioクラスライブラリを使用して、ソースファイルが読み取るFileInputStreamを直接構築し、次にターゲットファイルのFileOutputStreamを構築して書き込み作業を完了します。
public static void copyFileByStream(File source, File dest) throws
IOException {
try (InputStream is = new FileInputStream(source);
OutputStream os = new FileOutputStream(dest);){
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
}
}
または、java.nioクラスライブラリによって提供されるtransferToまたはtransferFromメソッドを使用します。
public static void copyFileByChannel(File source, File dest) throws
IOException {
try (FileChannel sourceChannel = new FileInputStream(source)
.getChannel();
FileChannel targetChannel = new FileOutputStream(dest).getChannel
();){
for (long count = sourceChannel.size() ;count>0 ;) {
long transferred = sourceChannel.transferTo(
sourceChannel.position(), count, targetChannel); sourceChannel.position(sourceChannel.position() + transferred);
count -= transferred;
}
}
}
もちろん、Java標準ライブラリ自体はすでにFiles.copyのいくつかの実装を提供しています。
コピーの効率のために、これは実際にはオペレーティングシステムと構成に関連しています。一般に、NIO transferTo / Fromメソッドは、最新のオペレーティングシステムの基盤となるメカニズムをより有効に活用して、不要なコピーとコンテキスト切り替えを回避できるため、より高速です。
8.携帯電話番号に合わせて正規表現を書く(* 2)
# 号码规则:
1、第 1 位: 1
2、第 2 位: 3~9
3、第 3 到第 11 位只要是数字就行.
答案: /^[1]([3-9])[0-9]{
9}$/
(1) /^ - 表示文本开始;
(2) () - 子表达式的开始与结束;
(3) [] - 要匹配里面内容,[0-9]匹配数字范围为0/1/2/3/4/5/6/7/8/9;
(4) {
n} - 匹配n次,{
9}是匹配9次;
(5) ^ - 字符串开始,\^ - 匹配 ^ 字符本身; $ - 字符串结束。
3、参照
1. Java構文-Javaでイコールと==の違い
2.ドゥあなたは本当に==とequalsの違いを理解できますか?
3.なぜ書き換えのequals()ともハッシュコード()書き換え
4を書き換え後hashCodeメソッドを書き換える必要が方法等しい
5.携帯電話番号のセグメント正規表現(2019から01最新)
6.レギュラーexpression-構文
7、[疑問ソーティングをout] [Java] HashMapの詳細な説明+インタビューの仕上げ