java中实用类Collections和数据库BETWEEN、IN和LIKE范围查询

博客介绍了Java集合相关内容,如用Collections的unmodifiableXXX()方法获取不可修改集合视图,还给出解决集合并发问题的多种措施。同时阐述数据库范围查询,包括IN操作符注意事项、LIKE操作符通配符使用及索引执行情况,不以%开头的LIKE查询会用索引。

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

  1. Collections的unmodifiableXXX()方法
    如果集合中不允许修改,可以用Collections的unmodifiableXXX()方法来获取原始集合的一个集合视图,程序可以读取集合视图中的内容,但不允许修改它
        Set<String> originalSet = new HashSet<String>();
	    originalSet.add("Tom");
	    originalSet.add("Mike");
	    
	    Set<String> setView = Collections.unmodifiableSet(originalSet);
	    originalSet.add("Linda");
	    System.out.println(Arrays.toString(setView.toArray()));
	    setView.add("Mary");//抛出unsupportedOperationException

以上代码输出的结果会抛出unsupportedOperationException

  1. 线程安全的集合
    在java集合框架中,set、List、Queue和Map的实现类(比如:HashList、Arraylist、ArrayDequeue和HashMap等)都没有采取同步机制,为了避免并发问题可以采取以下几种解决措施:
    (1)在程序中对可能导致并发问题的代码块进行同步。
    (2)利用Collections的synchronizedXXX()方法获取原始集合的同步版本
    Collection synchronizedCollection = Collections.synchronizedCollection(originalCollection);
    (3)如果集合只包含单个元素并且不允许被修改,可以用Collections的singletonXXX()方法来构造这样的集合,这可以避免集合被线程错误的修改,而且由于不必采取同步机制,可以提高并发的性能。
    (4)如果集合中的元素不被修改,可以使用Collections的unmodifiableXXX()方法来生成原始的集合视图,让线程只访问这个集合视图,这可以避免集合被线程错误的修改,而且由于不必采取同步机制,可以提高并发的性能。
    (5)利用Collections的synchronizedXXX()方法来获得原始集合的同步版本后,如果一个线程操纵集合的同步版本,而另一个线程操纵原始集合,那么任然会导致并发问题。为了避免这种情况,可以直接采用java.util.concurrent并发包提供的线程安全的集合。例如:concurrentHashMap、concurrentSkipListMap、concurrntSkipListSet和ConcurrentLinkedQueue。这些集合的底层实现采用的复杂的算法,保证多线程访问集合时,既能保证多线程的同步,又具有高效的并发性能。

  2. 数据库BETWEEN、IN和LIKE范围查询

(1)使用IN操作符进行范围查询
对于NOT IN查询,必须注意到如果范围列表中包含NULL值,那么所有的行都会被计算为FALSE或UNKNOWN,特别是在范围到列表是由子查询返回后的结果集例如:
SELECT empno,ename,job,sal FROM emp WHERE job NOT IN (‘职员’,‘分析员’,‘销售人员’,NULL);
得到的结果未选定行
(2)LIKE操作符
“%”通配符,可以匹配一个或多个字符;
“-”通配符可以匹配单一字符
如果查询字符串中本身有包含通配符,可以使用ESCAPE子句来创建转义字符,比如要查询table-name中包含“-”字符的表名称,则可以使用ESCAPE子句,如下面的查询:
SELECT table_name AS 表名,status AS 状态 FROM user_tables WHERE table_name LIKE ‘%%’ ESCAPE ‘’;
提问:
%%中哪种会执行索引?
EXPLAIN SELECT * FROM user WHERE username LIKE 'ptd
%’;用到了索引
EXPLAIN SELECT * FROM user WHERE username LIKE ‘%ptd_’;没有用到索引
综上:不以%开头的时候,才会使用到索引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值