如何高效地判断数组中是否包含某特定值

本文通过实验对比了三种在数组中查找特定值的方法:使用List、使用Set和使用for循环的效率。结果显示,在小规模数据集上,for循环方法效率最高,而在大规模数据集上,尽管Set方法的效率低于for循环,但仍然优于使用List的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何高效地判断数组中是否包含某特定值

检查数组中是否包含特定值的三种不同方法

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类型中,需要首先将数组元素遍历一遍,然后再使用集合类做其他操作。

 

 

 

### 如何在SQL中判断数组是否包含定值 在SQL中,直接操作数组类型的字段并检查其是否包含某个定值,通常需要依赖数据库的具体实现。以下是一些常见数据库系统中的方法: #### PostgreSQL PostgreSQL 支持数组类型,并提供了丰富的函数和操作符来处理数组。可以使用 `@>` 操作符来检查一个数组是否包含另一个数组定值[^4]。 ```sql SELECT array_column @> ARRAY[specific_value]::integer[] FROM table_name WHERE id = some_id; ``` 此查询会返回 `true` 或 `false`,具体取决于 `array_column` 是否包含 `specific_value`。 #### MySQL MySQL 不支持数组类型,但可以通过字符串模拟数组(例如使用逗号分隔的字符串)。在这种情况下,可以使用 `FIND_IN_SET` 函数来检查某个值是否存在于字符串中[^5]。 ```sql SELECT FIND_IN_SET(specific_value, string_column) > 0 AS contains_value FROM table_name WHERE id = some_id; ``` 如果 `string_column` 是类似 `'1,2,3'` 的字符串,且 `specific_value` 是 `2`,那么结果将为 `true`。 #### SQL Server SQL Server 不直接支持数组类型,但可以使用表值构造器或 XML/JSON 数据类型来模拟数组。对于简单的检查,可以使用 `LIKE` 操作符结合通配符[^6]。 ```sql SELECT CASE WHEN string_column LIKE '%,' + CAST(specific_value AS VARCHAR) + ',%' OR string_column LIKE specific_value + ',%' OR string_column LIKE '%,' + CAST(specific_value AS VARCHAR) OR string_column = CAST(specific_value AS VARCHAR) THEN 1 ELSE 0 END AS contains_value FROM table_name WHERE id = some_id; ``` #### Oracle Oracle 不直接支持数组类型,但可以通过嵌套表或变长数组(VARRAY)来实现类似功能。可以使用 `MEMBER OF` 操作符来检查某个值是否属于嵌套表[^7]。 ```sql SELECT CASE WHEN specific_value MEMBER OF array_column THEN 1 ELSE 0 END AS contains_value FROM table_name WHERE id = some_id; ``` ### 注意事项 - 在设计数据库时,尽量避免使用数组或字符串模拟数组。这种设计可能导致性能问题和复杂性增加。 - 如果可能,考虑将数组拆分为单独的行存储在关联表中,这样可以更高效地进行查询和索引。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值