JavaRush /Java Blog /Random-KO /커피 브레이크 #221. Java 배열에서 요소를 찾는 세 가지 방법입니다. Java Thread Lo...

커피 브레이크 #221. Java 배열에서 요소를 찾는 세 가지 방법입니다. Java Thread Local이란 무엇이며 어떻게 사용하나요?

Random-KO 그룹에 게시되었습니다

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(간단)

  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. 이제 스레드가 있으므로 많은 유용한 메서드를 사용할 수 있으며 그 중 하나는 anyMatch 입니다 . 조건자 (id == inputId) 와 일치하는 요소를 반환합니다 .
  8. 이 모든 것이 우리의 코드를 훨씬 더 짧고 읽기 쉽게 만듭니다.
    return Arrays.stream(ids)
              .anyMatch(id -> id == inputId);

방법 3(최적화)

예, 위에 표시된 코드는 작동하고 읽기 쉽지만 여전히 스트림의 각 요소를 방문하고 비교해야 합니다.
  1. 메모리가 문제가 되지 않고 계산을 최적화하려는 경우 여기서 할 수 있는 작업 중 하나는 입력 배열에서 세트를 만드는 것입니다.
  2. 다시 기능적 스타일 코드를 사용하여 기본 배열을 Set 으로 변환할 수 있습니다 .
  3. 이제 Set 이 있으므로 일정한 기간 동안 요소를 검색할 수 있습니다.
에스
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 Thread Local이란 무엇이며 어떻게 사용하나요?

출처: Medium 이 기사에서는 Java Thread Local 과 이를 Java 애플리케이션에서 효과적으로 사용하는 방법을 살펴보겠습니다 . 커피 브레이크 #221.  Java 배열에서 요소를 찾는 세 가지 방법입니다.  Java Thread Local이란 무엇이며 어떻게 사용하나요? - 2Java 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 이라는 스레드 로컬 개체를 만들었습니다 . 또한 스레드 로컬 변수 의 값을 저장하고 검색할 수 있는 두 가지 메서드인 set()get()을 만들었습니다 . 스레드 로컬 변수 에 값을 저장하려면 간단히 set() 메서드를 호출 하고 저장하려는 값을 전달하면 됩니다. 예를 들어 MyThreadLocalClass.set("Hello, World!")를 호출하여 "Hello, World!" 라는 문자열을 저장할 수 있습니다. 스레드 로컬 변수 에서 . Thread Local 변수 의 값을 얻으려면 간단히 get() 메소드를 호출하면 됩니다 . 예를 들어 String value = MyThreadLocalClass.get()을 호출하여 Thread Local 변수 의 값을 가져올 수 있습니다 .

스레드 로컬 작업에 대한 권장 사항

Thread Local은 Java 애플리케이션의 강력한 도구일 수 있지만 잠재적인 문제를 방지하려면 이를 올바르게 사용하는 것이 중요합니다. Thread Local을 사용할 때 명심해야 할 몇 가지 지침은 다음과 같습니다 .
  1. Thread Local은 필요한 경우에만 사용하세요 . ​​스레드 관련 데이터에만 사용하세요. 데이터가 스레드별 데이터가 아닌 경우 다른 방식으로 저장해야 합니다.
  2. 과도한 메모리 사용 방지: 스레드 로컬은 주의해서 사용하지 않으면 상당한 양의 메모리를 소비할 수 있습니다. 과도한 메모리 사용을 방지하려면 더 이상 필요하지 않은 스레드 로컬 변수를 지워야 합니다.
  3. 다중 스레드 환경에서는 스레드 로컬을 주의해서 사용하십시오 . 잠재적인 위험과 제한 사항을 이해하는 것이 중요합니다. 스레드 로컬이 특정 환경에서 예상대로 작동하는지 확인하려면 코드를 철저히 테스트하십시오 .

결론

Java Thread Local은 개발자가 특정 스레드에 대해서만 변수를 생성할 수 있는 훌륭한 도구입니다. Thread Local을 사용하면 사용자 인증 정보, 데이터베이스 연결 또는 기타 스레드 관련 정보와 같은 스레드 관련 데이터를 저장할 수 있습니다. Thread Local은 강력한 도구일 수 있지만 잠재적인 문제를 방지하려면 올바르게 사용하는 것이 중요합니다. 모범 사례를 따르고 코드를 테스트하면 코드를 효과적으로 사용하여 Java 애플리케이션의 성능과 안정성을 향상시킬 수 있습니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION