JavaRush /Java 博客 /Random-ZH /喝咖啡休息#221。在 Java 数组中查找元素的三种方法。什么是 Java 本地线程以及如何使用它

喝咖啡休息#221。在 Java 数组中查找元素的三种方法。什么是 Java 本地线程以及如何使用它

已在 Random-ZH 群组中发布

Java 数组中查找元素的三种方法

来源:Asyncq 这篇文章将帮助您更好地理解在 Java 中搜索数组中的元素的不同方法。 喝咖啡休息#221。 在 Java 数组中查找元素的三种方法。 什么是 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. 我们访问数组的所有元素,一次一个元素。
  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. 我们可以使用单个 lambda 字符串将基元转换为对象类型并从中创建一个列表。
    return Arrays.asList(Arrays.stream(ids).boxed().toArray())
                  .contains(inputId);
  4. 我们可以使用 Java 8 Stream API 来使我们的代码更加实用并且更短。
  5. 要了解 Stream API 如何与流配合使用,我们需要将输入数组转换为流。
  6. Arrays.stream获取输入数组并将其转换为流。
  7. 现在我们有了线程,我们可以使用许多有用的方法,其中之一是anyMatch。它返回与谓词匹配的元素(id == inputId)
  8. 所有这些使我们的代码更短且更易于阅读。
    return Arrays.stream(ids)
              .anyMatch(id -> id == inputId);

方法3(优化)

是的,上面显示的代码有效并且易于阅读,但我们仍然需要访问并比较流中的每个元素。
  1. 如果内存不是问题并且我们想要优化计算,那么我们在这里可以做的一件事就是从输入数组创建一个集合。
  2. 我们可以再次使用函数式代码将原始数组转换为Set
  3. 现在我们有了一个 Set,我们可以在一段固定的时间内搜索一个元素。
S
et<Integer> idsSet = Arrays.stream(ids).boxed().collect(Collectors.toSet());
return idsSet.contains(inputId);

奖金

搜索单个元素可以被视为常见操作,但更常见的是搜索数组中的多个元素。在这种情况下,如果我们不使用Set,我们将有两个循环,并且时间复杂度将增加以乘以两个集合的长度。下面是一个示例,其中我们将其中一个数组转换为集合,然后迭代另一个数组并在集合操作中执行搜索。通过这样做,我们增加了内存,同时节省了计算量。
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 本地线程以及如何使用它

来源:Medium 在本文中,我们将了解 Java Thread Local以及如何在 Java 应用程序中有效地使用它。 喝咖啡休息#221。 在 Java 数组中查找元素的三种方法。 什么是 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();
  }
}
在此示例中,我们创建了一个名为threadLocal的String类型的线程本地对象。我们还创建了两个方法:set()get(),它们允许我们存储和检索线程局部变量的值。要将值存储在线程局部变量中,我们只需调用set()方法并传入我们想要存储的值。例如,我们可以调用MyThreadLocalClass.set("Hello, World!")来存储字符串“Hello, World!” 线程局部变量中。要获取线程局部变量的值,我们只需调用get()方法。例如,我们可以调用String value = MyThreadLocalClass.get()来获取线程局部变量的值。

使用 Thread Local 的建议

尽管Thread Local可以成为 Java 应用程序中的强大工具,但正确使用它以避免潜在问题也很重要。以下是使用Thread Local时需要记住的一些准则:
  1. 仅在必要时使用Thread Local:仅适用于线程特定的数据。如果数据不是特定于线程的,则必须以其他方式存储。
  2. 避免过多的内存使用:如果不小心使用,Thread Local可能会消耗大量内存。请务必在不再需要线程局部变量时清除它们,以避免过多的内存使用。
  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