1. ホーム
  2. Java

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