Java の詳細です。Listはadd(null)できる?
2022-02-28 16:24:45
コードを書いていると、時々forループに遭遇し、その下を書くときに少し躊躇することがあります。
List
dataList = ... ;
for (Data d : dataList) {
if (d ! = null) { // Do I need this judgment?
// ...
}
}
上記の疑問の理由は、我々はリストインターフェイスは、LinkedList(チェーンテーブルの実装に基づいて)、ArrayList(配列の実装に基づいて)と他の実装クラスを持っていることを知っているが、我々はリストのソースコードに精通していないことですが、追加メソッドのその実装の詳細には注意を払っていない、それは質問として疑問を発生させるでしょう。この記事では、まず結論を出し、最終的にその理由を分析するために行く。
ローカルでテストコードを書いて、ListにNullオブジェクトを追加して、トラバーサルを行う。
private void printList() {
List
dataList = new ArrayList<>();
dataList.add(1);
dataList.add(null);
dataList.add(null);
for (Integer d : dataList) {
System.out.println(d);
}
System.out.println("------------------------");
for (Integer d : dataList) {
if (d ! = null) { // Do we need this judgment?
System.out.println(d);
}
}
}
テスト関数出力
1
null
null
------------------------
1
<マーク
という質問に対して リストは(null)を追加できますか?答えはイエスで、NULLオブジェクトをリストに追加することができます。このことは、上の例でもよく理解できます。
この問題を理解する上で重要なポイントは、ArrayListの基本原理であり、この問題では以下の点に着目しています。
- Listの一番下は配列、つまりObject[] elementDataであり、配列は要素に制約がありません。これはソースコードで説明することができます。
/**
* This helper method split out from add(E) to keep method
* bytecode size under 35 (the -XX:MaxInlineSize default value),
* which helps when add(E) is called in a C1-compiled loop.
*/
private void add(E e, Object[] elementData, int s) {
if (s == elementData.length)
elementData = grow();
elementData[s] = e;
size = s + 1;
}
/**
* Appends the specified element to the end of this list.
*
* @param e element to be appended to this list
* @return {@code true} (as specified by {@link Collection#add})
*/
public boolean add(E e) {
modCount++;
add(e, elementData, size);
return true;
}
- JavaオブジェクトがNULLを扱えるかどうかについて、HashmapとHashtableを混同しないように、HashMapはNULLのキー(key)と値(value)を受け入れることができますが、Hashtableはそうではありません。これはソースコードで説明します。
土台となるHashmapは、配列、連鎖表、赤と黒で構成されています。のキー値によって配列の添え字が決まります。
Node
Hashtable is composed of arrays and chained tables at the bottom. The subscript of an array is determined by the key value
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
// If the key is null, key.hashCode() will report a NullPointerException
// Makes sure the key is not already in the hashtable.
Entry<? ,? > tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
@SuppressWarnings("unchecked")
Entry
Reference
1.
https://blog.csdn.net/krossford/article/details/83903851
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
// If the key is null, key.hashCode() will report a NullPointerException
// Makes sure the key is not already in the hashtable.
Entry<? ,? > tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
@SuppressWarnings("unchecked")
Entry
Reference
1.
https://blog.csdn.net/krossford/article/details/83903851
関連
-
xxx は型に解決できない エラー解決
-
SLF4J: クラスパスが複数の SLF4J バインディングを含んでいる Error
-
Java の例外解決。コンストラクタの呼び出しはコンストラクタ内の最初のステートメントでなければならない
-
互換性のない型です。ArrayList<ArrayList<Integer>>はList<List<Integer>>に変換できない。
-
Java 文字クラスとメソッド
-
エラー コンストラクタ worker(int, String, float) は未定義です。
-
[Java] jdk1.7 trustAnchors パラメータは空であってはならない
-
既に使用されているアドレス:JVM_Bind (ポート競合)
-
JIRA REST API 呼び出し方法
-
org.apache.tools.zip を使用した Zip 圧縮・解凍
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
アクセス制限です。タイプ 'BASE64Decoder' は API ではない (必要なライブラリ xxx の制限)
-
List<Integer> 型をインスタンス化できません。
-
Javaでエラーが発生しました。非静的フィールドへの静的な参照を作成できません。
-
JAVAMail TLS配信の注意点
-
XXX型を囲むインスタンスはアクセスできない問題をJavaで解決
-
java にリソースリークがある: 'input' が閉じられない Solution
-
無効なカラム名
-
HttpServletRequest型ではgetServletContext()メソッドは未定義です。
-
svn: 接続から読み取ることができません。リモートホストが既存の接続を強制的に閉じました。
-
Javaで未処理の例外が発生する理由