如何高效地判断数组中是否包含某特定值
检查数组中是否包含特定值的三种不同方法
1.定义方法
//使用list
static boolean userlist(String[] arr, String targetvalue) {
return Arrays.asList(arr).contains(targetvalue);
}
//使用set
static boolean useSet(String[] arr, String targetString) {
Set<String> set = new HashSet<>(Arrays.asList(arr));
return set.contains(targetString);
}
//for循环
static boolean userLoop(String[] arr, String targetString) {
for (String s : arr) {
if (s.equals(targetString)) {
return true;
}
}
return false;
}
2.测试
// 10k
@Test
public void testColl() {
String[] arr = { "CD", "BC", "EF", "DE", "AB" };
// use list
long startTime = System.nanoTime();
for (int i = 0; i < 100000; i++) {
userlist(arr, "AA");
}
long endTime = System.nanoTime();
long time = (endTime - startTime) / 1000000;
System.out.println("userList:" + time);
// use set
startTime = System.nanoTime();
for (int i = 0; i < 100000; i++) {
useSet(arr, "AA");
}
endTime = System.nanoTime();
time = (endTime - startTime) / 1000000;
System.out.println("useSet:" + time);
// userLoop
startTime = System.nanoTime();
for (int i = 0; i < 100000; i++) {
userLoop(arr, "AA");
}
endTime = System.nanoTime();
time = (endTime - startTime) / 1000000;
System.out.println("userLoop:" + time);
}
测试结果:
userList:4
useSet:27
userLoop:3
3.对长度为1k的数组 测试
@Test
public void testColl() {
String[] arr = new String[1000];
Random s = new Random();
for (int i = 0; i < 1000; i++) {
arr[i] = String.valueOf(s.nextInt());
}
// use list
long startTime = System.nanoTime();
for (int i = 0; i < 100000; i++) {
userlist(arr, "AA");
}
long endTime = System.nanoTime();
long time = (endTime - startTime) / 1000000;
System.out.println("userList:" + time);
// use set
startTime = System.nanoTime();
for (int i = 0; i < 100000; i++) {
useSet(arr, "AA");
}
endTime = System.nanoTime();
time = (endTime - startTime) / 1000000;
System.out.println("useSet:" + time);
// userLoop
startTime = System.nanoTime();
for (int i = 0; i < 100000; i++) {
userLoop(arr, "AA");
}
endTime = System.nanoTime();
time = (endTime - startTime) / 1000000;
System.out.println("userLoop:" + time);
}
结果:
userList:85
useSet:1497
userLoop:70
结论:很明显,使用简单循环的方法比使用其他任何集合效率更高。许多开发者会使用第一种方法,但是它并不是高效的。将数组压入Collection类型中,需要首先将数组元素遍历一遍,然后再使用集合类做其他操作。