Java 陣列中尋找元素的三種方法
來源:
Asyncq 這篇文章將幫助您更好地理解在 Java 中搜尋數組中的元素的不同方法。 在一組值中尋找特定元素是軟體開發中非常常見且經常使用的操作。解決這個問題有不同的方法,從簡單到最佳化。讓我們看看它們。
輸入資料
輸入數組包含原始 id 數據,我們需要知道它是否包含 id->3。
int[] ids = { 1,2,13,14,15,3,10,11,12,4,5,6,7,8,9 };
int inputId = 3;
方法一(簡單)
- 我們訪問數組的所有元素,一次一個元素。
- 此外,我們也會追蹤目標元素的狀態(如果它存在於陣列中)。
- 一旦找到這個元素,我們就將狀態從false切換為true。
- 循環完成後,我們返回狀態標誌。
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
- 我們可以使用包含預設情況下在清單中尋找目標元素的方法的ArrayList 。
- 由於此方法是由List提供的,因此我們需要將原始陣列轉換為列表。
- 我們可以使用單一 lambda 字串將基元轉換為物件類型並從中建立一個清單。
return Arrays.asList(Arrays.stream(ids).boxed().toArray())
.contains(inputId);
- 我們可以使用 Java 8 Stream API 來讓我們的程式碼更加實用且更短。
- 要了解 Stream API 如何與流配合使用,我們需要將輸入陣列轉換為流。
- Arrays.stream會取得輸入陣列並將其轉換為流。
- 現在我們有了線程,我們可以使用許多有用的方法,其中之一是anyMatch。它傳回與謂詞相符的元素(id == inputId)。
- 所有這些使我們的程式碼更短且更易於閱讀。
return Arrays.stream(ids)
.anyMatch(id -> id == inputId);
方法3(優化)
是的,上面顯示的程式碼有效且易於閱讀,但我們仍然需要存取並比較流中的每個元素。
- 如果記憶體不是問題並且我們想要優化計算,那麼我們在這裡可以做的一件事就是從輸入數組創建一個集合。
- 我們可以再次使用函數式程式碼將原始陣列轉換為Set。
- 現在我們有了一個 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 應用程式中有效地使用它。 Java
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時需要記住的一些準則:
- 僅在必要時使用Thread Local:僅適用於線程特定的資料。如果資料不是特定於線程的,則必須以其他方式儲存。
- 避免過多的記憶體使用:如果不小心使用,Thread Local可能會消耗大量記憶體。請務必在不再需要線程局部變數時清除它們,以避免過多的記憶體使用。
- 在多執行緒環境中謹慎使用Thread Local :了解潛在風險和限制非常重要。請務必徹底測試您的程式碼,以確保Thread Local在您的特定環境中按預期工作。
結論
Java
Thread Local是一個很棒的工具,它允許開發人員僅為特定執行緒建立變數。使用
Thread Local,您可以儲存特定於執行緒的數據,例如使用者身份驗證資訊、資料庫連接或其他特定於執行緒的資訊。儘管
Thread Local可以是一個強大的工具,但正確使用它以避免潛在的問題也很重要。透過遵循最佳實踐並測試您的程式碼,您可以有效地使用它來提高 Java 應用程式的效能和可靠性。
GO TO FULL VERSION