JavaRush /Java Blog /Random-JA /コーヒーブレイク#221。Java 配列内の要素を検索する 3 つの方法。Java Thread Local とは...

コーヒーブレイク#221。Java 配列内の要素を検索する 3 つの方法。Java Thread Local とは何か、およびその使用方法

Random-JA グループに公開済み

Java 配列内の要素を検索する 3 つの方法

出典: Asyncq この投稿は、Java で配列内の要素を検索するさまざまな方法をより深く理解するのに役立ちます。 コーヒーブレイク#221。 Java 配列内の要素を検索する 3 つの方法。 Java Thread Localとは何ですか、そしてその使用方法 - 1一連の値の中から特定の要素を検索することは、ソフトウェア開発において非常に一般的で頻繁に使用される操作です。この問題を解決するには、単純なものから最適化されたものまで、さまざまなアプローチがあります。それらを見てみましょう。

入力データ

入力配列にはプリミティブ ID データが含まれており、それに id->3 が含まれているかどうかを知る必要があります。
int[] ids = { 1,2,13,14,15,3,10,11,12,4,5,6,7,8,9 };
int inputId = 3;

方法 1 (簡単)

  1. 配列のすべての要素を一度に 1 要素ずつ訪問します。
  2. さらに、ターゲット要素が配列内に存在する場合は、その要素の状態を追跡します。
  3. この要素が見つかるとすぐに、ステータスをfalseからtrueに切り替えます。
  4. ループが完了したら、ステータス フラグを返します。
boolean valExist = false;
for (int id : ids) {
   if (inputId == id) {
             valExist = true;
   }
}
return valExist;
このソリューションは機能しますが、あまり効率的ではありません。if条件を見ると、すべての要素に対してこの条件をテストしていることがわかります。探している要素が最初の要素であるとしますが、ループは引き続きすべての要素に対して実行されます。ここでは、要素を見つけたらすぐにループを終了する方が賢明です。こうすることで、探している要素が最後の位置にない場合の計算を節約できます。
boolean valExist = false;
for (int id : ids) {
    if (inputId == id) {
                valExist = true;
                break;
     }
}
return valExist;
return を 使用すると、コードをさらに簡潔にすることができます。探している要素が見つかったらすぐにtrueを返すことができます。それ以外の場合は、ループが完了するとすぐにfalseを返します。また、状態変数を作成して維持する必要もありません。
for (int id : ids) {
      if (inputId == id) {
                return true;
       }
  }
  return false;

方法 2

  1. デフォルトでリスト内のターゲット要素を検索するメソッドを含むArrayList を使用できます。
  2. このメソッドはListによって提供されるため、プリミティブ配列をリストに変換する必要があります。
  3. プリミティブをオブジェクト型に変換し、そこからリストを作成する単一のラムダ文字列を使用できます。
    return Arrays.asList(Arrays.stream(ids).boxed().toArray())
                  .contains(inputId);
  4. Java 8 Stream API を使用すると、コードを機能的にし、さらに短くすることができます。
  5. Stream API がストリームでどのように動作するかを理解するには、入力配列をストリームに変換する必要があります。
  6. Arrays.stream は入力配列を受け取り、それをストリームに変換します。
  7. スレッドができたので、多くの便利なメソッドを使用できます。その 1 つがanyMatchです。述語(id == inputId)に一致する要素を返します。
  8. これらすべてにより、コードが大幅に短くなり、読みやすくなります。
    return Arrays.stream(ids)
              .anyMatch(id -> id == inputId);

方法 3 (最適化)

はい、上記のコードは機能し、読みやすいですが、ストリーム内の各要素にアクセスして比較する必要があります。
  1. メモリが問題ではなく、計算を最適化したい場合、ここでできることの 1 つは、入力配列からセットを作成することです。
  2. 関数型スタイル コードを再度使用して、プリミティブ配列をSetに変換できます。
  3. Set を取得したので、一定期間にわたって要素を検索できます。
S
et<Integer> idsSet = Arrays.stream(ids).boxed().collect(Collectors.toSet());
return idsSet.contains(inputId);

ボーナス

単一要素の検索は一般的な操作と考えられますが、より一般的なのは配列内の複数の要素の検索です。この場合、 Setを使用しない場合、ループが 2 つになり、時間の計算量が増加して 2 つのコレクションの長さが倍増します。以下は、配列の 1 つをセットとして変換し、もう一方の配列を反復処理してセット操作で検索を実行する例です。これにより、メモリが増加し、同時に計算が節約されます。
int[] targetIds = { 1, 3, 6, 88, 999, 34, 44, 55};
int[] ids = { 1,2,13,14,15,3,10,11,12,4,5,6,7,8,9 };


Set<Integer> idsSet = Arrays.stream(ids).boxed().collect(Collectors.toSet());
return Arrays.stream(targetIds)
            .boxed()
            .filter(id -> !idsSet.contains(id))
            .mapToInt(a -> a)
            .toArray();

Java Thread Local とは何か、およびその使用方法

出典: Mediumこの記事では、Java Thread Localとそれを Java アプリケーションで効果的に使用する方法について説明します。 コーヒーブレイク#221。 Java 配列内の要素を検索する 3 つの方法。 Java Thread Localとは何ですか、そしてその使用方法 - 2Java Thread Local は、開発者が特定のスレッドに対してのみ変数を作成できるようにする強力な機能です。これは、各スレッドが変数の独自のコピーを持つことができ、あるスレッドで変数に加えられた変更は、別のスレッドの値に影響を与えないことを意味します。

スレッドローカルとは何ですか

Thread Local は、特定のスレッドに対してローカルな変数を作成できる Java API のクラスです。つまり、各スレッドは変数の独自のコピーを持ち、あるスレッドで変数に加えられた変更は、別のスレッドの値に影響を与えません。このため、Thread Local は、ユーザー認証情報、データベース接続、その他のスレッド固有の情報などのスレッド固有のデータを保存するための理想的なソリューションになります。

Java でのスレッド ローカルの仕組み

Java アプリケーションでThread Localを使用するには、まずThread Localクラスのインスタンスを作成する必要があります。これは、このクラスの新しいインスタンスを作成するThreadLocalコンストラクターを呼び出すことで実行できます。次に、 Thread Localオブジェクトを作成すると、それを使用してスレッド固有のデータを保存および取得できます。Java アプリケーションで Thread Localを使用する方法の例を次に示します。
public class MyThreadLocalClass {
  private static final ThreadLocal<String> threadLocal = new ThreadLocal<>();

  public static void set(String value) {
    threadLocal.set(value);
  }

  public static String get() {
    return threadLocal.get();
  }
}
この例では、String型のthreadLocalという名前のThread Localオブジェクトを作成しました。また、スレッド ローカル変数の値を格納および取得できるようにするset()get()という 2 つのメソッドも作成しました。スレッド ローカル変数に値を格納するには、 set()メソッドを呼び出して、格納したい値を渡すだけです。たとえば、MyThreadLocalClass.set("Hello, World!")を呼び出して、文字列「Hello, World!」を保存できます。スレッドローカル変数に。スレッド ローカル変数の値を取得するには、単にget()メソッドを呼び出します。たとえば、String value = MyThreadLocalClass.get()を呼び出して、スレッド ローカル変数の値を取得できます。

スレッド ローカルを使用する場合の推奨事項

Thread Local はJava アプリケーションの強力なツールですが、潜在的な問題を避けるために正しく使用することが重要です。Thread Localを使用する際に留意すべきガイドラインをいくつか示します。
  1. 必要な場合にのみスレッド ローカルを使用します。スレッド固有のデータに対してのみ使用します。データがスレッド固有でない場合は、別の方法で保存する必要があります。
  2. 過度のメモリ使用を避ける:スレッド ローカルは、慎重に使用しないと大量のメモリを消費する可能性があります。過度のメモリ使用を避けるために、スレッド ローカル変数が不要になった場合は必ずクリアしてください。
  3. マルチスレッド環境では、Thread Local を慎重に使用してください。潜在的なリスクと制限を理解することが重要です。コードを徹底的にテストして、特定の環境でThread Local が期待どおりに動作することを確認してください。

結論

Java Thread Local は、開発者が特定のスレッドに対してのみ変数を作成できるようにする優れたツールです。Thread Localを使用すると、ユーザー認証情報、データベース接続、その他のスレッド固有の情報など、スレッド固有のデータを保存できます。Thread Local は強力なツールですが、潜在的な問題を避けるために正しく使用することが重要です。ベスト プラクティスに従ってコードをテストすることで、コードを効果的に使用して Java アプリケーションのパフォーマンスと信頼性を向上させることができます。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION