JavaRush /Blog Java /Random-ES /Pausa para el café #221. Tres formas de encontrar un elem...

Pausa para el café #221. Tres formas de encontrar un elemento en una matriz Java. ¿Qué es Java Thread Local y cómo usarlo?

Publicado en el grupo Random-ES

Tres formas de encontrar un elemento en una matriz Java

Fuente: Asyncq Esta publicación lo ayudará a comprender mejor las diferentes formas de buscar un elemento en una matriz en Java. Pausa para el café #221.  Tres formas de encontrar un elemento en una matriz Java.  ¿Qué es Java Thread Local y cómo usarlo? - 1Encontrar un elemento específico en un conjunto de valores es una operación muy común y utilizada con frecuencia en el desarrollo de software. Existen diferentes enfoques para resolver este problema, desde simples hasta optimizados. Mirémoslos.

Datos de entrada

La matriz de entrada contiene datos de identificación primitivos y necesitamos saber si contiene id->3.
int[] ids = { 1,2,13,14,15,3,10,11,12,4,5,6,7,8,9 };
int inputId = 3;

Método 1 (sencillo)

  1. Visitamos todos los elementos del array, un elemento a la vez.
  2. Además, realizamos un seguimiento del estado del elemento de destino si existe en la matriz.
  3. Tan pronto como encontramos este elemento, cambiamos el estado de falso a verdadero .
  4. Una vez que se completa el ciclo, devolvemos el indicador de estado.
boolean valExist = false;
for (int id : ids) {
   if (inputId == id) {
             valExist = true;
   }
}
return valExist;
Esta solución funciona, pero no es muy eficiente. Si observa la condición if , se dará cuenta de que estamos probando esta condición para todos los elementos. Digamos que el elemento que estamos buscando es el primer elemento, pero nuestro bucle seguirá ejecutándose para todos los elementos. Aquí sería más prudente salir del bucle tan pronto como encontremos el elemento. Haciendo esto nos ahorraríamos en cálculos cuando el elemento que buscamos no esté en la última posición.
boolean valExist = false;
for (int id : ids) {
    if (inputId == id) {
                valExist = true;
                break;
     }
}
return valExist;
Puedes hacer que tu código sea aún más conciso usando return . Podemos devolver verdadero tan pronto como veamos el elemento que estamos buscando; de lo contrario, devolvemos falso tan pronto como se complete el ciclo. Y no necesitamos crear y mantener una variable de estado.
for (int id : ids) {
      if (inputId == id) {
                return true;
       }
  }
  return false;

Método 2

  1. Podemos usar un ArrayList que contenga un método que de forma predeterminada busque el elemento de destino en la lista.
  2. Dado que List proporciona este método , necesitamos convertir nuestra matriz primitiva en una lista.
  3. Podemos usar una única cadena lambda que convierte una primitiva en un tipo de objeto y crea una lista a partir de ella.
    return Arrays.asList(Arrays.stream(ids).boxed().toArray())
                  .contains(inputId);
  4. Podemos usar Java 8 Stream API para hacer que nuestro código sea funcional y mucho más corto.
  5. Para comprender cómo funcionan las API de Stream con las transmisiones, necesitamos convertir nuestra matriz de entrada en una secuencia.
  6. Arrays.stream toma la matriz de entrada y la convierte en secuencias.
  7. Ahora que tenemos hilos, podemos usar muchos métodos útiles, uno de los cuales es anyMatch . Devuelve el elemento que coincide con el predicado (id == inputId) .
  8. Todo esto hace que nuestro código sea mucho más corto y fácil de leer.
    return Arrays.stream(ids)
              .anyMatch(id -> id == inputId);

Método 3 (optimizado)

Sí, el código que se muestra arriba funciona y es fácil de leer, pero aún debemos visitar y comparar cada elemento de la secuencia.
  1. Si la memoria no es un problema y queremos optimizar los cálculos, entonces una de las cosas que podemos hacer aquí es crear un conjunto a partir de la matriz de entrada.
  2. Podemos usar nuevamente código de estilo funcional para convertir la matriz primitiva en un Set .
  3. Ahora que tenemos un Set , podemos buscar un elemento durante un período de tiempo constante.
S
et<Integer> idsSet = Arrays.stream(ids).boxed().collect(Collectors.toSet());
return idsSet.contains(inputId);

Prima

La búsqueda de un solo elemento puede considerarse una operación común, pero lo más común es buscar varios elementos en una matriz. En este caso, si no usamos Set , tendremos dos bucles y la complejidad del tiempo aumentará para multiplicar la longitud de las dos colecciones. A continuación se muestra un ejemplo en el que convertimos una de las matrices como un conjunto y luego iteramos sobre la otra matriz y realizamos una búsqueda en la operación del conjunto. Al hacer esto, aumentamos la memoria y al mismo tiempo ahorramos en cálculos.
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();

¿Qué es Java Thread Local y cómo usarlo?

Fuente: Medio En este artículo, veremos Java Thread Local y cómo usarlo de manera efectiva en sus aplicaciones Java. Pausa para el café #221.  Tres formas de encontrar un elemento en una matriz Java.  ¿Qué es Java Thread Local y cómo usarlo? - 2Java Thread Local es una característica poderosa que permite a los desarrolladores crear variables solo para un hilo específico. Esto significa que cada hilo puede tener su propia copia de una variable y los cambios realizados a una variable en un hilo no afectarán su valor en otro hilo.

¿Qué es el hilo local?

Thread Local es una clase en la API de Java que le permite crear variables locales para un hilo específico. Es decir, cada hilo tiene su propia copia de la variable y los cambios realizados a una variable en un hilo no afectan su valor en otro hilo. Esto convierte a Thread Local en una solución ideal para almacenar datos específicos de subprocesos, como información de autenticación de usuarios, conexiones de bases de datos o cualquier otra información específica de subprocesos.

Cómo funciona Thread Local en Java

Para utilizar Thread Local en su aplicación Java, primero debe crear una instancia de la clase Thread Local . Esto se puede hacer llamando al constructor ThreadLocal , que creará una nueva instancia de esta clase. A continuación, al crear un objeto Thread Local , puede usarlo para almacenar y recuperar datos específicos del hilo. A continuación se muestra un ejemplo de cómo utilizar Thread Local en su aplicación Java:
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();
  }
}
En este ejemplo, creamos un objeto Thread Local llamado threadLocal de tipo String . También creamos dos métodos: set() y get() que nos permiten almacenar y recuperar el valor de la variable Thread Local . Para almacenar un valor en una variable Thread Local , simplemente llamamos al método set() y pasamos el valor que queremos almacenar. Por ejemplo, podemos llamar a MyThreadLocalClass.set("¡Hola, mundo!") para almacenar la cadena "¡Hola, mundo!" en la variable Thread Local . Para obtener el valor de la variable Thread Local , simplemente llamamos al método get() . Por ejemplo, podemos llamar a String value = MyThreadLocalClass.get() para obtener el valor de la variable Thread Local .

Recomendaciones para trabajar con Thread Local

Aunque Thread Local puede ser una herramienta poderosa en sus aplicaciones Java, es importante utilizarla correctamente para evitar posibles problemas. Aquí hay algunas pautas a tener en cuenta al usar Thread Local :
  1. Utilice Thread Local solo cuando sea necesario: solo para datos específicos de subprocesos. Si los datos no son específicos de un hilo, deben almacenarse de otra manera.
  2. Evite el uso excesivo de memoria: Thread Local puede consumir una cantidad significativa de memoria si no se usa con cuidado. Asegúrese de borrar las variables de Thread Local cuando ya no sean necesarias para evitar el uso excesivo de memoria.
  3. Utilice Thread Local con precaución en entornos de subprocesos múltiples: es importante comprender los riesgos y limitaciones potenciales. Asegúrese de probar su código minuciosamente para asegurarse de que Thread Local funcione como se espera en su entorno específico.

Conclusión

Java Thread Local es una gran herramienta que permite a los desarrolladores crear variables solo para un hilo específico. Con Thread Local , puede almacenar datos específicos de subprocesos, como información de autenticación de usuario, conexiones de bases de datos u otra información específica de subprocesos. Aunque Thread Local puede ser una herramienta poderosa, es importante utilizarla correctamente para evitar posibles problemas. Si sigue las mejores prácticas y prueba su código, podrá utilizarlo de manera efectiva para mejorar el rendimiento y la confiabilidad de sus aplicaciones Java.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION